diff options
author | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
commit | 15740faf9fe9fe4be08965098bbf2947e096aeeb (patch) | |
tree | a730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/GfxDevice/GpuProgramParamsApply.h |
Diffstat (limited to 'Runtime/GfxDevice/GpuProgramParamsApply.h')
-rw-r--r-- | Runtime/GfxDevice/GpuProgramParamsApply.h | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/Runtime/GfxDevice/GpuProgramParamsApply.h b/Runtime/GfxDevice/GpuProgramParamsApply.h new file mode 100644 index 0000000..4ac5ad0 --- /dev/null +++ b/Runtime/GfxDevice/GpuProgramParamsApply.h @@ -0,0 +1,130 @@ +#pragma once + + +template<typename SetValuesFunctor> +void ApplyMaterialPropertyBlockValues( + MaterialPropertyBlock& propblock, + GpuProgram* activeGpuProgram[kShaderTypeCount], + const GpuProgramParameters* activeGpuProgramParams[kShaderTypeCount], + SetValuesFunctor& functor) +{ + const MaterialPropertyBlock::Property* curProp = propblock.GetPropertiesBegin(); + const MaterialPropertyBlock::Property* propEnd = propblock.GetPropertiesEnd(); + const float* propBuffer = propblock.GetBufferBegin(); + while (curProp != propEnd) + { + FastPropertyName name; + name.index = curProp->nameIndex; + for (int shaderType = kShaderVertex; shaderType < kShaderTypeCount; ++shaderType) + { + GpuProgram* GpuProgram = activeGpuProgram[shaderType]; + if (!GpuProgram) + continue; + const GpuProgramParameters* params = activeGpuProgramParams[shaderType]; + + if (curProp->texDim != kTexDimNone) + { + // texture parameter + const GpuProgramParameters::TextureParameter* param = params->FindTextureParam(name, (TextureDimension)curProp->texDim); + if (!param) + continue; + const float* val = &propBuffer[curProp->offset]; + functor.SetTextureVal ((ShaderType)shaderType, param->m_Index, param->m_SamplerIndex, param->m_Dim, TextureID(*(unsigned int*)val)); + } + else + { + // value parameter + int cbIndex; + const GpuProgramParameters::ValueParameter* param = params->FindParam(name, &cbIndex); + if (!param) + continue; + if (curProp->rows == 1) + { + const float* src = &propBuffer[curProp->offset]; + Vector4f val; + if (curProp->cols == 4) + val = Vector4f(src); + else + { + DebugAssert(curProp->cols == 1); + val = Vector4f(*src, 0, 0, 0); + } + functor.SetVectorVal ((ShaderType)shaderType, param->m_Type, param->m_Index, val.GetPtr(), curProp->cols, *params, cbIndex); + } + else if (curProp->rows == 4) + { + DebugAssert(curProp->cols == 4); + const Matrix4x4f* src = (const Matrix4x4f*)&propBuffer[curProp->offset]; + functor.SetMatrixVal ((ShaderType)shaderType, param->m_Index, src, param->m_RowCount, *params, cbIndex); + } + else + { + AssertString("Unknown property dimensions"); + } + } + } + ++curProp; + } + + propblock.Clear(); +} + + +// GL ES is different from everyone else, in that shader variables are always for the whole +// "program" (all shader stages at once). +template<typename SetValuesFunctor> +void ApplyMaterialPropertyBlockValuesES( + MaterialPropertyBlock& propblock, + const GpuProgram* activeProgram, + const GpuProgramParameters* activeProgramParams, + SetValuesFunctor& functor) +{ + if (activeProgram) + { + const MaterialPropertyBlock::Property* curProp = propblock.GetPropertiesBegin(); + const MaterialPropertyBlock::Property* propEnd = propblock.GetPropertiesEnd(); + const float* propBuffer = propblock.GetBufferBegin(); + while (curProp != propEnd) + { + FastPropertyName name; + name.index = curProp->nameIndex; + + if (curProp->texDim != kTexDimNone) + { + // texture parameter + const GpuProgramParameters::TextureParameter* param = activeProgramParams->FindTextureParam(name, (TextureDimension)curProp->texDim); + if (param) + { + const float* val = &propBuffer[curProp->offset]; + functor.SetTextureVal (kShaderFragment, param->m_Index, param->m_SamplerIndex, param->m_Dim, TextureID(*(unsigned int*)val)); + } + } + else + { + // value parameter + const GpuProgramParameters::ValueParameter* param = activeProgramParams->FindParam(name); + if (param && curProp->rows == param->m_RowCount) + { + if (curProp->rows == 1) + { + const float* src = &propBuffer[curProp->offset]; + functor.SetVectorVal (param->m_Type, param->m_Index, src, param->m_ColCount); + } + else if (curProp->rows == 4) + { + DebugAssert(curProp->cols == 4); + const Matrix4x4f* src = (const Matrix4x4f*)&propBuffer[curProp->offset]; + functor.SetMatrixVal (param->m_Index, src, param->m_RowCount); + } + else + { + AssertString("Unknown property dimensions"); + } + } + } + ++curProp; + } + } + + propblock.Clear(); +} |