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/opengles20/GpuProgramsGLES20_UniformCache.h |
Diffstat (limited to 'Runtime/GfxDevice/opengles20/GpuProgramsGLES20_UniformCache.h')
-rw-r--r-- | Runtime/GfxDevice/opengles20/GpuProgramsGLES20_UniformCache.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/Runtime/GfxDevice/opengles20/GpuProgramsGLES20_UniformCache.h b/Runtime/GfxDevice/opengles20/GpuProgramsGLES20_UniformCache.h new file mode 100644 index 0000000..6f01fc4 --- /dev/null +++ b/Runtime/GfxDevice/opengles20/GpuProgramsGLES20_UniformCache.h @@ -0,0 +1,51 @@ +#pragma once + +#if !GFX_SUPPORTS_OPENGLES20 +#error "Should not include GpuProgramsGLES20 on this platform" +#endif + +#include "Runtime/Utilities/LogAssert.h" +#include "Runtime/GfxDevice/GfxDeviceTypes.h" +#include <string.h> + +class GpuProgramParameters; + +struct +UniformCacheGLES20 +{ + // for gles we must set values per-uniform (not per-registers like in dx) + // so there is no real need for dirty tracking. + // TODO: do unified impl with dirty tracking if/when we do "everything is an array" in gles + float* uniform; + unsigned count; + + UniformCacheGLES20() : uniform(0), count(0) {} + + // we will pre-alloc memory. Fog params are handled differently (not added to gpu params). + // TODO: make it more general, int* perhaps, or some struct + void Create(const GpuProgramParameters* params, int fogParamsIndex, int fogColorIndex); + void Destroy(); + + // returns true if you need to update for real + bool UpdateUniform(int index, const float* val, unsigned floatCount); +}; + +void CachedUniform1(UniformCacheGLES20* cache, ShaderParamType type, int index, const float* val); +void CachedUniform2(UniformCacheGLES20* cache, ShaderParamType type, int index, const float* val); +void CachedUniform3(UniformCacheGLES20* cache, ShaderParamType type, int index, const float* val); +void CachedUniform4(UniformCacheGLES20* cache, ShaderParamType type, int index, const float* val); + + +inline bool UniformCacheGLES20::UpdateUniform(int index, const float* val, unsigned floatCount) +{ + Assert(index < count); + const unsigned mem_sz = floatCount*sizeof(float); + + float* target = uniform + 4*index; + if(::memcmp(target, val, mem_sz)) + { + ::memcpy(target, val, mem_sz); + return true; + } + return false; +} |