Commit 78696bf0 by Alexis Hetu Committed by Alexis Hétu

Fixed binding offsets for uniform and transform feedback buffers

There was some confusion between buffer mapping and size and offset buffer binding arguments, which are distinct, but were represented by the same Buffer class members. Added OffsetBindingPointer to solve the issue and removed setOffset/setSize from the Buffer class, which should not have existed in the first place (only the mapRange/unmap functions should be allowed to modify these values, for now). Change-Id: Iacecd17cfb90d0a229d9edf62a463c8acf31f07a Reviewed-on: https://swiftshader-review.googlesource.com/4590Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 150f597a
...@@ -44,8 +44,6 @@ class Buffer : public gl::NamedObject ...@@ -44,8 +44,6 @@ class Buffer : public gl::NamedObject
GLsizeiptr length() const { return mLength; } GLsizeiptr length() const { return mLength; }
GLbitfield access() const { return mAccess; } GLbitfield access() const { return mAccess; }
void setOffset(GLintptr offset) { mOffset = offset; }
void setSize(size_t size) { mSize = size; }
void* mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access); void* mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access);
bool unmap(); bool unmap();
void flushMappedRange(GLintptr offset, GLsizeiptr length) {} void flushMappedRange(GLintptr offset, GLsizeiptr length) {}
...@@ -62,6 +60,28 @@ class Buffer : public gl::NamedObject ...@@ -62,6 +60,28 @@ class Buffer : public gl::NamedObject
GLbitfield mAccess; GLbitfield mAccess;
}; };
class UniformBufferBinding
{
public:
UniformBufferBinding() : offset(0), size(0) { }
void set(Buffer *newUniformBuffer, int newOffset = 0, int newSize = 0)
{
uniformBuffer = newUniformBuffer;
offset = newOffset;
size = newSize;
}
int getOffset() const { return offset; }
int getSize() const { return size; }
const gl::BindingPointer<Buffer>& get() const { return uniformBuffer; }
private:
gl::BindingPointer<Buffer> uniformBuffer;
int offset;
int size;
};
} }
#endif // LIBGLESV2_BUFFER_H_ #endif // LIBGLESV2_BUFFER_H_
...@@ -1293,12 +1293,7 @@ void Context::bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr off ...@@ -1293,12 +1293,7 @@ void Context::bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr off
mResourceManager->checkBufferAllocation(buffer); mResourceManager->checkBufferAllocation(buffer);
Buffer* bufferObject = getBuffer(buffer); Buffer* bufferObject = getBuffer(buffer);
if(bufferObject) mState.uniformBuffers[index].set(bufferObject, offset, size);
{
bufferObject->setOffset(offset);
bufferObject->setSize(size);
}
mState.uniformBuffers[index] = bufferObject;
} }
void Context::bindGenericTransformFeedbackBuffer(GLuint buffer) void Context::bindGenericTransformFeedbackBuffer(GLuint buffer)
...@@ -1313,12 +1308,7 @@ void Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GL ...@@ -1313,12 +1308,7 @@ void Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GL
mResourceManager->checkBufferAllocation(buffer); mResourceManager->checkBufferAllocation(buffer);
Buffer* bufferObject = getBuffer(buffer); Buffer* bufferObject = getBuffer(buffer);
if(bufferObject) getTransformFeedback()->setBuffer(index, bufferObject, offset, size);
{
bufferObject->setOffset(offset);
bufferObject->setSize(size);
}
getTransformFeedback()->setBuffer(index, bufferObject);
} }
bool Context::bindTransformFeedback(GLuint id) bool Context::bindTransformFeedback(GLuint id)
......
...@@ -44,7 +44,6 @@ struct TranslatedAttribute; ...@@ -44,7 +44,6 @@ struct TranslatedAttribute;
struct TranslatedIndexData; struct TranslatedIndexData;
class Device; class Device;
class Buffer;
class Shader; class Shader;
class Program; class Program;
class Texture; class Texture;
...@@ -378,7 +377,7 @@ struct State ...@@ -378,7 +377,7 @@ struct State
gl::BindingPointer<Buffer> pixelPackBuffer; gl::BindingPointer<Buffer> pixelPackBuffer;
gl::BindingPointer<Buffer> pixelUnpackBuffer; gl::BindingPointer<Buffer> pixelUnpackBuffer;
gl::BindingPointer<Buffer> genericUniformBuffer; gl::BindingPointer<Buffer> genericUniformBuffer;
gl::BindingPointer<Buffer> uniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS]; UniformBufferBinding uniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];
GLuint readFramebuffer; GLuint readFramebuffer;
GLuint drawFramebuffer; GLuint drawFramebuffer;
......
...@@ -1132,7 +1132,7 @@ namespace es2 ...@@ -1132,7 +1132,7 @@ namespace es2
} }
} }
void Program::applyUniformBuffers(gl::BindingPointer<Buffer>* uniformBuffers) void Program::applyUniformBuffers(UniformBufferBinding* uniformBuffers)
{ {
GLint vertexUniformBuffers[IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS]; GLint vertexUniformBuffers[IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS];
GLint fragmentUniformBuffers[IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS]; GLint fragmentUniformBuffers[IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS];
...@@ -1175,9 +1175,9 @@ namespace es2 ...@@ -1175,9 +1175,9 @@ namespace es2
for(unsigned int bufferBindingIndex = 0; bufferBindingIndex < IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS; ++bufferBindingIndex) for(unsigned int bufferBindingIndex = 0; bufferBindingIndex < IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS; ++bufferBindingIndex)
{ {
int index = vertexUniformBuffers[bufferBindingIndex]; int index = vertexUniformBuffers[bufferBindingIndex];
device->VertexProcessor::setUniformBuffer(bufferBindingIndex, (index != -1) ? uniformBuffers[index]->getResource() : nullptr, 0); device->VertexProcessor::setUniformBuffer(bufferBindingIndex, (index != -1) ? uniformBuffers[index].get()->getResource() : nullptr, (index != -1) ? uniformBuffers[index].getOffset() : 0);
index = fragmentUniformBuffers[bufferBindingIndex]; index = fragmentUniformBuffers[bufferBindingIndex];
device->PixelProcessor::setUniformBuffer(bufferBindingIndex, (index != -1) ? uniformBuffers[index]->getResource() : nullptr, 0); device->PixelProcessor::setUniformBuffer(bufferBindingIndex, (index != -1) ? uniformBuffers[index].get()->getResource() : nullptr, (index != -1) ? uniformBuffers[index].getOffset() : 0);
} }
} }
......
...@@ -167,7 +167,7 @@ namespace es2 ...@@ -167,7 +167,7 @@ namespace es2
void dirtyAllUniforms(); void dirtyAllUniforms();
void applyUniforms(); void applyUniforms();
void applyUniformBuffers(gl::BindingPointer<Buffer>* uniformBuffers); void applyUniformBuffers(UniformBufferBinding* uniformBuffers);
void link(); void link();
bool isLinked() const; bool isLinked() const;
......
...@@ -13,8 +13,6 @@ ...@@ -13,8 +13,6 @@
#include "TransformFeedback.h" #include "TransformFeedback.h"
#include "Buffer.h"
namespace es2 namespace es2
{ {
...@@ -28,7 +26,7 @@ TransformFeedback::~TransformFeedback() ...@@ -28,7 +26,7 @@ TransformFeedback::~TransformFeedback()
mGenericBuffer = NULL; mGenericBuffer = NULL;
for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i) for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)
{ {
mBuffer[i] = NULL; mBuffer[i].set(nullptr);
} }
} }
...@@ -39,7 +37,7 @@ Buffer* TransformFeedback::getGenericBuffer() const ...@@ -39,7 +37,7 @@ Buffer* TransformFeedback::getGenericBuffer() const
Buffer* TransformFeedback::getBuffer(GLuint index) const Buffer* TransformFeedback::getBuffer(GLuint index) const
{ {
return mBuffer[index]; return mBuffer[index].get();
} }
bool TransformFeedback::isActive() const bool TransformFeedback::isActive() const
...@@ -80,16 +78,12 @@ void TransformFeedback::setGenericBuffer(Buffer* buffer) ...@@ -80,16 +78,12 @@ void TransformFeedback::setGenericBuffer(Buffer* buffer)
void TransformFeedback::setBuffer(GLuint index, Buffer* buffer) void TransformFeedback::setBuffer(GLuint index, Buffer* buffer)
{ {
mBuffer[index] = buffer; mBuffer[index].set(buffer);
} }
void TransformFeedback::setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size) void TransformFeedback::setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size)
{ {
mBuffer[index] = buffer; mBuffer[index].set(buffer, offset, size);
if(buffer)
{
buffer->mapRange(offset, size, buffer->access());
}
} }
void TransformFeedback::detachBuffer(GLuint buffer) void TransformFeedback::detachBuffer(GLuint buffer)
...@@ -101,9 +95,9 @@ void TransformFeedback::detachBuffer(GLuint buffer) ...@@ -101,9 +95,9 @@ void TransformFeedback::detachBuffer(GLuint buffer)
for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i) for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)
{ {
if(mBuffer[i].name() == buffer) if(mBuffer[i].get().name() == buffer)
{ {
mBuffer[i] = NULL; mBuffer[i].set(nullptr);
} }
} }
} }
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#ifndef LIBGLESV2_TRANSFORM_FEEDBACK_H_ #ifndef LIBGLESV2_TRANSFORM_FEEDBACK_H_
#define LIBGLESV2_TRANSFORM_FEEDBACK_H_ #define LIBGLESV2_TRANSFORM_FEEDBACK_H_
#include "Buffer.h"
#include "common/Object.hpp" #include "common/Object.hpp"
#include "Renderer/Renderer.hpp" #include "Renderer/Renderer.hpp"
...@@ -21,7 +22,6 @@ ...@@ -21,7 +22,6 @@
namespace es2 namespace es2
{ {
class Buffer;
class TransformFeedback : public gl::NamedObject class TransformFeedback : public gl::NamedObject
{ {
...@@ -46,7 +46,7 @@ public: ...@@ -46,7 +46,7 @@ public:
private: private:
gl::BindingPointer<Buffer> mGenericBuffer; gl::BindingPointer<Buffer> mGenericBuffer;
gl::BindingPointer<Buffer> mBuffer[MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS]; UniformBufferBinding mBuffer[MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS];
bool mActive; bool mActive;
bool mPaused; bool mPaused;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment