Transform Feedback buffer locking utility functions
Similarly to what had been done for uniform buffers,
transform feedback buffers require locking/unlocking
functions so that the Renderer can access these resources.
Change-Id: I909ccda4f30534290ebd4a575c082b5475786080
Reviewed-on: https://swiftshader-review.googlesource.com/5041
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 eaaf3e2..01f6f14 100644
--- a/src/Renderer/VertexProcessor.cpp
+++ b/src/Renderer/VertexProcessor.cpp
@@ -61,6 +61,21 @@
return memcmp(static_cast<const States*>(this), static_cast<const States*>(&state), sizeof(States)) == 0;
}
+ VertexProcessor::TransformFeedbackInfo::TransformFeedbackInfo()
+ {
+ clear();
+ }
+
+ void VertexProcessor::TransformFeedbackInfo::clear()
+ {
+ buffer = nullptr;
+ offset = 0;
+ reg = 0;
+ row = 0;
+ col = 0;
+ stride = 0;
+ }
+
VertexProcessor::VertexProcessor(Context *context) : context(context)
{
for(int i = 0; i < 12; i++)
@@ -188,6 +203,40 @@
}
}
+ void VertexProcessor::setTransformFeedbackBuffer(int index, sw::Resource* buffer, int offset, unsigned int reg, unsigned int row, unsigned int col, size_t stride)
+ {
+ transformFeedbackInfo[index].buffer = buffer;
+ transformFeedbackInfo[index].offset = offset;
+ transformFeedbackInfo[index].reg = reg;
+ transformFeedbackInfo[index].row = row;
+ transformFeedbackInfo[index].col = col;
+ transformFeedbackInfo[index].stride = stride;
+ }
+
+ void VertexProcessor::lockTransformFeedbackBuffers(byte** t, unsigned int* v, unsigned int* r, unsigned int* c, unsigned int* s)
+ {
+ 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;
+ v[i] = transformFeedbackInfo[i].reg;
+ r[i] = transformFeedbackInfo[i].row;
+ c[i] = transformFeedbackInfo[i].col;
+ s[i] = transformFeedbackInfo[i].stride;
+ }
+ }
+
+ 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)