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);