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