From 9e681bb2ed1275b1a80a784a9d3d6bdfaac51d5d Mon Sep 17 00:00:00 2001 From: bkaradzic Date: Sat, 3 Nov 2012 13:12:26 -0700 Subject: [PATCH] Fixed vertex decl attribute size calculation. --- include/bgfx.h | 37 +++++++++-- src/bgfx.cpp | 59 ++++++++++++----- src/renderer_d3d11.cpp | 145 +++++++++++------------------------------ src/renderer_d3d9.cpp | 104 +++++++++-------------------- src/renderer_gl.cpp | 26 +++++++- tools/bin/shaderc.exe | Bin 1079296 -> 1079296 bytes tools/shaderc.cpp | 30 ++++++--- 7 files changed, 183 insertions(+), 218 deletions(-) diff --git a/include/bgfx.h b/include/bgfx.h index 7a4900299..c9b1d5383 100644 --- a/include/bgfx.h +++ b/include/bgfx.h @@ -85,6 +85,9 @@ | BGFX_STATE_MSAA \ ) +#define BGFX_STATE_ALPHA_REF(_ref) ( (uint64_t(_ref)<Format; - - switch (type) - { - case AttribType::Uint8: - if (normalized) - { - switch (num) - { - case 1: - format = DXGI_FORMAT_R8_UNORM; - break; - - case 2: - format = DXGI_FORMAT_R8G8_UNORM; - break; - - default: - case 4: - format = DXGI_FORMAT_R8G8B8A8_UNORM; - break; - } - } - else - { - switch (num) - { - case 1: - format = DXGI_FORMAT_R8_UINT; - break; - - case 2: - format = DXGI_FORMAT_R8G8_UINT; - break; - - default: - case 4: - format = DXGI_FORMAT_R8G8B8A8_UINT; - break; - } - } - break; - - case AttribType::Uint16: - if (normalized) - { - switch (num) - { - default: - case 2: - format = DXGI_FORMAT_R16G16_UNORM; - break; - - case 4: - format = DXGI_FORMAT_R16G16B16A16_UNORM; - break; - } - } - else - { - switch (num) - { - default: - case 2: - format = DXGI_FORMAT_R16G16_UINT; - break; - - case 4: - format = DXGI_FORMAT_R16G16B16A16_UINT; - break; - } - } - break; - - case AttribType::Float: - switch (num) - { - case 1: - format = DXGI_FORMAT_R32_FLOAT; - break; - - case 2: - format = DXGI_FORMAT_R32G32_FLOAT; - break; - - default: - case 3: - format = DXGI_FORMAT_R32G32B32_FLOAT; - break; - - case 4: - format = DXGI_FORMAT_R32G32B32A32_FLOAT; - break; - } - - break; - - default: - BX_CHECK(false, "Invalid attrib type."); - break; - } - - elem->Format = format; + elem->Format = s_attribType[type][num-1][normalized]; elem->AlignedByteOffset = _decl.m_offset[attr]; } @@ -823,7 +748,7 @@ namespace bgfx } else { - desc.Usage = D3D11_USAGE_DEFAULT; + desc.Usage = D3D11_USAGE_IMMUTABLE; desc.CPUAccessFlags = 0; D3D11_SUBRESOURCE_DATA srd; @@ -874,7 +799,7 @@ namespace bgfx } else { - desc.Usage = D3D11_USAGE_DEFAULT; + desc.Usage = D3D11_USAGE_IMMUTABLE; desc.CPUAccessFlags = 0; desc.StructureByteStride = 0; @@ -1915,6 +1840,14 @@ namespace bgfx { s_renderCtx.setRasterizerState(newFlags, wireframe); } + + uint8_t primIndex = uint8_t( (newFlags&BGFX_STATE_PT_MASK)>>BGFX_STATE_PT_SHIFT); + if (primType != s_primType[primIndex]) + { + primType = s_primType[primIndex]; + primNumVerts = s_primNumVerts[primIndex]; + deviceCtx->IASetPrimitiveTopology(primType); + } } bool programChanged = false; diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index 1760ec47f..10f763538 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -860,6 +860,34 @@ namespace bgfx D3DDECL_END() }; + static const D3DDECLTYPE s_attribType[AttribType::Count][4][2] = + { + { + { D3DDECLTYPE_UBYTE4, D3DDECLTYPE_UBYTE4N }, + { D3DDECLTYPE_UBYTE4, D3DDECLTYPE_UBYTE4N }, + { D3DDECLTYPE_UBYTE4, D3DDECLTYPE_UBYTE4N }, + { D3DDECLTYPE_UBYTE4, D3DDECLTYPE_UBYTE4N }, + }, + { + { D3DDECLTYPE_SHORT2, D3DDECLTYPE_SHORT2N }, + { D3DDECLTYPE_SHORT2, D3DDECLTYPE_SHORT2N }, + { D3DDECLTYPE_SHORT4, D3DDECLTYPE_SHORT4N }, + { D3DDECLTYPE_SHORT4, D3DDECLTYPE_SHORT4N }, + }, + { + { D3DDECLTYPE_FLOAT16_2, D3DDECLTYPE_FLOAT16_2 }, + { D3DDECLTYPE_FLOAT16_2, D3DDECLTYPE_FLOAT16_2 }, + { D3DDECLTYPE_FLOAT16_4, D3DDECLTYPE_FLOAT16_4 }, + { D3DDECLTYPE_FLOAT16_4, D3DDECLTYPE_FLOAT16_4 }, + }, + { + { D3DDECLTYPE_FLOAT1, D3DDECLTYPE_FLOAT1 }, + { D3DDECLTYPE_FLOAT2, D3DDECLTYPE_FLOAT2 }, + { D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT3 }, + { D3DDECLTYPE_FLOAT4, D3DDECLTYPE_FLOAT4 }, + }, + }; + static D3DVERTEXELEMENT9* fillVertexDecl(D3DVERTEXELEMENT9* _out, uint32_t _count, const VertexDecl& _decl) { D3DVERTEXELEMENT9* elem = _out; @@ -875,81 +903,7 @@ namespace bgfx memcpy(elem, &s_attrib[attr], sizeof(D3DVERTEXELEMENT9) ); - D3DDECLTYPE declType = D3DDECLTYPE(elem->Type); - - switch (type) - { - case AttribType::Uint8: - if (normalized) - { - declType = D3DDECLTYPE_UBYTE4N; - } - else - { - declType = D3DDECLTYPE_UBYTE4; - } - break; - - case AttribType::Uint16: - if (normalized) - { - switch (num) - { - default: - case 2: - declType = D3DDECLTYPE_SHORT2N; - break; - - case 4: - declType = D3DDECLTYPE_SHORT4N; - break; - } - } - else - { - switch (num) - { - default: - case 2: - declType = D3DDECLTYPE_SHORT2; - break; - - case 4: - declType = D3DDECLTYPE_SHORT4; - break; - } - } - break; - - case AttribType::Float: - switch (num) - { - case 1: - declType = D3DDECLTYPE_FLOAT1; - break; - - case 2: - declType = D3DDECLTYPE_FLOAT2; - break; - - default: - case 3: - declType = D3DDECLTYPE_FLOAT3; - break; - - case 4: - declType = D3DDECLTYPE_FLOAT4; - break; - } - - break; - - default: - BX_CHECK(false, "Invalid attrib type."); - break; - } - - elem->Type = declType; + elem->Type = s_attribType[type][num-1][normalized]; elem->Offset = _decl.m_offset[attr]; ++elem; } diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 39ade1eca..8ce173b83 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -598,10 +598,15 @@ namespace bgfx ANGLE_translated_shader_source, ARB_instanced_arrays, ANGLE_instanced_arrays, + ARB_texture_float, OES_texture_float, OES_texture_float_linear, OES_texture_half_float, OES_texture_half_float_linear, + ARB_half_float_vertex, + OES_vertex_half_float, + ARB_vertex_type_2_10_10_10_rev, + OES_vertex_type_10_10_10_2, EXT_occlusion_query_boolean, ATI_meminfo, NVX_gpu_memory_info, @@ -637,10 +642,15 @@ namespace bgfx { "GL_ANGLE_translated_shader_source", false, true }, { "GL_ARB_instanced_arrays", false, true }, { "GL_ANGLE_instanced_arrays", false, true }, + { "GL_ARB_texture_float", false, true }, { "GL_OES_texture_float", false, true }, { "GL_OES_texture_float_linear", false, true }, { "GL_OES_texture_half_float", false, true }, { "GL_OES_texture_half_float_linear", false, true }, + { "GL_ARB_half_float_vertex", false, true }, + { "GL_OES_vertex_half_float", false, true }, + { "GL_ARB_vertex_type_2_10_10_10_rev", false, true }, + { "GL_OES_vertex_type_10_10_10_2", false, true }, { "GL_EXT_occlusion_query_boolean", false, true }, { "GL_ATI_meminfo", false, true }, { "GL_NVX_gpu_memory_info", false, true }, @@ -692,6 +702,7 @@ namespace bgfx { GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, + GL_HALF_FLOAT, GL_FLOAT, }; @@ -2524,7 +2535,7 @@ namespace bgfx || bindAttribs) { baseVertex = state.m_startVertex; - VertexBuffer& vb = s_renderCtx.m_vertexBuffers[state.m_vertexBuffer.idx]; + const VertexBuffer& vb = s_renderCtx.m_vertexBuffers[state.m_vertexBuffer.idx]; uint16_t decl = vb.m_decl.idx == invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; const Program& program = s_renderCtx.m_program[programIdx]; program.bindAttributes(s_renderCtx.m_vertexDecls[decl], state.m_startVertex); @@ -2536,6 +2547,15 @@ namespace bgfx } } + uint32_t numVertices = state.m_numVertices; + if (UINT32_C(0xffffffff) == numVertices) + { + const VertexBuffer& vb = s_renderCtx.m_vertexBuffers[currentState.m_vertexBuffer.idx]; + uint16_t decl = vb.m_decl.idx == invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; + const VertexDecl& vertexDecl = s_renderCtx.m_vertexDecls[decl]; + numVertices = vb.m_size/vertexDecl.m_stride; + } + uint32_t numIndices = 0; uint32_t numPrimsSubmitted = 0; uint32_t numInstances = 0; @@ -2574,13 +2594,13 @@ namespace bgfx } else { - numPrimsSubmitted = state.m_numVertices/primNumVerts; + numPrimsSubmitted = numVertices/primNumVerts; numInstances = state.m_numInstances; numPrimsRendered = numPrimsSubmitted*state.m_numInstances; GL_CHECK(s_drawArraysInstanced(primType , 0 - , state.m_numVertices + , numVertices , state.m_numInstances ) ); } diff --git a/tools/bin/shaderc.exe b/tools/bin/shaderc.exe index 7596cccb592ad9e1dab9e7c49aca056cfd992c20..a20695dfeb74dcd3d144f66f9e9330332f58fa02 100644 GIT binary patch delta 30732 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 wgrDIGZUltTk_bB39p~3UiC7ZzKc1}T1^@s6 delta 30235 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, &spd); - BX_TRACE("\t%2d: %s%d, %d, %d, %x, %d" + BX_TRACE("\t%2d: %s%d, vt %d, ct %d, mask %x, reg %d" , ii , spd.SemanticName , spd.SemanticIndex @@ -1664,6 +1664,13 @@ int main(int _argc, const char* _argv[]) if (glsl) { + preprocessor.writef( + "#define ivec2 vec2\n" + "#define ivec3 vec3\n" + "#define ivec4 vec4\n" + ); + + for (InOut::const_iterator it = shaderInputs.begin(), itEnd = shaderInputs.end(); it != itEnd; ++it) { VaryingMap::const_iterator varyingIt = varyingMap.find(*it); @@ -1696,15 +1703,18 @@ int main(int _argc, const char* _argv[]) else { preprocessor.writef( - "#define lowp\n" - "#define mediump\n" - "#define highp\n" - "#define vec2 float2\n" - "#define vec3 float3\n" - "#define vec4 float4\n" - "#define mat2 float2x2\n" - "#define mat3 float3x3\n" - "#define mat4 float4x4\n" + "#define lowp\n" + "#define mediump\n" + "#define highp\n" + "#define ivec2 int2\n" + "#define ivec3 int3\n" + "#define ivec4 int4\n" + "#define vec2 float2\n" + "#define vec3 float3\n" + "#define vec4 float4\n" + "#define mat2 float2x2\n" + "#define mat3 float3x3\n" + "#define mat4 float4x4\n" ); char* entry = strstr(data, "void main()");