adding support for the 2 versions of the shaders nad solving the mapping of uniforms that arise with it

This commit is contained in:
samcake 2016-04-08 18:47:21 -07:00
parent 2f8d30e7ce
commit 8964c2427d
6 changed files with 78 additions and 20 deletions

View file

@ -523,8 +523,10 @@ void GLBackend::do_glUniform1i(Batch& batch, size_t paramOffset) {
return; return;
} }
updatePipeline(); updatePipeline();
GLint location = _pipeline._programShader->getUniformLocation(isStereo(), batch._params[paramOffset + 1]._int);
glUniform1f( glUniform1f(
batch._params[paramOffset + 1]._int, location,
batch._params[paramOffset + 0]._int); batch._params[paramOffset + 0]._int);
(void) CHECK_GL_ERROR(); (void) CHECK_GL_ERROR();
} }
@ -546,9 +548,10 @@ void GLBackend::do_glUniform1f(Batch& batch, size_t paramOffset) {
return; return;
} }
updatePipeline(); updatePipeline();
GLint location = _pipeline._programShader->getUniformLocation(isStereo(), batch._params[paramOffset + 1]._int);
glUniform1f( glUniform1f(
batch._params[paramOffset + 1]._int, location,
batch._params[paramOffset + 0]._float); batch._params[paramOffset + 0]._float);
(void) CHECK_GL_ERROR(); (void) CHECK_GL_ERROR();
} }
@ -571,7 +574,7 @@ void GLBackend::do_glUniform2f(Batch& batch, size_t paramOffset) {
} }
updatePipeline(); updatePipeline();
glUniform2f( glUniform2f(
batch._params[paramOffset + 2]._int, _pipeline._programShader->getUniformLocation(isStereo(), batch._params[paramOffset + 2]._int),
batch._params[paramOffset + 1]._float, batch._params[paramOffset + 1]._float,
batch._params[paramOffset + 0]._float); batch._params[paramOffset + 0]._float);
(void) CHECK_GL_ERROR(); (void) CHECK_GL_ERROR();
@ -596,7 +599,7 @@ void GLBackend::do_glUniform3f(Batch& batch, size_t paramOffset) {
} }
updatePipeline(); updatePipeline();
glUniform3f( glUniform3f(
batch._params[paramOffset + 3]._int, _pipeline._programShader->getUniformLocation(isStereo(), batch._params[paramOffset + 3]._int),
batch._params[paramOffset + 2]._float, batch._params[paramOffset + 2]._float,
batch._params[paramOffset + 1]._float, batch._params[paramOffset + 1]._float,
batch._params[paramOffset + 0]._float); batch._params[paramOffset + 0]._float);
@ -625,7 +628,7 @@ void GLBackend::do_glUniform4f(Batch& batch, size_t paramOffset) {
} }
updatePipeline(); updatePipeline();
glUniform4f( glUniform4f(
batch._params[paramOffset + 4]._int, _pipeline._programShader->getUniformLocation(isStereo(), batch._params[paramOffset + 4]._int),
batch._params[paramOffset + 3]._float, batch._params[paramOffset + 3]._float,
batch._params[paramOffset + 2]._float, batch._params[paramOffset + 2]._float,
batch._params[paramOffset + 1]._float, batch._params[paramOffset + 1]._float,
@ -651,7 +654,7 @@ void GLBackend::do_glUniform3fv(Batch& batch, size_t paramOffset) {
} }
updatePipeline(); updatePipeline();
glUniform3fv( glUniform3fv(
batch._params[paramOffset + 2]._int, _pipeline._programShader->getUniformLocation(isStereo(), batch._params[paramOffset + 2]._int),
batch._params[paramOffset + 1]._uint, batch._params[paramOffset + 1]._uint,
(const GLfloat*)batch.editData(batch._params[paramOffset + 0]._uint)); (const GLfloat*)batch.editData(batch._params[paramOffset + 0]._uint));
@ -677,7 +680,7 @@ void GLBackend::do_glUniform4fv(Batch& batch, size_t paramOffset) {
} }
updatePipeline(); updatePipeline();
GLint location = batch._params[paramOffset + 2]._int; GLint location = _pipeline._programShader->getUniformLocation(isStereo(), batch._params[paramOffset + 2]._int);
GLsizei count = batch._params[paramOffset + 1]._uint; GLsizei count = batch._params[paramOffset + 1]._uint;
const GLfloat* value = (const GLfloat*)batch.editData(batch._params[paramOffset + 0]._uint); const GLfloat* value = (const GLfloat*)batch.editData(batch._params[paramOffset + 0]._uint);
glUniform4fv(location, count, value); glUniform4fv(location, count, value);
@ -703,7 +706,7 @@ void GLBackend::do_glUniform4iv(Batch& batch, size_t paramOffset) {
} }
updatePipeline(); updatePipeline();
glUniform4iv( glUniform4iv(
batch._params[paramOffset + 2]._int, _pipeline._programShader->getUniformLocation(isStereo(), batch._params[paramOffset + 2]._int),
batch._params[paramOffset + 1]._uint, batch._params[paramOffset + 1]._uint,
(const GLint*)batch.editData(batch._params[paramOffset + 0]._uint)); (const GLint*)batch.editData(batch._params[paramOffset + 0]._uint));
@ -728,8 +731,9 @@ void GLBackend::do_glUniformMatrix4fv(Batch& batch, size_t paramOffset) {
return; return;
} }
updatePipeline(); updatePipeline();
GLint location = _pipeline._programShader->getUniformLocation(isStereo(), batch._params[paramOffset + 3]._int);
glUniformMatrix4fv( glUniformMatrix4fv(
batch._params[paramOffset + 3]._int, location,
batch._params[paramOffset + 2]._uint, batch._params[paramOffset + 2]._uint,
batch._params[paramOffset + 1]._uint, batch._params[paramOffset + 1]._uint,
(const GLfloat*)batch.editData(batch._params[paramOffset + 0]._uint)); (const GLfloat*)batch.editData(batch._params[paramOffset + 0]._uint));

View file

@ -153,11 +153,16 @@ public:
using ShaderObjects = std::array< ShaderObject, NumVersions >; using ShaderObjects = std::array< ShaderObject, NumVersions >;
using UniformMapping = std::map<GLint, GLint>;
using UniformMappingVersions = std::vector<UniformMapping>;
GLShader(); GLShader();
~GLShader(); ~GLShader();
ShaderObjects _shaderObjects; ShaderObjects _shaderObjects;
UniformMappingVersions _uniformMappings;
GLuint getProgram(bool isStereo) const { GLuint getProgram(bool isStereo) const {
if (isStereo && _shaderObjects[Stereo].glprogram) { if (isStereo && _shaderObjects[Stereo].glprogram) {
return _shaderObjects[Stereo].glprogram; return _shaderObjects[Stereo].glprogram;
@ -165,6 +170,15 @@ public:
return _shaderObjects[Mono].glprogram; return _shaderObjects[Mono].glprogram;
} }
} }
GLint getUniformLocation(bool isStereo, GLint srcLoc) {
if (isStereo) {
if (srcLoc >= 0) {
return _uniformMappings[0][srcLoc];
}
}
return srcLoc;
}
}; };
static GLShader* syncGPUObject(const Shader& shader); static GLShader* syncGPUObject(const Shader& shader);
@ -467,6 +481,7 @@ protected:
PipelinePointer _pipeline; PipelinePointer _pipeline;
GLuint _program; GLuint _program;
GLShader* _programShader;
bool _invalidProgram; bool _invalidProgram;
State::Data _stateCache; State::Data _stateCache;
@ -478,6 +493,7 @@ protected:
PipelineStageState() : PipelineStageState() :
_pipeline(), _pipeline(),
_program(0), _program(0),
_programShader(nullptr),
_invalidProgram(false), _invalidProgram(false),
_stateCache(State::DEFAULT), _stateCache(State::DEFAULT),
_stateSignatureCache(0), _stateSignatureCache(0),

View file

@ -69,6 +69,7 @@ void GLBackend::do_setPipeline(Batch& batch, size_t paramOffset) {
_pipeline._pipeline.reset(); _pipeline._pipeline.reset();
_pipeline._program = 0; _pipeline._program = 0;
_pipeline._programShader = nullptr;
_pipeline._invalidProgram = true; _pipeline._invalidProgram = true;
_pipeline._state = nullptr; _pipeline._state = nullptr;
@ -84,6 +85,7 @@ void GLBackend::do_setPipeline(Batch& batch, size_t paramOffset) {
GLuint glprogram = pipelineObject->_program->getProgram(isStereo()); GLuint glprogram = pipelineObject->_program->getProgram(isStereo());
if (_pipeline._program != glprogram) { if (_pipeline._program != glprogram) {
_pipeline._program = glprogram; _pipeline._program = glprogram;
_pipeline._programShader = pipelineObject->_program;
_pipeline._invalidProgram = true; _pipeline._invalidProgram = true;
} }
@ -144,6 +146,7 @@ void GLBackend::resetPipelineStage() {
// Second the shader side // Second the shader side
_pipeline._invalidProgram = false; _pipeline._invalidProgram = false;
_pipeline._program = 0; _pipeline._program = 0;
_pipeline._programShader = nullptr;
_pipeline._pipeline.reset(); _pipeline._pipeline.reset();
glUseProgram(0); glUseProgram(0);
} }

View file

@ -42,8 +42,9 @@ bool compileShader(GLenum shaderDomain, const std::string& shaderSource, const s
} }
// Assign the source // Assign the source
const int NUM_SOURCE_STRINGS = 3;
const GLchar* srcstr[] = { "#version 410 core\n", defines.c_str(), shaderSource.c_str() }; const GLchar* srcstr[] = { "#version 410 core\n", defines.c_str(), shaderSource.c_str() };
glShaderSource(glshader, 3, srcstr, NULL); glShaderSource(glshader, NUM_SOURCE_STRINGS, srcstr, NULL);
// Compile ! // Compile !
glCompileShader(glshader); glCompileShader(glshader);
@ -79,7 +80,9 @@ bool compileShader(GLenum shaderDomain, const std::string& shaderSource, const s
*/ */
qCWarning(gpulogging) << "GLShader::compileShader - failed to compile the gl shader object:"; qCWarning(gpulogging) << "GLShader::compileShader - failed to compile the gl shader object:";
qCWarning(gpulogging) << srcstr; for (auto s : srcstr) {
qCWarning(gpulogging) << s;
}
qCWarning(gpulogging) << "GLShader::compileShader - errors:"; qCWarning(gpulogging) << "GLShader::compileShader - errors:";
qCWarning(gpulogging) << temp; qCWarning(gpulogging) << temp;
delete[] temp; delete[] temp;
@ -295,21 +298,34 @@ GLBackend::GLShader* compileBackendShader(const Shader& shader) {
const std::string& shaderSource = shader.getSource().getCode(); const std::string& shaderSource = shader.getSource().getCode();
// Shader domain // Shader domain
const GLenum SHADER_DOMAINS[2] = { GL_VERTEX_SHADER, GL_FRAGMENT_SHADER }; const int NUM_SHADER_DOMAINS = 2;
const GLenum SHADER_DOMAINS[NUM_SHADER_DOMAINS] = {
GL_VERTEX_SHADER,
GL_FRAGMENT_SHADER
};
GLenum shaderDomain = SHADER_DOMAINS[shader.getType()]; GLenum shaderDomain = SHADER_DOMAINS[shader.getType()];
// Make several versions of the shader // Domain specific defines
std::string shaderDefines[GLBackend::GLShader::NumVersions] = { const std::string domainDefines[NUM_SHADER_DOMAINS] = {
"#define VERTEX_SHADER",
"#define PIXEL_SHADER"
};
// Versions specific of the shader
const std::string versionDefines[GLBackend::GLShader::NumVersions] = {
"", "",
"#define GPU_TRANSFORM_IS_STEREO" "#define GPU_TRANSFORM_IS_STEREO"
}; };
GLBackend::GLShader::ShaderObjects shaderObjects; GLBackend::GLShader::ShaderObjects shaderObjects;
for (int version = 0; version < GLBackend::GLShader::NumVersions; version++) { for (int version = 0; version < GLBackend::GLShader::NumVersions; version++) {
auto& shaderObject = shaderObjects[version]; auto& shaderObject = shaderObjects[version];
bool result = compileShader(shaderDomain, shaderSource, shaderDefines[version], shaderObject.glshader, shaderObject.glprogram); std::string shaderDefines = domainDefines[shader.getType()] + "\n" + versionDefines[version];
bool result = compileShader(shaderDomain, shaderSource, shaderDefines, shaderObject.glshader, shaderObject.glprogram);
if (!result) { if (!result) {
return nullptr; return nullptr;
} }
@ -742,7 +758,6 @@ bool GLBackend::makeProgram(Shader& shader, const Shader::BindingSet& slotBindin
// APply bindings to all program versions and generate list of slots from default version // APply bindings to all program versions and generate list of slots from default version
for (int version = 0; version < GLBackend::GLShader::NumVersions; version++) { for (int version = 0; version < GLBackend::GLShader::NumVersions; version++) {
auto& shaderObject = object->_shaderObjects[version]; auto& shaderObject = object->_shaderObjects[version];
if (shaderObject.glprogram) { if (shaderObject.glprogram) {
Shader::SlotSet buffers; Shader::SlotSet buffers;
makeUniformBlockSlots(shaderObject.glprogram, slotBindings, buffers); makeUniformBlockSlots(shaderObject.glprogram, slotBindings, buffers);
@ -761,6 +776,12 @@ bool GLBackend::makeProgram(Shader& shader, const Shader::BindingSet& slotBindin
// Define the public slots only from the default version // Define the public slots only from the default version
if (version == 0) { if (version == 0) {
shader.defineSlots(uniforms, buffers, textures, samplers, inputs, outputs); shader.defineSlots(uniforms, buffers, textures, samplers, inputs, outputs);
} else {
GLShader::UniformMapping mapping;
for (auto srcUniform : shader.getUniforms()) {
mapping[srcUniform._location] = uniforms.findLocation(srcUniform._name);
}
object->_uniformMappings.push_back(mapping);
} }
} }
} }

View file

@ -27,10 +27,23 @@ layout(std140) uniform transformCameraBuffer {
TransformCamera _camera; TransformCamera _camera;
#endif #endif
}; };
#ifdef GPU_TRANSFORM_IS_STEREO
#ifdef VERTEX_SHADER
flat out int _stereoSide;
#endif
#ifdef PIXEL_SHADER
flat in int _stereoSide;
#endif
#endif
TransformCamera getTransformCamera() { TransformCamera getTransformCamera() {
#ifdef GPU_TRANSFORM_IS_STEREO #ifdef GPU_TRANSFORM_IS_STEREO
uint eyeIndex = gl_InstanceID % 2; #ifdef VERTEX_SHADER
return _camera[eyeIndex]; _stereoSide = gl_InstanceID % 2;
#endif
return _camera[_stereoSide];
#else #else
return _camera; return _camera;
#endif #endif
@ -77,8 +90,8 @@ TransformObject getTransformObject() {
<@func declareStandardTransform()@> <@func declareStandardTransform()@>
<$declareStandardObjectTransform()$>
<$declareStandardCameraTransform()$> <$declareStandardCameraTransform()$>
<$declareStandardObjectTransform()$>
<@endfunc@> <@endfunc@>
<@func transformCameraViewport(cameraTransform, viewport)@> <@func transformCameraViewport(cameraTransform, viewport)@>

View file

@ -246,7 +246,8 @@ void MeshPartPayload::bindMaterial(gpu::Batch& batch, const ShapePipeline::Locat
// Texcoord transforms ? // Texcoord transforms ?
if (locations->texcoordMatrices >= 0) { if (locations->texcoordMatrices >= 0) {
batch._glUniformMatrix4fv(locations->texcoordMatrices, 2, false, (const float*)&texcoordTransform); //batch._glUniformMatrix4fv(locations->texcoordMatrices, 2, false, (const float*)&texcoordTransform);
batch._glUniformMatrix4fv(locations->texcoordMatrices, (materialKey.isLightmapMap() ? 2 : 1), false, (const float*)&texcoordTransform);
} }
} }