Added uniform and transform feedback state and setting on context.

TRAC #22753

Signed-off-by: Jamie Madill
Signed-off-by: Nicolas Capens
Author: Geoff Lang

git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2111 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 3067ead..9adacf7 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -240,6 +240,16 @@
     mTexture2DZero.set(NULL);
     mTextureCubeMapZero.set(NULL);
 
+    for (int i = 0; i < IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS; i++)
+    {
+        mState.uniformBuffers[i].set(NULL);
+    }
+
+    for (int i = 0; i < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++)
+    {
+        mState.transformFeedbackBuffers[i].set(NULL);
+    }
+
     mResourceManager->release();
 }
 
@@ -915,6 +925,20 @@
     mState.renderbuffer.set(getRenderbuffer(renderbuffer));
 }
 
+void Context::bindUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
+{
+    mResourceManager->checkBufferAllocation(buffer);
+
+    mState.uniformBuffers[index].set(getBuffer(buffer), offset, size);
+}
+
+void Context::bindTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
+{
+    mResourceManager->checkBufferAllocation(buffer);
+
+    mState.transformFeedbackBuffers[index].set(getBuffer(buffer), offset, size);
+}
+
 void Context::useProgram(GLuint program)
 {
     GLuint priorProgram = mState.currentProgram;
@@ -2172,11 +2196,22 @@
     return mRenderer->getMaxCombinedTextureImageUnits();
 }
 
+unsigned int Context::getMaximumCombinedUniformBufferBindings() const
+{
+    return mRenderer->getMaxVertexShaderUniformBuffers() +
+           mRenderer->getMaxFragmentShaderUniformBuffers();
+}
+
 int Context::getMaxSupportedSamples() const
 {
     return mRenderer->getMaxSupportedSamples();
 }
 
+unsigned int Context::getMaxTransformFeedbackBufferBindings() const
+{
+    return mRenderer->getMaxTransformFeedbackBuffers();
+}
+
 unsigned int Context::getMaximumRenderTargets() const
 {
     return mRenderer->getMaxRenderTargets();
diff --git a/src/libGLESv2/Context.h b/src/libGLESv2/Context.h
index 0be5641..2281745 100644
--- a/src/libGLESv2/Context.h
+++ b/src/libGLESv2/Context.h
@@ -164,6 +164,10 @@
     BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS];
     BindingPointer<Query> activeQuery[QUERY_TYPE_COUNT];
 
+    OffsetBindingPointer<Buffer> uniformBuffers[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS];
+
+    OffsetBindingPointer<Buffer> transformFeedbackBuffers[IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS];
+
     GLint unpackAlignment;
     GLint packAlignment;
     bool packReverseRowOrder;
@@ -308,6 +312,8 @@
     void bindReadFramebuffer(GLuint framebuffer);
     void bindDrawFramebuffer(GLuint framebuffer);
     void bindRenderbuffer(GLuint renderbuffer);
+    void bindUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
+    void bindTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
     void useProgram(GLuint program);
     void linkProgram(GLuint program);
     void setProgramBinary(GLuint program, const void *binary, GLint length);
@@ -367,12 +373,14 @@
     int getMajorShaderModel() const;
     float getMaximumPointSize() const;
     unsigned int getMaximumCombinedTextureImageUnits() const;
+    unsigned int getMaximumCombinedUniformBufferBindings() const;
     int getMaximumRenderbufferDimension() const;
     int getMaximumTextureDimension() const;
     int getMaximumCubeTextureDimension() const;
     int getMaximumTextureLevel() const;
     unsigned int getMaximumRenderTargets() const;
     GLsizei getMaxSupportedSamples() const;
+    unsigned int getMaxTransformFeedbackBufferBindings() const;
     const char *getExtensionString() const;
     const char *getRendererString() const;
     bool supportsEventQueries() const;
diff --git a/src/libGLESv2/constants.h b/src/libGLESv2/constants.h
index 9f24d66..734cbc4 100644
--- a/src/libGLESv2/constants.h
+++ b/src/libGLESv2/constants.h
@@ -22,7 +22,14 @@
     IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS + IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS,    
 
     IMPLEMENTATION_MAX_VARYING_VECTORS = 32,
-    IMPLEMENTATION_MAX_DRAW_BUFFERS = 8
+    IMPLEMENTATION_MAX_DRAW_BUFFERS = 8,
+
+    IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS = 16,
+    IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS = 16,
+    IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS = IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS +
+                                                         IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS,
+
+    IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS = 4,
 };
 
 const float ALIASED_LINE_WIDTH_RANGE_MIN = 1.0f;
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 94adb12..b06b7e4 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -2193,6 +2193,9 @@
 
 unsigned int Renderer11::getMaxVertexShaderUniformBuffers() const
 {
+    META_ASSERT(gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS >= D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT &&
+                gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS >= D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT);
+
     switch (mFeatureLevel)
     {
       case D3D_FEATURE_LEVEL_11_0:
@@ -2207,6 +2210,9 @@
 
 unsigned int Renderer11::getMaxFragmentShaderUniformBuffers() const
 {
+    META_ASSERT(gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS >= D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT &&
+                gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS >= D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT);
+
     switch (mFeatureLevel)
     {
       case D3D_FEATURE_LEVEL_11_0:
@@ -2221,6 +2227,9 @@
 
 unsigned int Renderer11::getMaxTransformFeedbackBuffers() const
 {
+    META_ASSERT(gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS >= D3D11_SO_BUFFER_SLOT_COUNT &&
+                gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS >= D3D10_SO_BUFFER_SLOT_COUNT);
+
     switch (mFeatureLevel)
     {
       case D3D_FEATURE_LEVEL_11_0: