Framebuffer Layer query

Added implementation for querying
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER in
GetFramebufferAttachmentParameteriv.

Change-Id: Ib25ba51bf68c9d979f80cc65ba7059366b5f1ae4
Reviewed-on: https://swiftshader-review.googlesource.com/3541
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp
index 2fe1320..9ae0381 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/Framebuffer.cpp
@@ -220,6 +220,12 @@
 	return mStencilbufferPointer.name();
 }
 
+GLint Framebuffer::getColorbufferLayer(GLuint index)
+{
+	Renderbuffer *colorbuffer = mColorbufferPointer[index];
+	return (colorbuffer != nullptr) ? colorbuffer->getLayer() : 0;
+}
+
 bool Framebuffer::hasStencil()
 {
 	if(mStencilbufferType != GL_NONE)
diff --git a/src/OpenGL/libGLESv2/Framebuffer.h b/src/OpenGL/libGLESv2/Framebuffer.h
index 8db2ad7..03f7c4f 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.h
+++ b/src/OpenGL/libGLESv2/Framebuffer.h
@@ -59,6 +59,8 @@
     GLuint getDepthbufferName();

     GLuint getStencilbufferName();

 

+	GLint getColorbufferLayer(GLuint index);

+

     bool hasStencil();

 

 	virtual GLenum completeness();

diff --git a/src/OpenGL/libGLESv2/Renderbuffer.cpp b/src/OpenGL/libGLESv2/Renderbuffer.cpp
index 3d8cc3e..9894e57 100644
--- a/src/OpenGL/libGLESv2/Renderbuffer.cpp
+++ b/src/OpenGL/libGLESv2/Renderbuffer.cpp
@@ -332,6 +332,11 @@
 	return mInstance->getHeight();
 }
 
+GLint Renderbuffer::getLayer() const
+{
+	return mInstance->getLayer();
+}
+
 GLenum Renderbuffer::getFormat() const
 {
 	return mInstance->getFormat();
diff --git a/src/OpenGL/libGLESv2/Renderbuffer.h b/src/OpenGL/libGLESv2/Renderbuffer.h
index 0bea04f..8f0f019 100644
--- a/src/OpenGL/libGLESv2/Renderbuffer.h
+++ b/src/OpenGL/libGLESv2/Renderbuffer.h
@@ -47,6 +47,7 @@
 

 	virtual GLsizei getWidth() const = 0;

 	virtual GLsizei getHeight() const = 0;

+	virtual GLint getLayer() const { return 0; }

 	virtual GLenum getFormat() const = 0;

 	virtual sw::Format getInternalFormat() const = 0;

 	virtual GLsizei getSamples() const = 0;

@@ -100,6 +101,7 @@
 

 	virtual GLsizei getWidth() const;

 	virtual GLsizei getHeight() const;

+	virtual GLint getLayer() const { return mLayer; }

 	virtual GLenum getFormat() const;

 	virtual sw::Format getInternalFormat() const;

 	virtual GLsizei getSamples() const;

@@ -187,6 +189,7 @@
 

 	GLsizei getWidth() const;

 	GLsizei getHeight() const;

+	GLint getLayer() const;

 	GLenum getFormat() const;

 	sw::Format getInternalFormat() const;

 	GLuint getRedSize() const;

diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 22f2b65..7e5a369 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -2962,6 +2962,7 @@
 

 		GLenum attachmentType;

 		GLuint attachmentHandle;

+		GLint attachmentLayer = 0;

 		Renderbuffer* renderbuffer = nullptr;

 		switch(attachment)

 		{

@@ -3001,6 +3002,7 @@
 			}

 			attachmentType = framebuffer->getColorbufferType(attachment - GL_COLOR_ATTACHMENT0);

 			attachmentHandle = framebuffer->getColorbufferName(attachment - GL_COLOR_ATTACHMENT0);

+			attachmentLayer = framebuffer->getColorbufferLayer(attachment - GL_COLOR_ATTACHMENT0);

 			renderbuffer = framebuffer->getColorbuffer(attachment - GL_COLOR_ATTACHMENT0);

 			break;

 		case GL_DEPTH:

@@ -3096,6 +3098,13 @@
 				return error(GL_INVALID_ENUM);

 			}

 			break;

+		case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:

+			if(clientVersion >= 3)

+			{

+				*params = attachmentLayer;

+			}

+			else return error(GL_INVALID_ENUM);

+			break;

 		case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:

 			if(clientVersion >= 3)

 			{