From dd234f025a2154553de23d4514da6669ef8f2851 Mon Sep 17 00:00:00 2001 From: wolfbeast Date: Tue, 24 Jul 2018 19:48:25 +0200 Subject: ANGLE: Initialize uniform blocks before detaching shaders This resolves #668 --- gfx/angle/src/libANGLE/Program.cpp | 6 ++++++ gfx/angle/src/libANGLE/renderer/ProgramImpl.h | 4 ++++ gfx/angle/src/libANGLE/renderer/d3d/ProgramD3D.h | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) (limited to 'gfx') diff --git a/gfx/angle/src/libANGLE/Program.cpp b/gfx/angle/src/libANGLE/Program.cpp index 7f4226da1..49a0f9a33 100755 --- a/gfx/angle/src/libANGLE/Program.cpp +++ b/gfx/angle/src/libANGLE/Program.cpp @@ -679,6 +679,12 @@ Error Program::link(const ContextState &data) gatherInterfaceBlockInfo(); + // Because we do lazy init in assignUniformBlockRegisters, + // we must initialize them when linking shaders, + // otherwise, we will have no shaders for getting uniform blocks + // information from shaders when doing draw calls. + mProgram->assignUniformBlockRegisters(); + mLinked = true; return NoError(); } diff --git a/gfx/angle/src/libANGLE/renderer/ProgramImpl.h b/gfx/angle/src/libANGLE/renderer/ProgramImpl.h index 45ff0a05a..e62623a8d 100755 --- a/gfx/angle/src/libANGLE/renderer/ProgramImpl.h +++ b/gfx/angle/src/libANGLE/renderer/ProgramImpl.h @@ -86,6 +86,10 @@ class ProgramImpl : angle::NonCopyable GLint components, const GLfloat *coeffs) = 0; + virtual void assignUniformBlockRegisters() + { + } + protected: const gl::ProgramState &mState; }; diff --git a/gfx/angle/src/libANGLE/renderer/d3d/ProgramD3D.h b/gfx/angle/src/libANGLE/renderer/d3d/ProgramD3D.h index 88fe4020d..01f3973c5 100755 --- a/gfx/angle/src/libANGLE/renderer/d3d/ProgramD3D.h +++ b/gfx/angle/src/libANGLE/renderer/d3d/ProgramD3D.h @@ -231,6 +231,7 @@ class ProgramD3D : public ProgramImpl const GLfloat *value); void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) override; + void assignUniformBlockRegisters() override; const UniformStorageD3D &getVertexUniformStorage() const { return *mVertexUniformStorage; } const UniformStorageD3D &getFragmentUniformStorage() const { return *mFragmentUniformStorage; } @@ -350,7 +351,6 @@ class ProgramD3D : public ProgramImpl void initAttribLocationsToD3DSemantic(); void reset(); - void assignUniformBlockRegisters(); void initUniformBlockInfo(); size_t getUniformBlockInfo(const sh::InterfaceBlock &interfaceBlock); -- cgit v1.2.3