Explorar el Código

Fixed constant stomp bug.

bkaradzic hace 13 años
padre
commit
9b132944f5
Se han modificado 3 ficheros con 27 adiciones y 15 borrados
  1. 1 0
      src/bgfx_p.h
  2. 24 14
      src/renderer_d3d9.cpp
  3. 2 1
      src/renderer_gl.cpp

+ 1 - 0
src/bgfx_p.h

@@ -386,6 +386,7 @@ namespace bgfx
 
 		uint8_t m_type;
 		uint16_t m_loc;
+		uint16_t m_count;
 	};
 
 	PredefinedUniform::Enum nameToPredefinedUniformEnum(const char* _name);

+ 24 - 14
src/renderer_d3d9.cpp

@@ -203,6 +203,10 @@ namespace bgfx
 					  , m_caps.MaxTextureHeight
 					  );
 
+			BX_TRACE("Max vertex shader instr. slots: %d", m_caps.MaxVertexShader30InstructionSlots);
+			BX_TRACE("Max vertex shader constants: %d", m_caps.MaxVertexShaderConst);
+			BX_TRACE("Max fragment shader instr slots: %d", m_caps.MaxPixelShader30InstructionSlots);
+
 			m_fmtNULL = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_NULL) );
 			m_fmtDF16 = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_DF16) );
 			m_fmtDF24 = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_DF24) );
@@ -801,32 +805,38 @@ namespace bgfx
 			uint16_t regCount;
 			stream.read(regCount);
 
-			BX_TRACE("\t%s, type %2d, num %2d, r.index %3d, r.count %2d"
-				, name
-				, type
-				, num
-				, regIndex
-				, regCount
-				);
+			const char* kind = "invalid";
 
 			const void* data = NULL;
 			PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name);
 			if (PredefinedUniform::Count != predefined)
 			{
+				kind = "predefined";
 				m_predefined[m_numPredefined].m_loc = regIndex;
+				m_predefined[m_numPredefined].m_count = regCount;
 				m_predefined[m_numPredefined].m_type = predefined|fragmentBit;
 				m_numPredefined++;
 			}
 			else
 			{
 				const UniformInfo* info = s_renderCtx.m_uniformReg.find(name);
+				BX_CHECK(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
 				if (NULL != info)
 				{
+					kind = "user";
 					data = info->m_data;
 					m_constantBuffer->writeUniformRef( (ConstantType::Enum)(type|fragmentBit), regIndex, data, regCount);
-					BX_TRACE("store %s %p", name, data);
 				}
 			}
+
+			BX_TRACE("\t%s: %s, type %2d, num %2d, r.index %3d, r.count %2d"
+				, kind
+				, name
+				, type
+				, num
+				, regIndex
+				, regCount
+				);
 		}
 
 		uint16_t shaderSize;
@@ -1671,20 +1681,20 @@ namespace bgfx
 
 						case PredefinedUniform::View:
 							{
-								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, m_render->m_view[view].val, 4);
+								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, m_render->m_view[view].val, uint32_min(4, predefined.m_count) );
 							}
 							break;
 
 						case PredefinedUniform::ViewProj:
 							{
-								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, viewProj[view].val, 4);
+								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, viewProj[view].val, uint32_min(4, predefined.m_count) );
 							}
 							break;
 
 						case PredefinedUniform::Model:
 							{
  								const Matrix4& model = m_render->m_matrixCache.m_cache[state.m_matrix];
-								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, model.val, state.m_num*4);
+								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, model.val, uint32_min(state.m_num*4, predefined.m_count) );
 							}
 							break;
 
@@ -1693,7 +1703,7 @@ namespace bgfx
 								Matrix4 modelViewProj;
 								const Matrix4& model = m_render->m_matrixCache.m_cache[state.m_matrix];
 								matrix_mul(modelViewProj.val, model.val, viewProj[view].val);
-								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, modelViewProj.val, 4);
+								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, modelViewProj.val, uint32_min(4, predefined.m_count) );
 							}
 							break;
 
@@ -1716,7 +1726,7 @@ namespace bgfx
 								Matrix4 modelViewProj;
 								matrix_mul(modelViewProj.val, model.val, viewProjBias.val);
 
-								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, modelViewProj.val, 4);
+								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, modelViewProj.val, uint32_min(4, predefined.m_count) );
 							}
 							break;
 
@@ -1734,7 +1744,7 @@ namespace bgfx
 								Matrix4 viewProjBias;
 								matrix_mul(viewProjBias.val, viewProj[other].val, s_bias);
 
-								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, viewProjBias.val, 4);
+								s_renderCtx.setShaderConstantF(flags, predefined.m_loc, viewProjBias.val, uint32_min(4, predefined.m_count) );
 							}
 							break;
 

+ 2 - 1
src/renderer_gl.cpp

@@ -480,6 +480,7 @@ namespace bgfx
 			{
 				m_predefined[m_numPredefined].m_loc = loc;
 				m_predefined[m_numPredefined].m_type = predefined;
+				m_predefined[m_numPredefined].m_count = num;
 				m_numPredefined++;
 			}
 			else
@@ -1587,7 +1588,7 @@ namespace bgfx
 								{
 									const Matrix4& model = m_render->m_matrixCache.m_cache[state.m_matrix];
 									GL_CHECK(glUniformMatrix4fv(predefined.m_loc
-										, state.m_num
+										, uint32_min(predefined.m_count, state.m_num)
 										, GL_FALSE
 										, model.val
 										) );