FramebufferTextureLayer fix

Fixed a few things related to FramebufferTextureLayer:
- Added layer validation to make sure it does not exceed
  the size of the 3D texture's or 2D array's depth.
- Fixed frambuffer target / texture target confusion.
- Removed bad validation.
- Fixed last 2 arguments of set[insert type]Buffer calls
  (layer and level) which were inverted.

Change-Id: Ie1f2cb595d8b9abfee27bcf834c535f7e023e3ee
Reviewed-on: https://swiftshader-review.googlesource.com/4343
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 6473473..5e4e808 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/Framebuffer.cpp
@@ -277,7 +277,7 @@
 				return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 			}
 
-			if(colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0)
+			if(colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0 || (colorbuffer->getDepth() <= colorbuffer->getLayer()))
 			{
 				return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 			}
diff --git a/src/OpenGL/libGLESv2/Renderbuffer.cpp b/src/OpenGL/libGLESv2/Renderbuffer.cpp
index 2f641f6..9118713 100644
--- a/src/OpenGL/libGLESv2/Renderbuffer.cpp
+++ b/src/OpenGL/libGLESv2/Renderbuffer.cpp
@@ -191,6 +191,11 @@
 	return mTexture3D->getHeight(mTexture3D->getTarget(), mLevel);
 }
 
+GLsizei RenderbufferTexture3D::getDepth() const
+{
+	return mTexture3D->getDepth(mTexture3D->getTarget(), mLevel);
+}
+
 GLenum RenderbufferTexture3D::getFormat() const
 {
 	return mTexture3D->getFormat(mTexture3D->getTarget(), mLevel);
@@ -332,6 +337,11 @@
 	return mInstance->getHeight();
 }
 
+GLsizei Renderbuffer::getDepth() const
+{
+	return mInstance->getDepth();
+}
+
 GLint Renderbuffer::getLayer() const
 {
 	return mInstance->getLayer();
diff --git a/src/OpenGL/libGLESv2/Renderbuffer.h b/src/OpenGL/libGLESv2/Renderbuffer.h
index 8f0f019..86715f9 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 GLsizei getDepth() const { return 1; }

 	virtual GLint getLayer() const { return 0; }

 	virtual GLenum getFormat() const = 0;

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

@@ -101,6 +102,7 @@
 

 	virtual GLsizei getWidth() const;

 	virtual GLsizei getHeight() const;

+	virtual GLsizei getDepth() const;

 	virtual GLint getLayer() const { return mLayer; }

 	virtual GLenum getFormat() const;

 	virtual sw::Format getInternalFormat() const;

@@ -189,6 +191,7 @@
 

 	GLsizei getWidth() const;

 	GLsizei getHeight() const;

+	GLsizei getDepth() const;

 	GLint getLayer() const;

 	GLenum getFormat() const;

 	sw::Format getInternalFormat() const;

diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 5c5e1c2..98397ec 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -1583,6 +1583,7 @@
 	if(context)

 	{

 		Texture* textureObject = context->getTexture(texture);

+		GLenum textarget = GL_NONE;

 		if(texture != 0)

 		{

 			if(!textureObject)

@@ -1590,7 +1591,8 @@
 				return error(GL_INVALID_VALUE);

 			}

 

-			switch(textureObject->getTarget())

+			textarget = textureObject->getTarget();

+			switch(textarget)

 			{

 			case GL_TEXTURE_3D:

 			case GL_TEXTURE_2D_ARRAY:

@@ -1603,7 +1605,7 @@
 				return error(GL_INVALID_OPERATION);

 			}

 

-			if(textureObject->isCompressed(target, level))

+			if(textureObject->isCompressed(textarget, level))

 			{

 				return error(GL_INVALID_OPERATION);

 			}

@@ -1623,6 +1625,11 @@
 			return error(GL_INVALID_ENUM);

 		}

 

+		if(!framebuffer)

+		{

+			return error(GL_INVALID_OPERATION);

+		}

+

 		switch(attachment)

 		{

 		case GL_COLOR_ATTACHMENT0:

@@ -1657,33 +1664,17 @@
 		case GL_COLOR_ATTACHMENT29:

 		case GL_COLOR_ATTACHMENT30:

 		case GL_COLOR_ATTACHMENT31:

-			if(!framebuffer || framebuffer->getColorbufferName(attachment - GL_COLOR_ATTACHMENT0) == 0)

-			{

-				return error(GL_INVALID_OPERATION);

-			}

-			framebuffer->setColorbuffer(target, texture, attachment - GL_COLOR_ATTACHMENT0, layer, level);

+			framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0, level, layer);

 			break;

 		case GL_DEPTH_ATTACHMENT:

-			if(!framebuffer || framebuffer->getDepthbufferName() == 0)

-			{

-				return error(GL_INVALID_OPERATION);

-			}

-			framebuffer->setDepthbuffer(target, texture, layer, level);

+			framebuffer->setDepthbuffer(textarget, texture, level, layer);

 			break;

 		case GL_STENCIL_ATTACHMENT:

-			if(!framebuffer || framebuffer->getStencilbufferName() == 0)

-			{

-				return error(GL_INVALID_OPERATION);

-			}

-			framebuffer->setStencilbuffer(target, texture, layer, level);

+			framebuffer->setStencilbuffer(textarget, texture, level, layer);

 			break;

 		case GL_DEPTH_STENCIL_ATTACHMENT:

-			if(!framebuffer || framebuffer->getDepthbufferName() == 0 || framebuffer->getStencilbufferName() == 0)

-			{

-				return error(GL_INVALID_OPERATION);

-			}

-			framebuffer->setDepthbuffer(target, texture, layer, level);

-			framebuffer->setStencilbuffer(target, texture, layer, level);

+			framebuffer->setDepthbuffer(textarget, texture, level, layer);

+			framebuffer->setStencilbuffer(textarget, texture, level, layer);

 			break;

 		default:

 			return error(GL_INVALID_ENUM);