Renderer side code to lock/unlock transform feedback data Added variables and function calls to lock/unlock transform feedback data used for reading the selected transform feedback varying variables out of the vertex shader. Also fixed uniform buffer unlocking potential race condition. Change-Id: I98790fc36fdf8674506d924b2f21b3e68892811a Reviewed-on: https://swiftshader-review.googlesource.com/5060 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/VertexProcessor.cpp b/src/Renderer/VertexProcessor.cpp index 01f6f14..24f40cc 100644 --- a/src/Renderer/VertexProcessor.cpp +++ b/src/Renderer/VertexProcessor.cpp
@@ -63,11 +63,6 @@ VertexProcessor::TransformFeedbackInfo::TransformFeedbackInfo() { - clear(); - } - - void VertexProcessor::TransformFeedbackInfo::clear() - { buffer = nullptr; offset = 0; reg = 0; @@ -76,6 +71,12 @@ stride = 0; } + VertexProcessor::UniformBufferInfo::UniformBufferInfo() + { + buffer = nullptr; + offset = 0; + } + VertexProcessor::VertexProcessor(Context *context) : context(context) { for(int i = 0; i < 12; i++) @@ -116,11 +117,6 @@ routineCache = 0; setRoutineCacheSize(1024); - - for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; i++) - { - uniformBuffer[i] = nullptr; - } } VertexProcessor::~VertexProcessor() @@ -179,27 +175,16 @@ void VertexProcessor::setUniformBuffer(int index, sw::Resource* buffer, int offset) { - uniformBuffer[index] = buffer; - uniformBufferOffset[index] = offset; + uniformBufferInfo[index].buffer = buffer; + uniformBufferInfo[index].offset = offset; } - void VertexProcessor::lockUniformBuffers(byte** u) + void VertexProcessor::lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[]) { for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; ++i) { - u[i] = uniformBuffer[i] ? static_cast<byte*>(uniformBuffer[i]->lock(PUBLIC, PRIVATE)) + uniformBufferOffset[i] : nullptr; - } - } - - void VertexProcessor::unlockUniformBuffers() - { - for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; ++i) - { - if(uniformBuffer[i]) - { - uniformBuffer[i]->unlock(); - uniformBuffer[i] = nullptr; - } + u[i] = uniformBufferInfo[i].buffer ? static_cast<byte*>(uniformBufferInfo[i].buffer->lock(PUBLIC, PRIVATE)) + uniformBufferInfo[i].offset : nullptr; + uniformBuffers[i] = uniformBufferInfo[i].buffer; } } @@ -213,11 +198,12 @@ transformFeedbackInfo[index].stride = stride; } - void VertexProcessor::lockTransformFeedbackBuffers(byte** t, unsigned int* v, unsigned int* r, unsigned int* c, unsigned int* s) + void VertexProcessor::lockTransformFeedbackBuffers(byte** t, unsigned int* v, unsigned int* r, unsigned int* c, unsigned int* s, sw::Resource* transformFeedbackBuffers[]) { for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS; ++i) { t[i] = transformFeedbackInfo[i].buffer ? static_cast<byte*>(transformFeedbackInfo[i].buffer->lock(PUBLIC, PRIVATE)) + transformFeedbackInfo[i].offset : nullptr; + transformFeedbackBuffers[i] = transformFeedbackInfo[i].buffer; v[i] = transformFeedbackInfo[i].reg; r[i] = transformFeedbackInfo[i].row; c[i] = transformFeedbackInfo[i].col; @@ -225,18 +211,6 @@ } } - void VertexProcessor::unlockTransformFeedbackBuffers() - { - for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS; ++i) - { - if(transformFeedbackInfo[i].buffer) - { - transformFeedbackInfo[i].buffer->unlock(); - } - transformFeedbackInfo[i].clear(); - } - } - void VertexProcessor::setModelMatrix(const Matrix &M, int i) { if(i < 12)