virtual void addRef();
virtual void release();
-
+
private:
volatile int referenceCount;
};
ASSERT(!object); // Objects have to be released before the resource manager is destroyed, so they must be explicitly cleaned up. Assign null to all binding pointers to make the reference count go to zero.
}
- ObjectType *operator=(ObjectType *newObject)
+ ObjectType *operator=(ObjectType *newObject)
{
if(newObject) newObject->addRef();
if(object) object->release();
return object;
}
- ObjectType *operator=(const BindingPointer<ObjectType> &other)
+ ObjectType *operator=(const BindingPointer<ObjectType> &other)
{
return operator=(other.object);
}
GLsizeiptr length() const { return mLength; }\r
GLbitfield access() const { return mAccess; }\r
\r
- void setOffset(GLintptr offset) { mOffset = offset; }\r
- void setSize(size_t size) { mSize = size; }\r
void* mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access);\r
bool unmap();\r
void flushMappedRange(GLintptr offset, GLsizeiptr length) {}\r
GLbitfield mAccess;\r
};\r
\r
+class UniformBufferBinding\r
+{\r
+public:\r
+ UniformBufferBinding() : offset(0), size(0) { }\r
+\r
+ void set(Buffer *newUniformBuffer, int newOffset = 0, int newSize = 0)\r
+ {\r
+ uniformBuffer = newUniformBuffer;\r
+ offset = newOffset;\r
+ size = newSize;\r
+ }\r
+\r
+ int getOffset() const { return offset; }\r
+ int getSize() const { return size; }\r
+ const gl::BindingPointer<Buffer>& get() const { return uniformBuffer; }\r
+\r
+private:\r
+ gl::BindingPointer<Buffer> uniformBuffer;\r
+ int offset;\r
+ int size;\r
+};\r
+\r
}\r
\r
#endif // LIBGLESV2_BUFFER_H_\r
mResourceManager->checkBufferAllocation(buffer);\r
\r
Buffer* bufferObject = getBuffer(buffer);\r
- if(bufferObject)\r
- {\r
- bufferObject->setOffset(offset);\r
- bufferObject->setSize(size);\r
- }\r
- mState.uniformBuffers[index] = bufferObject;\r
+ mState.uniformBuffers[index].set(bufferObject, offset, size);\r
}\r
\r
void Context::bindGenericTransformFeedbackBuffer(GLuint buffer)\r
mResourceManager->checkBufferAllocation(buffer);\r
\r
Buffer* bufferObject = getBuffer(buffer);\r
- if(bufferObject)\r
- {\r
- bufferObject->setOffset(offset);\r
- bufferObject->setSize(size);\r
- }\r
- getTransformFeedback()->setBuffer(index, bufferObject);\r
+ getTransformFeedback()->setBuffer(index, bufferObject, offset, size);\r
}\r
\r
bool Context::bindTransformFeedback(GLuint id)\r
struct TranslatedIndexData;\r
\r
class Device;\r
-class Buffer;\r
class Shader;\r
class Program;\r
class Texture;\r
gl::BindingPointer<Buffer> pixelPackBuffer;\r
gl::BindingPointer<Buffer> pixelUnpackBuffer;\r
gl::BindingPointer<Buffer> genericUniformBuffer;\r
- gl::BindingPointer<Buffer> uniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];\r
+ UniformBufferBinding uniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];\r
\r
GLuint readFramebuffer;\r
GLuint drawFramebuffer;\r
int Program::getAttributeStream(int attributeIndex)\r
{\r
ASSERT(attributeIndex >= 0 && attributeIndex < MAX_VERTEX_ATTRIBS);\r
- \r
+\r
return attributeStream[attributeIndex];\r
}\r
\r
{\r
return false; // Attempting to write an array to a non-array uniform is an INVALID_OPERATION\r
}\r
- \r
+\r
count = std::min(size - (int)uniformIndex[location].element, count);\r
\r
int index = numElements - 1;\r
{\r
return false; // Attempting to write an array to a non-array uniform is an INVALID_OPERATION\r
}\r
- \r
+\r
count = std::min(size - (int)uniformIndex[location].element, count);\r
\r
if(targetUniform->type == GL_INT || targetUniform->type == GL_UNSIGNED_INT || IsSamplerUniform(targetUniform->type))\r
{\r
return false; // Attempting to write an array to a non-array uniform is an INVALID_OPERATION\r
}\r
- \r
+\r
count = std::min(size - (int)uniformIndex[location].element, count);\r
\r
int index = numElements - 1;\r
{\r
return false; // Attempting to write an array to a non-array uniform is an INVALID_OPERATION\r
}\r
- \r
+\r
count = std::min(size - (int)uniformIndex[location].element, count);\r
\r
if(targetUniform->type == GL_INT || targetUniform->type == GL_UNSIGNED_INT || IsSamplerUniform(targetUniform->type))\r
{\r
return false; // Attempting to write an array to a non-array uniform is an INVALID_OPERATION\r
}\r
- \r
+\r
count = std::min(size - (int)uniformIndex[location].element, count);\r
\r
int index = numElements - 1;\r
}\r
}\r
\r
- void Program::applyUniformBuffers(gl::BindingPointer<Buffer>* uniformBuffers)\r
+ void Program::applyUniformBuffers(UniformBufferBinding* uniformBuffers)\r
{\r
GLint vertexUniformBuffers[IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS];\r
GLint fragmentUniformBuffers[IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS];\r
for(unsigned int bufferBindingIndex = 0; bufferBindingIndex < IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS; ++bufferBindingIndex)\r
{\r
int index = vertexUniformBuffers[bufferBindingIndex];\r
- device->VertexProcessor::setUniformBuffer(bufferBindingIndex, (index != -1) ? uniformBuffers[index]->getResource() : nullptr, 0);\r
+ device->VertexProcessor::setUniformBuffer(bufferBindingIndex, (index != -1) ? uniformBuffers[index].get()->getResource() : nullptr, (index != -1) ? uniformBuffers[index].getOffset() : 0);\r
index = fragmentUniformBuffers[bufferBindingIndex];\r
- device->PixelProcessor::setUniformBuffer(bufferBindingIndex, (index != -1) ? uniformBuffers[index]->getResource() : nullptr, 0);\r
+ device->PixelProcessor::setUniformBuffer(bufferBindingIndex, (index != -1) ? uniformBuffers[index].get()->getResource() : nullptr, (index != -1) ? uniformBuffers[index].getOffset() : 0);\r
}\r
}\r
\r
if(components >= 1) pixelBinary->semantic[in + i][0] = sw::Shader::Semantic();\r
if(components >= 2) pixelBinary->semantic[in + i][1] = sw::Shader::Semantic();\r
if(components >= 3) pixelBinary->semantic[in + i][2] = sw::Shader::Semantic();\r
- if(components >= 4) pixelBinary->semantic[in + i][3] = sw::Shader::Semantic(); \r
+ if(components >= 4) pixelBinary->semantic[in + i][3] = sw::Shader::Semantic();\r
}\r
}\r
\r
\r
vertexBinary = new sw::VertexShader(vertexShader->getVertexShader());\r
pixelBinary = new sw::PixelShader(fragmentShader->getPixelShader());\r
- \r
+\r
if(!linkVaryings())\r
{\r
return;\r
if(IsSamplerUniform(type))\r
{\r
int index = registerIndex;\r
- \r
+\r
do\r
{\r
if(shader == GL_VERTEX_SHADER)\r
if(index < MAX_TEXTURE_IMAGE_UNITS)\r
{\r
samplersPS[index].active = true;\r
- \r
+\r
switch(type)\r
{\r
default: UNREACHABLE(type);\r
return linked;\r
}\r
\r
- bool Program::isValidated() const \r
+ bool Program::isValidated() const\r
{\r
return validated;\r
}\r
{\r
resetInfoLog();\r
\r
- if(!isLinked()) \r
+ if(!isLinked())\r
{\r
appendToInfoLog("Program has not been successfully linked.");\r
validated = false;\r
if(samplersPS[i].active)\r
{\r
unsigned int unit = samplersPS[i].logicalTextureUnit;\r
- \r
+\r
if(unit >= MAX_COMBINED_TEXTURE_IMAGE_UNITS)\r
{\r
if(logErrors)\r
if(samplersVS[i].active)\r
{\r
unsigned int unit = samplersVS[i].logicalTextureUnit;\r
- \r
+\r
if(unit >= MAX_COMBINED_TEXTURE_IMAGE_UNITS)\r
{\r
if(logErrors)\r
\r
void dirtyAllUniforms();\r
void applyUniforms();\r
- void applyUniformBuffers(gl::BindingPointer<Buffer>* uniformBuffers);\r
+ void applyUniformBuffers(UniformBufferBinding* uniformBuffers);\r
\r
void link();\r
bool isLinked() const;\r
\r
#include "TransformFeedback.h"\r
\r
-#include "Buffer.h"\r
-\r
namespace es2\r
{\r
\r
mGenericBuffer = NULL;\r
for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)\r
{\r
- mBuffer[i] = NULL;\r
+ mBuffer[i].set(nullptr);\r
}\r
}\r
\r
\r
Buffer* TransformFeedback::getBuffer(GLuint index) const\r
{\r
- return mBuffer[index];\r
+ return mBuffer[index].get();\r
}\r
\r
bool TransformFeedback::isActive() const\r
\r
void TransformFeedback::setBuffer(GLuint index, Buffer* buffer)\r
{\r
- mBuffer[index] = buffer;\r
+ mBuffer[index].set(buffer);\r
}\r
\r
void TransformFeedback::setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size)\r
{\r
- mBuffer[index] = buffer;\r
- if(buffer)\r
- {\r
- buffer->mapRange(offset, size, buffer->access());\r
- }\r
+ mBuffer[index].set(buffer, offset, size);\r
}\r
\r
void TransformFeedback::detachBuffer(GLuint buffer)\r
\r
for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)\r
{\r
- if(mBuffer[i].name() == buffer)\r
+ if(mBuffer[i].get().name() == buffer)\r
{\r
- mBuffer[i] = NULL;\r
+ mBuffer[i].set(nullptr);\r
}\r
}\r
}\r
#ifndef LIBGLESV2_TRANSFORM_FEEDBACK_H_\r
#define LIBGLESV2_TRANSFORM_FEEDBACK_H_\r
\r
+#include "Buffer.h"\r
#include "common/Object.hpp"\r
#include "Renderer/Renderer.hpp"\r
\r
\r
namespace es2\r
{\r
-class Buffer;\r
\r
class TransformFeedback : public gl::NamedObject\r
{\r
\r
private:\r
gl::BindingPointer<Buffer> mGenericBuffer;\r
- gl::BindingPointer<Buffer> mBuffer[MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS];\r
+ UniformBufferBinding mBuffer[MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS];\r
\r
bool mActive;\r
bool mPaused;\r