Commit e23029a7 by Alexis Hetu Committed by Alexis Hétu

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/4343Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 3641d2ea
......@@ -277,7 +277,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
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;
}
......
......@@ -191,6 +191,11 @@ GLsizei RenderbufferTexture3D::getHeight() const
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 @@ GLsizei Renderbuffer::getHeight() const
return mInstance->getHeight();
}
GLsizei Renderbuffer::getDepth() const
{
return mInstance->getDepth();
}
GLint Renderbuffer::getLayer() const
{
return mInstance->getLayer();
......
......@@ -47,6 +47,7 @@ public:
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 @@ public:
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 @@ public:
GLsizei getWidth() const;
GLsizei getHeight() const;
GLsizei getDepth() const;
GLint getLayer() const;
GLenum getFormat() const;
sw::Format getInternalFormat() const;
......
......@@ -1583,6 +1583,7 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta
if(context)
{
Texture* textureObject = context->getTexture(texture);
GLenum textarget = GL_NONE;
if(texture != 0)
{
if(!textureObject)
......@@ -1590,7 +1591,8 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta
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 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta
return error(GL_INVALID_OPERATION);
}
if(textureObject->isCompressed(target, level))
if(textureObject->isCompressed(textarget, level))
{
return error(GL_INVALID_OPERATION);
}
......@@ -1623,6 +1625,11 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta
return error(GL_INVALID_ENUM);
}
if(!framebuffer)
{
return error(GL_INVALID_OPERATION);
}
switch(attachment)
{
case GL_COLOR_ATTACHMENT0:
......@@ -1657,33 +1664,17 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta
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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment