diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index ac5af7e6c2..2cc6aff591 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -188,64 +188,67 @@ void GLGSRender::EnableVertexData(bool indexed_draw) GL_HALF_FLOAT, GL_UNSIGNED_BYTE, GL_SHORT, + GL_FLOAT, // Needs conversion GL_UNSIGNED_BYTE, }; static const bool gl_normalized[] = { - true, - false, - false, - true, - false, - false, + GL_TRUE, + GL_FALSE, + GL_FALSE, + GL_TRUE, + GL_FALSE, + GL_TRUE, + GL_FALSE, }; - if(m_vertex_data[i].type >= 1 && m_vertex_data[i].type <= 7) + if (m_vertex_data[i].type < 1 && m_vertex_data[i].type > 7) { + LOG_ERROR(RSX, "GLGSRender::EnableVertexData: Bad vertex data type (%d)!", m_vertex_data[i].type); + } + + if(!m_vertex_data[i].addr) { - if(!m_vertex_data[i].addr) + switch(m_vertex_data[i].type) { - switch(m_vertex_data[i].type) + case CELL_GCM_VERTEX_S32K: + case CELL_GCM_VERTEX_S1: + switch(m_vertex_data[i].size) { - case CELL_GCM_VERTEX_S32K: - case CELL_GCM_VERTEX_S1: - switch(m_vertex_data[i].size) - { - case 1: glVertexAttrib1s(i, (GLshort&)m_vertex_data[i].data[0]); break; - case 2: glVertexAttrib2sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; - case 3: glVertexAttrib3sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; - case 4: glVertexAttrib4sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; - } - break; - - case CELL_GCM_VERTEX_F: - switch(m_vertex_data[i].size) - { - case 1: glVertexAttrib1f(i, (GLfloat&)m_vertex_data[i].data[0]); break; - case 2: glVertexAttrib2fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; - case 3: glVertexAttrib3fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; - case 4: glVertexAttrib4fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; - } - break; - - case CELL_GCM_VERTEX_CMP: - case CELL_GCM_VERTEX_UB: - glVertexAttrib4ubv(i, (GLubyte*)&m_vertex_data[i].data[0]); - break; + case 1: glVertexAttrib1s(i, (GLshort&)m_vertex_data[i].data[0]); break; + case 2: glVertexAttrib2sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; + case 3: glVertexAttrib3sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; + case 4: glVertexAttrib4sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; } + break; - checkForGlError("glVertexAttrib"); - } - else - { - u32 gltype = gl_types[m_vertex_data[i].type - 1]; - bool normalized = gl_normalized[m_vertex_data[i].type - 1]; + case CELL_GCM_VERTEX_F: + switch(m_vertex_data[i].size) + { + case 1: glVertexAttrib1f(i, (GLfloat&)m_vertex_data[i].data[0]); break; + case 2: glVertexAttrib2fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; + case 3: glVertexAttrib3fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; + case 4: glVertexAttrib4fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; + } + break; - glEnableVertexAttribArray(i); - checkForGlError("glEnableVertexAttribArray"); - glVertexAttribPointer(i, m_vertex_data[i].size, gltype, normalized, 0, reinterpret_cast(offset_list[i])); - checkForGlError("glVertexAttribPointer"); + case CELL_GCM_VERTEX_CMP: + case CELL_GCM_VERTEX_UB: + glVertexAttrib4ubv(i, (GLubyte*)&m_vertex_data[i].data[0]); + break; } + + checkForGlError("glVertexAttrib"); + } + else + { + u32 gltype = gl_types[m_vertex_data[i].type - 1]; + bool normalized = gl_normalized[m_vertex_data[i].type - 1]; + + glEnableVertexAttribArray(i); + checkForGlError("glEnableVertexAttribArray"); + glVertexAttribPointer(i, m_vertex_data[i].size, gltype, normalized, 0, reinterpret_cast(offset_list[i])); + checkForGlError("glVertexAttribPointer"); } } } @@ -264,15 +267,15 @@ void GLGSRender::DisableVertexData() void GLGSRender::InitVertexData() { - GLfloat scaleOffsetMat[16] = {1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; int l; + GLfloat scaleOffsetMat[16] = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; - for(u32 i=0; ioffset; //LOG_WARNING(RSX,"fc%u[0x%x - 0x%x] = (%f, %f, %f, %f)", id, c.id, m_cur_shader_prog->offset, c.x, c.y, c.z, c.w); diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index ea267f5ad3..03a0f7b5bf 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -117,16 +117,18 @@ u32 RSXVertexData::GetTypeSize() { switch (type) { - case 1: return 2; - case 2: return 4; - case 3: return 2; - case 4: return 1; - case 5: return 2; - case 7: return 1; - } + case CELL_GCM_VERTEX_S1: return 2; + case CELL_GCM_VERTEX_F: return 4; + case CELL_GCM_VERTEX_SF: return 2; + case CELL_GCM_VERTEX_UB: return 1; + case CELL_GCM_VERTEX_S32K: return 2; + case CELL_GCM_VERTEX_CMP: return 4; + case CELL_GCM_VERTEX_UB256: return 1; - LOG_ERROR(RSX, "Bad vertex data type! %d", type); - return 1; + default: + LOG_ERROR(RSX, "RSXVertexData::GetTypeSize: Bad vertex data type (%d)!", type); + return 1; + } } #define CMD_DEBUG 0 diff --git a/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp b/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp index b1350270c9..1b65fdd5ea 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp @@ -101,15 +101,27 @@ s32 sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64 a4, u6 switch(package_id) { - case 0x001: // ? + case 0x001: // FIFO + break; + + case 0x100: // Display mode set break; - case 0x101: // ? + case 0x101: // Display sync + break; + + case 0x102: // Display flip + break; + + case 0x103: // ? break; case 0x104: // Display buffer break; + case 0x106: // ? (Used by cellGcmInitPerfMon) + break; + case 0x10a: // ? break; @@ -119,9 +131,19 @@ s32 sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64 a4, u6 case 0x301: // Depth-buffer (Z-cull) break; - default: + case 0x600: // Framebuffer setup break; + + case 0x601: // Framebuffer blit + break; + + case 0x602: // Framebuffer blit sync + break; + + default: + return CELL_EINVAL; } + return CELL_OK; } @@ -129,7 +151,7 @@ s32 sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64 a4, u6 * lv2 SysCall 675 (0x2A3): sys_rsx_device_map * @param a1 (OUT): For example: In vsh.self it is 0x60000000, global semaphore. For a game it is 0x40000000. * @param a2 (OUT): Unused? - * @param dev_id (IN): An immediate value and always 8. + * @param dev_id (IN): An immediate value and always 8. (cellGcmInitPerfMon uses 11, 10, 9, 7, 12 successively). */ s32 sys_rsx_device_map(mem32_t a1, mem32_t a2, u32 dev_id) {