MAX_UNIFORM_BLOCKS_COMPONENTS = 49152,\r
MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = MAX_UNIFORM_BLOCKS_COMPONENTS + 4 * FRAGMENT_UNIFORM_VECTORS,\r
MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = MAX_UNIFORM_BLOCKS_COMPONENTS + 4 * VERTEX_UNIFORM_VECTORS,\r
+ MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 4,\r
};\r
\r
#endif // sw_Config_hpp\r
ResourceManager.cpp \
Shader.cpp \
Texture.cpp \
+ TransformFeedback.cpp \
utilities.cpp \
VertexDataManager.cpp \
#include "Program.h"\r
#include "Query.h"\r
#include "Renderbuffer.h"\r
+#include "Sampler.h"\r
#include "Shader.h"\r
#include "Texture.h"\r
+#include "TransformFeedback.h"\r
+#include "VertexArray.h"\r
#include "VertexDataManager.h"\r
#include "IndexDataManager.h"\r
#include "libEGL/Display.h"\r
mTextureCubeMapZero = new TextureCubeMap(0);\r
mTextureExternalZero = new TextureExternal(0);\r
\r
+ mState.transformFeedback = new TransformFeedback(0);\r
+ mTransformFeedbackMap[0] = mState.transformFeedback;\r
+\r
mState.activeSampler = 0;\r
bindArrayBuffer(0);\r
bindElementArrayBuffer(0);\r
return handle;\r
}\r
\r
+// Returns an unused vertex array name\r
+GLuint Context::createVertexArray()\r
+{\r
+ GLuint handle = mVertexArrayNameSpace.allocate();\r
+\r
+ mVertexArrayMap[handle] = NULL;\r
+\r
+ return handle;\r
+}\r
+\r
+// Returns an unused transform feedback name\r
+GLuint Context::createTransformFeedback()\r
+{\r
+ GLuint handle = mTransformFeedbackNameSpace.allocate();\r
+\r
+ mTransformFeedbackMap[handle] = NULL;\r
+\r
+ return handle;\r
+}\r
+\r
+// Returns an unused sampler name\r
+GLuint Context::createSampler()\r
+{\r
+ GLuint handle = mSamplerNameSpace.allocate();\r
+\r
+ mSamplerMap[handle] = NULL;\r
+\r
+ return handle;\r
+}\r
+\r
void Context::deleteBuffer(GLuint buffer)\r
{\r
if(mResourceManager->getBuffer(buffer))\r
}\r
}\r
\r
+void Context::deleteVertexArray(GLuint vertexArray)\r
+{\r
+ VertexArrayMap::iterator vertexArrayObject = mVertexArrayMap.find(vertexArray);\r
+\r
+ if(vertexArrayObject != mVertexArrayMap.end())\r
+ {\r
+ mVertexArrayNameSpace.release(vertexArrayObject->first);\r
+\r
+ if(vertexArrayObject->second)\r
+ {\r
+ vertexArrayObject->second->release();\r
+ }\r
+\r
+ mVertexArrayMap.erase(vertexArrayObject);\r
+ }\r
+}\r
+\r
+void Context::deleteTransformFeedback(GLuint transformFeedback)\r
+{\r
+ TransformFeedbackMap::iterator transformFeedbackObject = mTransformFeedbackMap.find(transformFeedback);\r
+\r
+ if(transformFeedbackObject != mTransformFeedbackMap.end())\r
+ {\r
+ mTransformFeedbackNameSpace.release(transformFeedbackObject->first);\r
+\r
+ if(transformFeedbackObject->second)\r
+ {\r
+ transformFeedbackObject->second->release();\r
+ }\r
+\r
+ mTransformFeedbackMap.erase(transformFeedbackObject);\r
+ }\r
+}\r
+\r
+void Context::deleteSampler(GLuint sampler)\r
+{\r
+ SamplerMap::iterator samplerObject = mSamplerMap.find(sampler);\r
+\r
+ if(samplerObject != mSamplerMap.end())\r
+ {\r
+ mSamplerNameSpace.release(samplerObject->first);\r
+\r
+ if(samplerObject->second)\r
+ {\r
+ samplerObject->second->release();\r
+ }\r
+\r
+ mSamplerMap.erase(samplerObject);\r
+ }\r
+}\r
+\r
Buffer *Context::getBuffer(GLuint handle)\r
{\r
return mResourceManager->getBuffer(handle);\r
mState.renderbuffer = getRenderbuffer(renderbuffer);\r
}\r
\r
+bool Context::bindVertexArray(GLuint array)\r
+{\r
+ VertexArray* vertexArray = getVertexArray(array);\r
+\r
+ if(vertexArray)\r
+ {\r
+ mState.vertexArray = vertexArray;\r
+ }\r
+\r
+ return !!vertexArray;\r
+}\r
+\r
+bool Context::bindTransformFeedback(GLuint id)\r
+{\r
+ TransformFeedback* transformFeedback = getTransformFeedback(id);\r
+\r
+ if(transformFeedback)\r
+ {\r
+ mState.transformFeedback = transformFeedback;\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+bool Context::bindSampler(GLuint unit, GLuint sampler)\r
+{\r
+ Sampler* samplerObject = getSampler(sampler);\r
+\r
+ if(sampler)\r
+ {\r
+ mState.sampler[unit] = samplerObject;\r
+ }\r
+\r
+ return !!samplerObject;\r
+}\r
+\r
void Context::useProgram(GLuint program)\r
{\r
GLuint priorProgram = mState.currentProgram;\r
}\r
}\r
\r
+VertexArray *Context::getVertexArray(GLuint array)\r
+{\r
+ VertexArrayMap::iterator vertexArray = mVertexArrayMap.find(array);\r
+\r
+ return (vertexArray == mVertexArrayMap.end()) ? NULL : vertexArray->second;\r
+}\r
+\r
+TransformFeedback *Context::getTransformFeedback(GLuint transformFeedback)\r
+{\r
+ TransformFeedbackMap::iterator transformFeedbackObject = mTransformFeedbackMap.find(transformFeedback);\r
+\r
+ return (transformFeedbackObject == mTransformFeedbackMap.end()) ? NULL : transformFeedbackObject->second;\r
+}\r
+\r
+Sampler *Context::getSampler(GLuint sampler)\r
+{\r
+ SamplerMap::iterator samplerObject = mSamplerMap.find(sampler);\r
+\r
+ return (samplerObject == mSamplerMap.end()) ? NULL : samplerObject->second;\r
+}\r
+\r
Buffer *Context::getArrayBuffer()\r
{\r
return mState.arrayBuffer;\r
case GL_DITHER: *params = mState.dither; break;\r
case GL_PRIMITIVE_RESTART_FIXED_INDEX: *params = mState.primitiveRestartFixedIndex; break;\r
case GL_RASTERIZER_DISCARD: *params = mState.rasterizerDiscard; break;\r
+ case GL_TRANSFORM_FEEDBACK_ACTIVE:\r
+ if(mState.transformFeedback)\r
+ {\r
+ *params = mState.transformFeedback->isActive();\r
+ break;\r
+ }\r
+ else return false;\r
+ case GL_TRANSFORM_FEEDBACK_PAUSED:\r
+ if(mState.transformFeedback)\r
+ {\r
+ *params = mState.transformFeedback->isPaused();\r
+ break;\r
+ }\r
+ else return false;\r
default:\r
return false;\r
}\r
*param = 0;\r
break;\r
case GL_TRANSFORM_FEEDBACK_ACTIVE: // boolean, initially GL_FALSE\r
- *param = GL_FALSE;\r
- break;\r
+ if(mState.transformFeedback)\r
+ {\r
+ *param = mState.transformFeedback->isActive();\r
+ break;\r
+ }\r
+ else return false;\r
case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: // name, initially 0\r
- *param = 0;\r
- break;\r
+ if(mState.transformFeedback && mState.transformFeedback->getGenericBuffer())\r
+ {\r
+ *param = mState.transformFeedback->getGenericBuffer()->name;\r
+ break;\r
+ }\r
+ else return false;\r
case GL_TRANSFORM_FEEDBACK_PAUSED: // boolean, initially GL_FALSE\r
- *param = GL_FALSE;\r
- break;\r
+ if(mState.transformFeedback)\r
+ {\r
+ *param = mState.transformFeedback->isPaused();\r
+ break;\r
+ }\r
+ else return false;\r
case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: // indexed[n] 64-bit integer, initially 0\r
- *param = 0;\r
- break;\r
+ if(mState.transformFeedback && mState.transformFeedback->getGenericBuffer())\r
+ {\r
+ *param = mState.transformFeedback->getGenericBuffer()->size();\r
+ break;\r
+ }\r
+ else return false;\r
case GL_TRANSFORM_FEEDBACK_BUFFER_START: // indexed[n] 64-bit integer, initially 0\r
*param = 0;\r
break;\r
#include "common/Object.hpp"\r
#include "Image.hpp"\r
#include "Renderer/Sampler.hpp"\r
+#include "TransformFeedback.h"\r
\r
#define GL_APICALL\r
#include <GLES2/gl2.h>\r
class IndexDataManager;\r
class Fence;\r
class Query;\r
+class Sampler;\r
+class VertexArray;\r
\r
enum\r
{\r
GLuint drawFramebuffer;\r
gl::BindingPointer<Renderbuffer> renderbuffer;\r
GLuint currentProgram;\r
+ gl::BindingPointer<VertexArray> vertexArray;\r
+ gl::BindingPointer<TransformFeedback> transformFeedback;\r
+ gl::BindingPointer<Sampler> sampler[MAX_COMBINED_TEXTURE_IMAGE_UNITS];\r
\r
VertexAttribute vertexAttribute[MAX_VERTEX_ATTRIBS];\r
gl::BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][MAX_COMBINED_TEXTURE_IMAGE_UNITS];\r
GLuint createQuery();\r
void deleteQuery(GLuint query);\r
\r
+ // Vertex arrays are owned by the Context\r
+ GLuint createVertexArray();\r
+ void deleteVertexArray(GLuint array);\r
+\r
+ // Transform feedbacks are owned by the Context\r
+ GLuint createTransformFeedback();\r
+ void deleteTransformFeedback(GLuint transformFeedback);\r
+\r
+ // Samplers are owned by the Context\r
+ GLuint createSampler();\r
+ void deleteSampler(GLuint sampler);\r
+\r
void bindArrayBuffer(GLuint buffer);\r
void bindElementArrayBuffer(GLuint buffer);\r
void bindTexture2D(GLuint texture);\r
void bindReadFramebuffer(GLuint framebuffer);\r
void bindDrawFramebuffer(GLuint framebuffer);\r
void bindRenderbuffer(GLuint renderbuffer);\r
+ bool bindVertexArray(GLuint array);\r
+ bool bindTransformFeedback(GLuint transformFeedback);\r
+ bool bindSampler(GLuint unit, GLuint sampler);\r
void useProgram(GLuint program);\r
\r
void beginQuery(GLenum target, GLuint query);\r
Framebuffer *getFramebuffer(GLuint handle);\r
virtual Renderbuffer *getRenderbuffer(GLuint handle);\r
Query *getQuery(GLuint handle, bool create, GLenum type);\r
+ VertexArray *getVertexArray(GLuint array);\r
+ TransformFeedback *getTransformFeedback(GLuint transformFeedback);\r
+ TransformFeedback *getTransformFeedback();\r
+ Sampler *getSampler(GLuint sampler);\r
\r
Buffer *getArrayBuffer();\r
Buffer *getElementArrayBuffer();\r
QueryMap mQueryMap;\r
gl::NameSpace mQueryNameSpace;\r
\r
+ typedef std::map<GLint, VertexArray*> VertexArrayMap;\r
+ VertexArrayMap mVertexArrayMap;\r
+ gl::NameSpace mVertexArrayNameSpace;\r
+\r
+ typedef std::map<GLint, TransformFeedback*> TransformFeedbackMap;\r
+ TransformFeedbackMap mTransformFeedbackMap;\r
+ gl::NameSpace mTransformFeedbackNameSpace;\r
+\r
+ typedef std::map<GLint, Sampler*> SamplerMap;\r
+ SamplerMap mSamplerMap;\r
+ gl::NameSpace mSamplerNameSpace;\r
+\r
VertexDataManager *mVertexDataManager;\r
IndexDataManager *mIndexDataManager;\r
\r
--- /dev/null
+// SwiftShader Software Renderer\r
+//\r
+// Copyright(c) 2015 Google Inc.\r
+//\r
+// All rights reserved. No part of this software may be copied, distributed, transmitted,\r
+// transcribed, stored in a retrieval system, translated into any human or computer\r
+// language by any means, or disclosed to third parties without the explicit written\r
+// agreement of Google Inc. Without such an agreement, no rights or licenses, express\r
+// or implied, including but not limited to any patent rights, are granted to you.\r
+//\r
+\r
+// Sampler.h: Defines the es2::Sampler class\r
+\r
+#ifndef LIBGLESV2_SAMPLER_H_\r
+#define LIBGLESV2_SAMPLER_H_\r
+\r
+#include "common/Object.hpp"\r
+#include "Renderer/Renderer.hpp"\r
+\r
+#define GL_APICALL\r
+#include <GLES2/gl2.h>\r
+\r
+namespace es2\r
+{\r
+\r
+class Sampler : public gl::Object\r
+{\r
+public:\r
+ Sampler(GLuint name) : Object(name)\r
+ {\r
+ mMinFilter = GL_NEAREST_MIPMAP_LINEAR;\r
+ mMagFilter = GL_LINEAR;\r
+\r
+ mWrapModeS = GL_REPEAT;\r
+ mWrapModeT = GL_REPEAT;\r
+ mWrapModeR = GL_REPEAT;\r
+\r
+ mMinLod = -1000.0f;\r
+ mMaxLod = 1000.0f;\r
+ mCompareMode = GL_NONE;\r
+ mCompareFunc = GL_LEQUAL;\r
+ }\r
+\r
+ GLenum mMinFilter;\r
+ GLenum mMagFilter;\r
+\r
+ GLenum mWrapModeS;\r
+ GLenum mWrapModeT;\r
+ GLenum mWrapModeR;\r
+\r
+ GLfloat mMinLod;\r
+ GLfloat mMaxLod;\r
+ GLenum mCompareMode;\r
+ GLenum mCompareFunc;\r
+};\r
+\r
+}\r
+\r
+#endif // LIBGLESV2_SAMPLER_H_\r
IMPLEMENTATION_MAX_SAMPLES = 4,\r
IMPLEMENTATION_MAX_COLOR_ATTACHMENTS = 8,\r
IMPLEMENTATION_MAX_DRAW_BUFFERS = 8,\r
- IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 4,\r
+ IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,\r
IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS = 36,\r
IMPLEMENTATION_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 1,\r
};\r
--- /dev/null
+// SwiftShader Software Renderer\r
+//\r
+// Copyright(c) 2015 Google Inc.\r
+//\r
+// All rights reserved. No part of this software may be copied, distributed, transmitted,\r
+// transcribed, stored in a retrieval system, translated into any human or computer\r
+// language by any means, or disclosed to third parties without the explicit written\r
+// agreement of Google Inc. Without such an agreement, no rights or licenses, express\r
+// or implied, including but not limited to any patent rights, are granted to you.\r
+//\r
+\r
+// TransformFeedback.cpp: Implements the es2::TransformFeedback class\r
+\r
+#include "TransformFeedback.h"\r
+\r
+#include "Buffer.h"\r
+\r
+namespace es2\r
+{\r
+\r
+TransformFeedback::TransformFeedback(GLuint name) : Object(name), mActive(false), mPaused(false)\r
+{\r
+ mGenericBuffer = NULL;\r
+}\r
+\r
+Buffer* TransformFeedback::getGenericBuffer() const\r
+{\r
+ return mGenericBuffer;\r
+}\r
+\r
+Buffer* TransformFeedback::getBuffer(GLuint index) const\r
+{\r
+ return mBuffer[index];\r
+}\r
+\r
+bool TransformFeedback::isActive() const\r
+{\r
+ return mActive;\r
+}\r
+\r
+bool TransformFeedback::isPaused() const\r
+{\r
+ return mPaused;\r
+}\r
+\r
+GLenum TransformFeedback::primitiveMode() const\r
+{\r
+ return mPrimitiveMode;\r
+}\r
+\r
+void TransformFeedback::begin(GLenum primitiveMode)\r
+{\r
+ mActive = true; mPrimitiveMode = primitiveMode;\r
+}\r
+\r
+void TransformFeedback::end()\r
+{\r
+ mActive = false;\r
+}\r
+\r
+void TransformFeedback::setPaused(bool paused)\r
+{\r
+ mPaused = paused;\r
+}\r
+\r
+void TransformFeedback::setGenericBuffer(Buffer* buffer)\r
+{\r
+ mGenericBuffer = buffer;\r
+}\r
+\r
+void TransformFeedback::setBuffer(GLuint index, Buffer* buffer)\r
+{\r
+ mBuffer[index] = 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
+}\r
+\r
+}\r
--- /dev/null
+// SwiftShader Software Renderer\r
+//\r
+// Copyright(c) 2015 Google Inc.\r
+//\r
+// All rights reserved. No part of this software may be copied, distributed, transmitted,\r
+// transcribed, stored in a retrieval system, translated into any human or computer\r
+// language by any means, or disclosed to third parties without the explicit written\r
+// agreement of Google Inc. Without such an agreement, no rights or licenses, express\r
+// or implied, including but not limited to any patent rights, are granted to you.\r
+//\r
+\r
+// TransformFeedback.h: Defines the es2::TransformFeedback class\r
+\r
+#ifndef LIBGLESV2_TRANSFORM_FEEDBACK_H_\r
+#define LIBGLESV2_TRANSFORM_FEEDBACK_H_\r
+\r
+#include "common/Object.hpp"\r
+#include "Renderer/Renderer.hpp"\r
+\r
+#define GL_APICALL\r
+#include <GLES2/gl2.h>\r
+\r
+namespace es2\r
+{\r
+class Buffer;\r
+\r
+class TransformFeedback : public gl::Object\r
+{\r
+public:\r
+ // FIXME: Change this when implementing transform feedback\r
+ TransformFeedback(GLuint name);\r
+\r
+ Buffer* getGenericBuffer() const;\r
+ Buffer* getBuffer(GLuint index) const;\r
+ bool isActive() const;\r
+ bool isPaused() const;\r
+ GLenum primitiveMode() const;\r
+\r
+ void setGenericBuffer(Buffer* buffer);\r
+ void setBuffer(GLuint index, Buffer* buffer);\r
+ void setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size);\r
+ void begin(GLenum primitiveMode);\r
+ void end();\r
+ void setPaused(bool paused);\r
+\r
+private:\r
+ gl::BindingPointer<Buffer> mGenericBuffer;\r
+ gl::BindingPointer<Buffer> mBuffer[MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS];\r
+\r
+ bool mActive;\r
+ bool mPaused;\r
+ GLenum mPrimitiveMode;\r
+};\r
+\r
+}\r
+\r
+#endif // LIBGLESV2_TRANSFORM_FEEDBACK_H_\r
--- /dev/null
+// SwiftShader Software Renderer\r
+//\r
+// Copyright(c) 2015 Google Inc.\r
+//\r
+// All rights reserved. No part of this software may be copied, distributed, transmitted,\r
+// transcribed, stored in a retrieval system, translated into any human or computer\r
+// language by any means, or disclosed to third parties without the explicit written\r
+// agreement of Google Inc. Without such an agreement, no rights or licenses, express\r
+// or implied, including but not limited to any patent rights, are granted to you.\r
+//\r
+\r
+// VertexArray.h: Defines the es2::VertexArray class\r
+\r
+#ifndef LIBGLESV2_VERTEX_ARRAY_H_\r
+#define LIBGLESV2_VERTEX_ARRAY_H_\r
+\r
+#include "common/Object.hpp"\r
+#include "Renderer/Renderer.hpp"\r
+\r
+#define GL_APICALL\r
+#include <GLES2/gl2.h>\r
+\r
+namespace es2\r
+{\r
+\r
+class VertexArray : public gl::Object\r
+{\r
+};\r
+\r
+}\r
+\r
+#endif // LIBGLESV2_VERTEX_ARRAY_H_\r
<Unit filename="Renderbuffer.h" />
<Unit filename="ResourceManager.cpp" />
<Unit filename="ResourceManager.h" />
+ <Unit filename="Sampler.h" />
<Unit filename="Shader.cpp" />
<Unit filename="Shader.h" />
<Unit filename="Texture.cpp" />
<Unit filename="Texture.h" />
+ <Unit filename="TransformFeedback.cpp" />
+ <Unit filename="TransformFeedback.h" />
+ <Unit filename="VertexArray.h" />
<Unit filename="VertexDataManager.cpp" />
<Unit filename="VertexDataManager.h" />
<Unit filename="exports.map" />
<ClCompile Include="ResourceManager.cpp" />\r
<ClCompile Include="Shader.cpp" />\r
<ClCompile Include="Texture.cpp" />\r
+ <ClCompile Include="TransformFeedback.cpp" />\r
<ClCompile Include="utilities.cpp" />\r
<ClCompile Include="VertexDataManager.cpp" />\r
</ItemGroup>\r
<ClInclude Include="Renderbuffer.h" />\r
<ClInclude Include="resource.h" />\r
<ClInclude Include="ResourceManager.h" />\r
+ <ClInclude Include="Sampler.h" />\r
<ClInclude Include="Shader.h" />\r
<ClInclude Include="Texture.h" />\r
+ <ClInclude Include="TransformFeedback.h" />\r
<ClInclude Include="utilities.h" />\r
+ <ClInclude Include="VertexArray.h" />\r
<ClInclude Include="VertexDataManager.h" />\r
</ItemGroup>\r
<ItemGroup>\r
<ClCompile Include="libGLESv3.cpp">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
+ <ClCompile Include="TransformFeedback.cpp">\r
+ <Filter>Source Files</Filter>\r
+ </ClCompile>\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="Buffer.h">\r
<ClInclude Include="..\common\NameSpace.hpp">\r
<Filter>Header Files</Filter>\r
</ClInclude>\r
+ <ClInclude Include="Sampler.h">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="TransformFeedback.h">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="VertexArray.h">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
</ItemGroup>\r
<ItemGroup>\r
<ResourceCompile Include="libGLESv2.rc" />\r