Added OpenGL ES 3.0 parameters to buffers and textures

Added parameters to support:
- Mapping a subset of a buffer
- New texture features like swizzling, min/max LOD,
  texture comparison modes, etc.

Change-Id: Iffd961a3aeab33cb95892f93d78d3888ce60e401
Reviewed-on: https://swiftshader-review.googlesource.com/2780
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/OpenGL/libGLESv2/Buffer.cpp b/src/OpenGL/libGLESv2/Buffer.cpp
index 5fb1c6b..b162a5f 100644
--- a/src/OpenGL/libGLESv2/Buffer.cpp
+++ b/src/OpenGL/libGLESv2/Buffer.cpp
@@ -27,6 +27,10 @@
     mContents = 0;
     mSize = 0;
     mUsage = GL_DYNAMIC_DRAW;
+	mIsMapped = false;
+	mOffset = 0;
+	mLength = 0;
+	mAccess = 0;
 }
 
 Buffer::~Buffer()
@@ -75,6 +79,33 @@
 	}
 }
 
+void* Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+	if(mContents)
+	{
+		char* buffer = (char*)mContents->lock(sw::PUBLIC);
+		mIsMapped = true;
+		mOffset = offset;
+		mLength = length;
+		mAccess = access;
+		return buffer + offset;
+	}
+	return nullptr;
+}
+
+bool Buffer::unmap()
+{
+	if(mContents)
+	{
+		mContents->unlock();
+	}
+	mIsMapped = false;
+	mOffset = 0;
+	mLength = 0;
+	mAccess = 0;
+	return true;
+}
+
 sw::Resource *Buffer::getResource()
 {
 	return mContents;
diff --git a/src/OpenGL/libGLESv2/Buffer.h b/src/OpenGL/libGLESv2/Buffer.h
index 613dacc..279227e 100644
--- a/src/OpenGL/libGLESv2/Buffer.h
+++ b/src/OpenGL/libGLESv2/Buffer.h
@@ -40,6 +40,14 @@
 	const void *data() { return mContents ? mContents->data() : 0; }

     size_t size() const { return mSize; }

     GLenum usage() const { return mUsage; }

+	bool isMapped() const { return mIsMapped; }

+	GLintptr offset() const { return mOffset; }

+	GLsizeiptr length() const { return mLength; }

+	GLbitfield access() const { return mAccess; }

+

+	void* mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access);

+	bool unmap();

+	void flushMappedRange(GLintptr offset, GLsizeiptr length) {}

 

 	sw::Resource *getResource();

 

@@ -47,6 +55,10 @@
     sw::Resource *mContents;

     size_t mSize;

     GLenum mUsage;

+	bool mIsMapped;

+	GLintptr mOffset;

+	GLsizeiptr mLength;

+	GLbitfield mAccess;

 };

 

 }

diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp
index 17fabf4..3d84215 100644
--- a/src/OpenGL/libGLESv2/Texture.cpp
+++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -36,6 +36,17 @@
     mWrapT = GL_REPEAT;

 	mWrapR = GL_REPEAT;

 	mMaxAnisotropy = 1.0f;

+	mBaseLevel = 0;

+	mCompareFunc = GL_LEQUAL;

+	mCompareMode = GL_NONE;

+	mImmutableFormat = GL_FALSE;

+	mMaxLevel = 1000;

+	mMaxLOD = 1000;

+	mMinLOD = -1000;

+	mSwizzleR = GL_RED;

+	mSwizzleG = GL_GREEN;

+	mSwizzleB = GL_BLUE;

+	mSwizzleA = GL_ALPHA;

 

 	resource = new sw::Resource(0);

 }

@@ -165,6 +176,136 @@
     return true;

 }

 

+bool Texture::setBaseLevel(GLint baseLevel)

+{

+	mBaseLevel = baseLevel;

+	return true;

+}

+

+bool Texture::setCompareFunc(GLenum compareFunc)

+{

+	switch(compareFunc)

+	{

+	case GL_LEQUAL:

+	case GL_GEQUAL:

+	case GL_LESS:

+	case GL_GREATER:

+	case GL_EQUAL:

+	case GL_NOTEQUAL:

+	case GL_ALWAYS:

+	case GL_NEVER:

+		mCompareFunc = compareFunc;

+		return true;

+	default:

+		return false;

+	}

+}

+

+bool Texture::setCompareMode(GLenum compareMode)

+{

+	switch(compareMode)

+	{

+	case GL_COMPARE_REF_TO_TEXTURE:

+	case GL_NONE:

+		mCompareMode = compareMode;

+		return true;

+	default:

+		return false;

+	}

+}

+

+bool Texture::setImmutableFormat(GLboolean immutableFormat)

+{

+	mImmutableFormat = immutableFormat;

+	return true;

+}

+

+bool Texture::setMaxLevel(GLint maxLevel)

+{

+	mMaxLevel = maxLevel;

+	return true;

+}

+

+bool Texture::setMaxLOD(GLfloat maxLOD)

+{

+	mMaxLOD = maxLOD;

+	return true;

+}

+

+bool Texture::setMinLOD(GLfloat minLOD)

+{

+	mMinLOD = minLOD;

+	return true;

+}

+

+bool Texture::setSwizzleR(GLenum swizzleR)

+{

+	switch(swizzleR)

+	{

+	case GL_RED:

+	case GL_GREEN:

+	case GL_BLUE:

+	case GL_ALPHA:

+	case GL_ZERO:

+	case GL_ONE:

+		mSwizzleR = swizzleR;

+		return true;

+	default:

+		return false;

+	}

+}

+

+bool Texture::setSwizzleG(GLenum swizzleG)

+{

+	switch(swizzleG)

+	{

+	case GL_RED:

+	case GL_GREEN:

+	case GL_BLUE:

+	case GL_ALPHA:

+	case GL_ZERO:

+	case GL_ONE:

+		mSwizzleG = swizzleG;

+		return true;

+	default:

+		return false;

+	}

+}

+

+bool Texture::setSwizzleB(GLenum swizzleB)

+{

+	switch(swizzleB)

+	{

+	case GL_RED:

+	case GL_GREEN:

+	case GL_BLUE:

+	case GL_ALPHA:

+	case GL_ZERO:

+	case GL_ONE:

+		mSwizzleB = swizzleB;

+		return true;

+	default:

+		return false;

+	}

+}

+

+bool Texture::setSwizzleA(GLenum swizzleA)

+{

+	switch(swizzleA)

+	{

+	case GL_RED:

+	case GL_GREEN:

+	case GL_BLUE:

+	case GL_ALPHA:

+	case GL_ZERO:

+	case GL_ONE:

+		mSwizzleA = swizzleA;

+		return true;

+	default:

+		return false;

+	}

+}

+

 GLenum Texture::getMinFilter() const

 {

     return mMinFilter;

@@ -195,6 +336,51 @@
     return mMaxAnisotropy;

 }

 

+GLint Texture::getBaseLevel() const

+{

+	return mBaseLevel;

+}

+GLenum Texture::getCompareFunc() const

+{

+	return mCompareFunc;

+}

+GLenum Texture::getCompareMode() const

+{

+	return mCompareMode;

+}

+GLboolean Texture::getImmutableFormat() const

+{

+	return mImmutableFormat;

+}

+GLint Texture::getMaxLevel() const

+{

+	return mMaxLevel;

+}

+GLfloat Texture::getMaxLOD() const

+{

+	return mMaxLOD;

+}

+GLfloat Texture::getMinLOD() const

+{

+	return mMinLOD;

+}

+GLenum Texture::getSwizzleR() const

+{

+	return mSwizzleR;

+}

+GLenum Texture::getSwizzleG() const

+{

+	return mSwizzleG;

+}

+GLenum Texture::getSwizzleB() const

+{

+	return mSwizzleB;

+}

+GLenum Texture::getSwizzleA() const

+{

+	return mSwizzleA;

+}

+

 GLsizei Texture::getDepth(GLenum target, GLint level) const

 {

 	return 1;

diff --git a/src/OpenGL/libGLESv2/Texture.h b/src/OpenGL/libGLESv2/Texture.h
index cfe70dc..bb6b6b7 100644
--- a/src/OpenGL/libGLESv2/Texture.h
+++ b/src/OpenGL/libGLESv2/Texture.h
@@ -71,6 +71,17 @@
 	bool setWrapT(GLenum wrap);

 	bool setWrapR(GLenum wrap);

 	bool setMaxAnisotropy(GLfloat textureMaxAnisotropy);

+	bool setBaseLevel(GLint baseLevel);

+	bool setCompareFunc(GLenum compareFunc);

+	bool setCompareMode(GLenum compareMode);

+	bool setImmutableFormat(GLboolean immutableFormat);

+	bool setMaxLevel(GLint maxLevel);

+	bool setMaxLOD(GLfloat maxLOD);

+	bool setMinLOD(GLfloat minLOD);

+	bool setSwizzleR(GLenum swizzleR);

+	bool setSwizzleG(GLenum swizzleG);

+	bool setSwizzleB(GLenum swizzleB);

+	bool setSwizzleA(GLenum swizzleA);

 

     GLenum getMinFilter() const;

     GLenum getMagFilter() const;

@@ -78,6 +89,17 @@
 	GLenum getWrapT() const;

 	GLenum getWrapR() const;

 	GLfloat getMaxAnisotropy() const;

+	GLint getBaseLevel() const;

+	GLenum getCompareFunc() const;

+	GLenum getCompareMode() const;

+	GLboolean getImmutableFormat() const;

+	GLint getMaxLevel() const;

+	GLfloat getMaxLOD() const;

+	GLfloat getMinLOD() const;

+	GLenum getSwizzleR() const;

+	GLenum getSwizzleG() const;

+	GLenum getSwizzleB() const;

+	GLenum getSwizzleA() const;

 

     virtual GLsizei getWidth(GLenum target, GLint level) const = 0;

 	virtual GLsizei getHeight(GLenum target, GLint level) const = 0;

@@ -115,6 +137,17 @@
     GLenum mWrapT;

     GLenum mWrapR;

 	GLfloat mMaxAnisotropy;

+	GLint mBaseLevel;

+	GLenum mCompareFunc;

+	GLenum mCompareMode;

+	GLboolean mImmutableFormat;

+	GLint mMaxLevel;

+	GLfloat mMaxLOD;

+	GLfloat mMinLOD;

+	GLenum mSwizzleR;

+	GLenum mSwizzleG;

+	GLenum mSwizzleB;

+	GLenum mSwizzleA;

 

 	sw::Resource *resource;

 };