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 7596cccb5..a20695dfe 100644 Binary files a/tools/bin/shaderc.exe and b/tools/bin/shaderc.exe differ diff --git a/tools/shaderc.cpp b/tools/shaderc.cpp index e1921de5c..704cd6076 100644 --- a/tools/shaderc.cpp +++ b/tools/shaderc.cpp @@ -978,7 +978,7 @@ bool compileHLSLShaderDx11(CommandLine& _cmdLine, const std::string& _code, IStr { D3D11_SIGNATURE_PARAMETER_DESC spd; reflect->GetInputParameterDesc(ii, &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()");