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/PixelProcessor.cpp b/src/Renderer/PixelProcessor.cpp
index f736233..02d4c56 100644
--- a/src/Renderer/PixelProcessor.cpp
+++ b/src/Renderer/PixelProcessor.cpp
@@ -58,6 +58,12 @@
return memcmp(static_cast<const States*>(this), static_cast<const States*>(&state), sizeof(States)) == 0;
}
+ PixelProcessor::UniformBufferInfo::UniformBufferInfo()
+ {
+ buffer = nullptr;
+ offset = 0;
+ }
+
PixelProcessor::PixelProcessor(Context *context) : context(context)
{
setGlobalMipmapBias(0.0f); // Round to highest LOD [0.5, 1.0]: -0.5
@@ -66,11 +72,6 @@
routineCache = 0;
setRoutineCacheSize(1024);
-
- for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; i++)
- {
- uniformBuffer[i] = nullptr;
- }
}
PixelProcessor::~PixelProcessor()
@@ -143,27 +144,16 @@
void PixelProcessor::setUniformBuffer(int index, sw::Resource* buffer, int offset)
{
- uniformBuffer[index] = buffer;
- uniformBufferOffset[index] = offset;
+ uniformBufferInfo[index].buffer = buffer;
+ uniformBufferInfo[index].offset = offset;
}
- void PixelProcessor::lockUniformBuffers(byte** u)
+ void PixelProcessor::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 PixelProcessor::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;
}
}