Commit 2d234afa by Alexis Hetu Committed by Alexis Hétu

Adding new object types for OpenGL ES 3.0

New objects: - Sampler - Transform feedback - Vertex Array Change-Id: I701ea5fea75b81196290c3bdb3230cd471cc537b Reviewed-on: https://swiftshader-review.googlesource.com/2796Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent ed30618f
......@@ -76,6 +76,7 @@ enum
MAX_UNIFORM_BLOCKS_COMPONENTS = 49152,
MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = MAX_UNIFORM_BLOCKS_COMPONENTS + 4 * FRAGMENT_UNIFORM_VECTORS,
MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = MAX_UNIFORM_BLOCKS_COMPONENTS + 4 * VERTEX_UNIFORM_VECTORS,
MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 4,
};
#endif // sw_Config_hpp
......@@ -121,6 +121,7 @@ LOCAL_SRC_FILES += \
ResourceManager.cpp \
Shader.cpp \
Texture.cpp \
TransformFeedback.cpp \
utilities.cpp \
VertexDataManager.cpp \
......
......@@ -24,8 +24,11 @@
#include "Program.h"
#include "Query.h"
#include "Renderbuffer.h"
#include "Sampler.h"
#include "Shader.h"
#include "Texture.h"
#include "TransformFeedback.h"
#include "VertexArray.h"
#include "VertexDataManager.h"
#include "IndexDataManager.h"
#include "libEGL/Display.h"
......@@ -138,6 +141,9 @@ Context::Context(const egl::Config *config, const Context *shareContext, EGLint
mTextureCubeMapZero = new TextureCubeMap(0);
mTextureExternalZero = new TextureExternal(0);
mState.transformFeedback = new TransformFeedback(0);
mTransformFeedbackMap[0] = mState.transformFeedback;
mState.activeSampler = 0;
bindArrayBuffer(0);
bindElementArrayBuffer(0);
......@@ -826,6 +832,36 @@ GLuint Context::createQuery()
return handle;
}
// Returns an unused vertex array name
GLuint Context::createVertexArray()
{
GLuint handle = mVertexArrayNameSpace.allocate();
mVertexArrayMap[handle] = NULL;
return handle;
}
// Returns an unused transform feedback name
GLuint Context::createTransformFeedback()
{
GLuint handle = mTransformFeedbackNameSpace.allocate();
mTransformFeedbackMap[handle] = NULL;
return handle;
}
// Returns an unused sampler name
GLuint Context::createSampler()
{
GLuint handle = mSamplerNameSpace.allocate();
mSamplerMap[handle] = NULL;
return handle;
}
void Context::deleteBuffer(GLuint buffer)
{
if(mResourceManager->getBuffer(buffer))
......@@ -909,6 +945,57 @@ void Context::deleteQuery(GLuint query)
}
}
void Context::deleteVertexArray(GLuint vertexArray)
{
VertexArrayMap::iterator vertexArrayObject = mVertexArrayMap.find(vertexArray);
if(vertexArrayObject != mVertexArrayMap.end())
{
mVertexArrayNameSpace.release(vertexArrayObject->first);
if(vertexArrayObject->second)
{
vertexArrayObject->second->release();
}
mVertexArrayMap.erase(vertexArrayObject);
}
}
void Context::deleteTransformFeedback(GLuint transformFeedback)
{
TransformFeedbackMap::iterator transformFeedbackObject = mTransformFeedbackMap.find(transformFeedback);
if(transformFeedbackObject != mTransformFeedbackMap.end())
{
mTransformFeedbackNameSpace.release(transformFeedbackObject->first);
if(transformFeedbackObject->second)
{
transformFeedbackObject->second->release();
}
mTransformFeedbackMap.erase(transformFeedbackObject);
}
}
void Context::deleteSampler(GLuint sampler)
{
SamplerMap::iterator samplerObject = mSamplerMap.find(sampler);
if(samplerObject != mSamplerMap.end())
{
mSamplerNameSpace.release(samplerObject->first);
if(samplerObject->second)
{
samplerObject->second->release();
}
mSamplerMap.erase(samplerObject);
}
}
Buffer *Context::getBuffer(GLuint handle)
{
return mResourceManager->getBuffer(handle);
......@@ -1011,6 +1098,43 @@ void Context::bindRenderbuffer(GLuint renderbuffer)
mState.renderbuffer = getRenderbuffer(renderbuffer);
}
bool Context::bindVertexArray(GLuint array)
{
VertexArray* vertexArray = getVertexArray(array);
if(vertexArray)
{
mState.vertexArray = vertexArray;
}
return !!vertexArray;
}
bool Context::bindTransformFeedback(GLuint id)
{
TransformFeedback* transformFeedback = getTransformFeedback(id);
if(transformFeedback)
{
mState.transformFeedback = transformFeedback;
return true;
}
return false;
}
bool Context::bindSampler(GLuint unit, GLuint sampler)
{
Sampler* samplerObject = getSampler(sampler);
if(sampler)
{
mState.sampler[unit] = samplerObject;
}
return !!samplerObject;
}
void Context::useProgram(GLuint program)
{
GLuint priorProgram = mState.currentProgram;
......@@ -1180,6 +1304,27 @@ Query *Context::getQuery(unsigned int handle, bool create, GLenum type)
}
}
VertexArray *Context::getVertexArray(GLuint array)
{
VertexArrayMap::iterator vertexArray = mVertexArrayMap.find(array);
return (vertexArray == mVertexArrayMap.end()) ? NULL : vertexArray->second;
}
TransformFeedback *Context::getTransformFeedback(GLuint transformFeedback)
{
TransformFeedbackMap::iterator transformFeedbackObject = mTransformFeedbackMap.find(transformFeedback);
return (transformFeedbackObject == mTransformFeedbackMap.end()) ? NULL : transformFeedbackObject->second;
}
Sampler *Context::getSampler(GLuint sampler)
{
SamplerMap::iterator samplerObject = mSamplerMap.find(sampler);
return (samplerObject == mSamplerMap.end()) ? NULL : samplerObject->second;
}
Buffer *Context::getArrayBuffer()
{
return mState.arrayBuffer;
......@@ -1258,6 +1403,20 @@ bool Context::getBooleanv(GLenum pname, GLboolean *params)
case GL_DITHER: *params = mState.dither; break;
case GL_PRIMITIVE_RESTART_FIXED_INDEX: *params = mState.primitiveRestartFixedIndex; break;
case GL_RASTERIZER_DISCARD: *params = mState.rasterizerDiscard; break;
case GL_TRANSFORM_FEEDBACK_ACTIVE:
if(mState.transformFeedback)
{
*params = mState.transformFeedback->isActive();
break;
}
else return false;
case GL_TRANSFORM_FEEDBACK_PAUSED:
if(mState.transformFeedback)
{
*params = mState.transformFeedback->isPaused();
break;
}
else return false;
default:
return false;
}
......@@ -1780,17 +1939,33 @@ bool Context::getTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param)
*param = 0;
break;
case GL_TRANSFORM_FEEDBACK_ACTIVE: // boolean, initially GL_FALSE
*param = GL_FALSE;
break;
if(mState.transformFeedback)
{
*param = mState.transformFeedback->isActive();
break;
}
else return false;
case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: // name, initially 0
*param = 0;
break;
if(mState.transformFeedback && mState.transformFeedback->getGenericBuffer())
{
*param = mState.transformFeedback->getGenericBuffer()->name;
break;
}
else return false;
case GL_TRANSFORM_FEEDBACK_PAUSED: // boolean, initially GL_FALSE
*param = GL_FALSE;
break;
if(mState.transformFeedback)
{
*param = mState.transformFeedback->isPaused();
break;
}
else return false;
case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: // indexed[n] 64-bit integer, initially 0
*param = 0;
break;
if(mState.transformFeedback && mState.transformFeedback->getGenericBuffer())
{
*param = mState.transformFeedback->getGenericBuffer()->size();
break;
}
else return false;
case GL_TRANSFORM_FEEDBACK_BUFFER_START: // indexed[n] 64-bit integer, initially 0
*param = 0;
break;
......
......@@ -21,6 +21,7 @@
#include "common/Object.hpp"
#include "Image.hpp"
#include "Renderer/Sampler.hpp"
#include "TransformFeedback.h"
#define GL_APICALL
#include <GLES2/gl2.h>
......@@ -65,6 +66,8 @@ class VertexDataManager;
class IndexDataManager;
class Fence;
class Query;
class Sampler;
class VertexArray;
enum
{
......@@ -254,6 +257,9 @@ struct State
GLuint drawFramebuffer;
gl::BindingPointer<Renderbuffer> renderbuffer;
GLuint currentProgram;
gl::BindingPointer<VertexArray> vertexArray;
gl::BindingPointer<TransformFeedback> transformFeedback;
gl::BindingPointer<Sampler> sampler[MAX_COMBINED_TEXTURE_IMAGE_UNITS];
VertexAttribute vertexAttribute[MAX_VERTEX_ATTRIBS];
gl::BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][MAX_COMBINED_TEXTURE_IMAGE_UNITS];
......@@ -387,6 +393,18 @@ public:
GLuint createQuery();
void deleteQuery(GLuint query);
// Vertex arrays are owned by the Context
GLuint createVertexArray();
void deleteVertexArray(GLuint array);
// Transform feedbacks are owned by the Context
GLuint createTransformFeedback();
void deleteTransformFeedback(GLuint transformFeedback);
// Samplers are owned by the Context
GLuint createSampler();
void deleteSampler(GLuint sampler);
void bindArrayBuffer(GLuint buffer);
void bindElementArrayBuffer(GLuint buffer);
void bindTexture2D(GLuint texture);
......@@ -396,6 +414,9 @@ public:
void bindReadFramebuffer(GLuint framebuffer);
void bindDrawFramebuffer(GLuint framebuffer);
void bindRenderbuffer(GLuint renderbuffer);
bool bindVertexArray(GLuint array);
bool bindTransformFeedback(GLuint transformFeedback);
bool bindSampler(GLuint unit, GLuint sampler);
void useProgram(GLuint program);
void beginQuery(GLenum target, GLuint query);
......@@ -415,6 +436,10 @@ public:
Framebuffer *getFramebuffer(GLuint handle);
virtual Renderbuffer *getRenderbuffer(GLuint handle);
Query *getQuery(GLuint handle, bool create, GLenum type);
VertexArray *getVertexArray(GLuint array);
TransformFeedback *getTransformFeedback(GLuint transformFeedback);
TransformFeedback *getTransformFeedback();
Sampler *getSampler(GLuint sampler);
Buffer *getArrayBuffer();
Buffer *getElementArrayBuffer();
......@@ -503,6 +528,18 @@ private:
QueryMap mQueryMap;
gl::NameSpace mQueryNameSpace;
typedef std::map<GLint, VertexArray*> VertexArrayMap;
VertexArrayMap mVertexArrayMap;
gl::NameSpace mVertexArrayNameSpace;
typedef std::map<GLint, TransformFeedback*> TransformFeedbackMap;
TransformFeedbackMap mTransformFeedbackMap;
gl::NameSpace mTransformFeedbackNameSpace;
typedef std::map<GLint, Sampler*> SamplerMap;
SamplerMap mSamplerMap;
gl::NameSpace mSamplerNameSpace;
VertexDataManager *mVertexDataManager;
IndexDataManager *mIndexDataManager;
......
// SwiftShader Software Renderer
//
// Copyright(c) 2015 Google Inc.
//
// All rights reserved. No part of this software may be copied, distributed, transmitted,
// transcribed, stored in a retrieval system, translated into any human or computer
// language by any means, or disclosed to third parties without the explicit written
// agreement of Google Inc. Without such an agreement, no rights or licenses, express
// or implied, including but not limited to any patent rights, are granted to you.
//
// Sampler.h: Defines the es2::Sampler class
#ifndef LIBGLESV2_SAMPLER_H_
#define LIBGLESV2_SAMPLER_H_
#include "common/Object.hpp"
#include "Renderer/Renderer.hpp"
#define GL_APICALL
#include <GLES2/gl2.h>
namespace es2
{
class Sampler : public gl::Object
{
public:
Sampler(GLuint name) : Object(name)
{
mMinFilter = GL_NEAREST_MIPMAP_LINEAR;
mMagFilter = GL_LINEAR;
mWrapModeS = GL_REPEAT;
mWrapModeT = GL_REPEAT;
mWrapModeR = GL_REPEAT;
mMinLod = -1000.0f;
mMaxLod = 1000.0f;
mCompareMode = GL_NONE;
mCompareFunc = GL_LEQUAL;
}
GLenum mMinFilter;
GLenum mMagFilter;
GLenum mWrapModeS;
GLenum mWrapModeT;
GLenum mWrapModeR;
GLfloat mMinLod;
GLfloat mMaxLod;
GLenum mCompareMode;
GLenum mCompareFunc;
};
}
#endif // LIBGLESV2_SAMPLER_H_
......@@ -46,7 +46,7 @@ enum
IMPLEMENTATION_MAX_SAMPLES = 4,
IMPLEMENTATION_MAX_COLOR_ATTACHMENTS = 8,
IMPLEMENTATION_MAX_DRAW_BUFFERS = 8,
IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 4,
IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,
IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS = 36,
IMPLEMENTATION_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 1,
};
......
// SwiftShader Software Renderer
//
// Copyright(c) 2015 Google Inc.
//
// All rights reserved. No part of this software may be copied, distributed, transmitted,
// transcribed, stored in a retrieval system, translated into any human or computer
// language by any means, or disclosed to third parties without the explicit written
// agreement of Google Inc. Without such an agreement, no rights or licenses, express
// or implied, including but not limited to any patent rights, are granted to you.
//
// TransformFeedback.cpp: Implements the es2::TransformFeedback class
#include "TransformFeedback.h"
#include "Buffer.h"
namespace es2
{
TransformFeedback::TransformFeedback(GLuint name) : Object(name), mActive(false), mPaused(false)
{
mGenericBuffer = NULL;
}
Buffer* TransformFeedback::getGenericBuffer() const
{
return mGenericBuffer;
}
Buffer* TransformFeedback::getBuffer(GLuint index) const
{
return mBuffer[index];
}
bool TransformFeedback::isActive() const
{
return mActive;
}
bool TransformFeedback::isPaused() const
{
return mPaused;
}
GLenum TransformFeedback::primitiveMode() const
{
return mPrimitiveMode;
}
void TransformFeedback::begin(GLenum primitiveMode)
{
mActive = true; mPrimitiveMode = primitiveMode;
}
void TransformFeedback::end()
{
mActive = false;
}
void TransformFeedback::setPaused(bool paused)
{
mPaused = paused;
}
void TransformFeedback::setGenericBuffer(Buffer* buffer)
{
mGenericBuffer = buffer;
}
void TransformFeedback::setBuffer(GLuint index, Buffer* buffer)
{
mBuffer[index] = buffer;
}
void TransformFeedback::setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size)
{
mBuffer[index] = buffer;
if(buffer)
{
buffer->mapRange(offset, size, buffer->access());
}
}
}
// SwiftShader Software Renderer
//
// Copyright(c) 2015 Google Inc.
//
// All rights reserved. No part of this software may be copied, distributed, transmitted,
// transcribed, stored in a retrieval system, translated into any human or computer
// language by any means, or disclosed to third parties without the explicit written
// agreement of Google Inc. Without such an agreement, no rights or licenses, express
// or implied, including but not limited to any patent rights, are granted to you.
//
// TransformFeedback.h: Defines the es2::TransformFeedback class
#ifndef LIBGLESV2_TRANSFORM_FEEDBACK_H_
#define LIBGLESV2_TRANSFORM_FEEDBACK_H_
#include "common/Object.hpp"
#include "Renderer/Renderer.hpp"
#define GL_APICALL
#include <GLES2/gl2.h>
namespace es2
{
class Buffer;
class TransformFeedback : public gl::Object
{
public:
// FIXME: Change this when implementing transform feedback
TransformFeedback(GLuint name);
Buffer* getGenericBuffer() const;
Buffer* getBuffer(GLuint index) const;
bool isActive() const;
bool isPaused() const;
GLenum primitiveMode() const;
void setGenericBuffer(Buffer* buffer);
void setBuffer(GLuint index, Buffer* buffer);
void setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size);
void begin(GLenum primitiveMode);
void end();
void setPaused(bool paused);
private:
gl::BindingPointer<Buffer> mGenericBuffer;
gl::BindingPointer<Buffer> mBuffer[MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS];
bool mActive;
bool mPaused;
GLenum mPrimitiveMode;
};
}
#endif // LIBGLESV2_TRANSFORM_FEEDBACK_H_
// SwiftShader Software Renderer
//
// Copyright(c) 2015 Google Inc.
//
// All rights reserved. No part of this software may be copied, distributed, transmitted,
// transcribed, stored in a retrieval system, translated into any human or computer
// language by any means, or disclosed to third parties without the explicit written
// agreement of Google Inc. Without such an agreement, no rights or licenses, express
// or implied, including but not limited to any patent rights, are granted to you.
//
// VertexArray.h: Defines the es2::VertexArray class
#ifndef LIBGLESV2_VERTEX_ARRAY_H_
#define LIBGLESV2_VERTEX_ARRAY_H_
#include "common/Object.hpp"
#include "Renderer/Renderer.hpp"
#define GL_APICALL
#include <GLES2/gl2.h>
namespace es2
{
class VertexArray : public gl::Object
{
};
}
#endif // LIBGLESV2_VERTEX_ARRAY_H_
......@@ -358,10 +358,14 @@
<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" />
......
......@@ -337,6 +337,7 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Plat
<ClCompile Include="ResourceManager.cpp" />
<ClCompile Include="Shader.cpp" />
<ClCompile Include="Texture.cpp" />
<ClCompile Include="TransformFeedback.cpp" />
<ClCompile Include="utilities.cpp" />
<ClCompile Include="VertexDataManager.cpp" />
</ItemGroup>
......@@ -361,9 +362,12 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Plat
<ClInclude Include="Renderbuffer.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="ResourceManager.h" />
<ClInclude Include="Sampler.h" />
<ClInclude Include="Shader.h" />
<ClInclude Include="Texture.h" />
<ClInclude Include="TransformFeedback.h" />
<ClInclude Include="utilities.h" />
<ClInclude Include="VertexArray.h" />
<ClInclude Include="VertexDataManager.h" />
</ItemGroup>
<ItemGroup>
......
......@@ -74,6 +74,9 @@
<ClCompile Include="libGLESv3.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TransformFeedback.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Buffer.h">
......@@ -148,6 +151,15 @@
<ClInclude Include="..\common\NameSpace.hpp">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Sampler.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="TransformFeedback.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="VertexArray.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="libGLESv2.rc" />
......
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