From ff889c0e651e2685d60eb201620de05d3650274a Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 14 Jan 2013 22:59:08 +0100 Subject: [PATCH] use attrib pointers in nativeVertexFormat --- .../Core/VideoCommon/Src/VertexShaderGen.cpp | 14 ++++---- Source/Core/VideoCommon/Src/VertexShaderGen.h | 21 +++++++++--- .../Src/NativeVertexFormat.cpp | 33 +++++++------------ .../Src/ProgramShaderCache.cpp | 12 ++++++- .../Plugin_VideoOGL/Src/RasterFont.cpp | 4 +-- .../Plugin_VideoOGL/Src/TextureCache.cpp | 4 +-- .../Plugin_VideoOGL/Src/TextureConverter.cpp | 4 +-- 7 files changed, 51 insertions(+), 41 deletions(-) diff --git a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp index 9c4d717c84..260d2de5e5 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp @@ -229,24 +229,25 @@ const char *GenerateVertexShaderCode(u32 components, API_TYPE ApiType) if(ApiType == API_OPENGL) { - if (components & VB_HAS_NRM0) - WRITE(p, " float3 rawnorm0 = gl_Normal; // NORMAL0,\n"); - + WRITE(p, "ATTRIN float4 rawpos; // ATTR%d,\n", SHADER_POSITION_ATTRIB); if (components & VB_HAS_POSMTXIDX) WRITE(p, "ATTRIN float fposmtx; // ATTR%d,\n", SHADER_POSMTX_ATTRIB); + if (components & VB_HAS_NRM0) + WRITE(p, "ATTRIN float3 rawnorm0; // ATTR%d,\n", SHADER_NORM0_ATTRIB); if (components & VB_HAS_NRM1) WRITE(p, "ATTRIN float3 rawnorm1; // ATTR%d,\n", SHADER_NORM1_ATTRIB); if (components & VB_HAS_NRM2) WRITE(p, "ATTRIN float3 rawnorm2; // ATTR%d,\n", SHADER_NORM2_ATTRIB); if (components & VB_HAS_COL0) - WRITE(p, " float4 color0 = gl_Color; // COLOR0,\n"); + WRITE(p, "ATTRIN float4 color0; // ATTR%d,\n", SHADER_COLOR0_ATTRIB); if (components & VB_HAS_COL1) - WRITE(p, " float4 color1 = gl_SecondaryColor; // COLOR1,\n"); + WRITE(p, "ATTRIN float4 color1; // ATTR%d,\n", SHADER_COLOR1_ATTRIB); + for (int i = 0; i < 8; ++i) { u32 hastexmtx = (components & (VB_HAS_TEXMTXIDX0<m_index_buffers); glBindBuffer(GL_ARRAY_BUFFER, vm->m_vertex_buffers); - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, vtx_decl.stride, (u8*)NULL); + glEnableVertexAttribArray(SHADER_POSITION_ATTRIB); + glVertexAttribPointer(SHADER_POSITION_ATTRIB, 3, GL_FLOAT, GL_FALSE, vtx_decl.stride, (u8*)NULL); - if (vtx_decl.num_normals >= 1) { - glEnableClientState(GL_NORMAL_ARRAY); - glNormalPointer(VarToGL(vtx_decl.normal_gl_type), vtx_decl.stride, (u8*)NULL + vtx_decl.normal_offset[0]); - if (vtx_decl.num_normals == 3) { - glEnableVertexAttribArray(SHADER_NORM1_ATTRIB); - glEnableVertexAttribArray(SHADER_NORM2_ATTRIB); - glVertexAttribPointer(SHADER_NORM1_ATTRIB, vtx_decl.normal_gl_size, VarToGL(vtx_decl.normal_gl_type), GL_TRUE, vtx_decl.stride, (u8*)NULL + vtx_decl.normal_offset[1]); - glVertexAttribPointer(SHADER_NORM2_ATTRIB, vtx_decl.normal_gl_size, VarToGL(vtx_decl.normal_gl_type), GL_TRUE, vtx_decl.stride, (u8*)NULL + vtx_decl.normal_offset[2]); + for (int i = 0; i < 3; i++) { + if (vtx_decl.num_normals > i) { + glEnableVertexAttribArray(SHADER_NORM0_ATTRIB+i); + glVertexAttribPointer(SHADER_NORM0_ATTRIB+i, vtx_decl.normal_gl_size, VarToGL(vtx_decl.normal_gl_type), GL_TRUE, vtx_decl.stride, (u8*)NULL + vtx_decl.normal_offset[i]); } } for (int i = 0; i < 2; i++) { if (vtx_decl.color_offset[i] != -1) { - if (i == 0) { - glEnableClientState(GL_COLOR_ARRAY); - glColorPointer(4, GL_UNSIGNED_BYTE, vtx_decl.stride, (u8*)NULL + vtx_decl.color_offset[i]); - } else { - glEnableClientState(GL_SECONDARY_COLOR_ARRAY); - glSecondaryColorPointer(4, GL_UNSIGNED_BYTE, vtx_decl.stride, (u8*)NULL + vtx_decl.color_offset[i]); - } + glEnableVertexAttribArray(SHADER_COLOR0_ATTRIB+i); + glVertexAttribPointer(SHADER_COLOR0_ATTRIB+i, 4, GL_UNSIGNED_BYTE, GL_TRUE, vtx_decl.stride, (u8*)NULL + vtx_decl.color_offset[i]); } } for (int i = 0; i < 8; i++) { if (vtx_decl.texcoord_offset[i] != -1) { - int id = GL_TEXTURE0 + i; - glClientActiveTexture(id); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(vtx_decl.texcoord_size[i], VarToGL(vtx_decl.texcoord_gl_type[i]), - vtx_decl.stride, (u8*)NULL + vtx_decl.texcoord_offset[i]); + glEnableVertexAttribArray(SHADER_TEXTURE0_ATTRIB+i); + glVertexAttribPointer(SHADER_TEXTURE0_ATTRIB+i, vtx_decl.texcoord_size[i], VarToGL(vtx_decl.texcoord_gl_type[i]), + GL_FALSE, vtx_decl.stride, (u8*)NULL + vtx_decl.texcoord_offset[i]); } } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 4a2fc131a7..99997b1aa6 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -111,11 +111,21 @@ void ProgramShaderCache::SetProgramBindings ( ProgramShaderCache::PCacheEntry& e // Need to set some attribute locations glBindAttribLocation(entry.prog_id, SHADER_POSITION_ATTRIB, "rawpos"); + glBindAttribLocation(entry.prog_id, SHADER_POSMTX_ATTRIB, "fposmtx"); - glBindAttribLocation(entry.prog_id, SHADER_TEXTURE0_ATTRIB, "texture0"); + glBindAttribLocation(entry.prog_id, SHADER_COLOR0_ATTRIB, "color0"); + glBindAttribLocation(entry.prog_id, SHADER_COLOR1_ATTRIB, "color1"); + + glBindAttribLocation(entry.prog_id, SHADER_NORM0_ATTRIB, "rawnorm0"); glBindAttribLocation(entry.prog_id, SHADER_NORM1_ATTRIB, "rawnorm1"); glBindAttribLocation(entry.prog_id, SHADER_NORM2_ATTRIB, "rawnorm2"); + + for(int i=0; i<8; i++) { + char attrib_name[8]; + snprintf(attrib_name, 8, "tex%d", i); + glBindAttribLocation(entry.prog_id, SHADER_TEXTURE0_ATTRIB+i, attrib_name); + } } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp b/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp index beac56148f..2bc7af06d5 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp @@ -132,11 +132,11 @@ static const char *s_vertexShaderSrc = "#version 130\n" "uniform vec2 charSize;\n" "in vec2 rawpos;\n" - "in vec2 texture0;\n" + "in vec2 tex0;\n" "out vec2 uv0;\n" "void main(void) {\n" " gl_Position = vec4(rawpos,0,1);\n" - " uv0 = texture0 * charSize;\n" + " uv0 = tex0 * charSize;\n" "}\n"; static const char *s_fragmentShaderSrc = diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp index 390354ebd0..5fc7395708 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp @@ -528,11 +528,11 @@ TextureCache::TextureCache() const char *VProgram = "#version 130\n" "in vec2 rawpos;\n" - "in vec2 texture0;\n" + "in vec2 tex0;\n" "out vec2 uv0;\n" "void main()\n" "{\n" - " uv0 = texture0;\n" + " uv0 = tex0;\n" " gl_Position = vec4(rawpos,0,1);\n" "}\n"; if (!VertexShaderCache::CompileVertexShader(s_vProgram, VProgram)) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp index ac88cceca4..7e619a3855 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp @@ -115,11 +115,11 @@ void CreatePrograms() const char *VProgram = "#version 130\n" "in vec2 rawpos;\n" - "in vec2 texture0;\n" + "in vec2 tex0;\n" "out vec2 uv0;\n" "void main()\n" "{\n" - " uv0 = texture0;\n" + " uv0 = tex0;\n" " gl_Position = vec4(rawpos,0,1);\n" "}\n"; if (!VertexShaderCache::CompileVertexShader(s_vProgram, VProgram))