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) ...@@ -277,7 +277,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 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; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
......
...@@ -191,6 +191,11 @@ GLsizei RenderbufferTexture3D::getHeight() const ...@@ -191,6 +191,11 @@ GLsizei RenderbufferTexture3D::getHeight() const
return mTexture3D->getHeight(mTexture3D->getTarget(), mLevel); return mTexture3D->getHeight(mTexture3D->getTarget(), mLevel);
} }
GLsizei RenderbufferTexture3D::getDepth() const
{
return mTexture3D->getDepth(mTexture3D->getTarget(), mLevel);
}
GLenum RenderbufferTexture3D::getFormat() const GLenum RenderbufferTexture3D::getFormat() const
{ {
return mTexture3D->getFormat(mTexture3D->getTarget(), mLevel); return mTexture3D->getFormat(mTexture3D->getTarget(), mLevel);
...@@ -332,6 +337,11 @@ GLsizei Renderbuffer::getHeight() const ...@@ -332,6 +337,11 @@ GLsizei Renderbuffer::getHeight() const
return mInstance->getHeight(); return mInstance->getHeight();
} }
GLsizei Renderbuffer::getDepth() const
{
return mInstance->getDepth();
}
GLint Renderbuffer::getLayer() const GLint Renderbuffer::getLayer() const
{ {
return mInstance->getLayer(); return mInstance->getLayer();
......
...@@ -47,6 +47,7 @@ public: ...@@ -47,6 +47,7 @@ public:
virtual GLsizei getWidth() const = 0; virtual GLsizei getWidth() const = 0;
virtual GLsizei getHeight() const = 0; virtual GLsizei getHeight() const = 0;
virtual GLsizei getDepth() const { return 1; }
virtual GLint getLayer() const { return 0; } virtual GLint getLayer() const { return 0; }
virtual GLenum getFormat() const = 0; virtual GLenum getFormat() const = 0;
virtual sw::Format getInternalFormat() const = 0; virtual sw::Format getInternalFormat() const = 0;
...@@ -101,6 +102,7 @@ public: ...@@ -101,6 +102,7 @@ public:
virtual GLsizei getWidth() const; virtual GLsizei getWidth() const;
virtual GLsizei getHeight() const; virtual GLsizei getHeight() const;
virtual GLsizei getDepth() const;
virtual GLint getLayer() const { return mLayer; } virtual GLint getLayer() const { return mLayer; }
virtual GLenum getFormat() const; virtual GLenum getFormat() const;
virtual sw::Format getInternalFormat() const; virtual sw::Format getInternalFormat() const;
...@@ -189,6 +191,7 @@ public: ...@@ -189,6 +191,7 @@ public:
GLsizei getWidth() const; GLsizei getWidth() const;
GLsizei getHeight() const; GLsizei getHeight() const;
GLsizei getDepth() const;
GLint getLayer() const; GLint getLayer() const;
GLenum getFormat() const; GLenum getFormat() const;
sw::Format getInternalFormat() const; sw::Format getInternalFormat() const;
......
...@@ -1583,6 +1583,7 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta ...@@ -1583,6 +1583,7 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta
if(context) if(context)
{ {
Texture* textureObject = context->getTexture(texture); Texture* textureObject = context->getTexture(texture);
GLenum textarget = GL_NONE;
if(texture != 0) if(texture != 0)
{ {
if(!textureObject) if(!textureObject)
...@@ -1590,7 +1591,8 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta ...@@ -1590,7 +1591,8 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
switch(textureObject->getTarget()) textarget = textureObject->getTarget();
switch(textarget)
{ {
case GL_TEXTURE_3D: case GL_TEXTURE_3D:
case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_2D_ARRAY:
...@@ -1603,7 +1605,7 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta ...@@ -1603,7 +1605,7 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(textureObject->isCompressed(target, level)) if(textureObject->isCompressed(textarget, level))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
...@@ -1623,6 +1625,11 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta ...@@ -1623,6 +1625,11 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(!framebuffer)
{
return error(GL_INVALID_OPERATION);
}
switch(attachment) switch(attachment)
{ {
case GL_COLOR_ATTACHMENT0: case GL_COLOR_ATTACHMENT0:
...@@ -1657,33 +1664,17 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta ...@@ -1657,33 +1664,17 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum atta
case GL_COLOR_ATTACHMENT29: case GL_COLOR_ATTACHMENT29:
case GL_COLOR_ATTACHMENT30: case GL_COLOR_ATTACHMENT30:
case GL_COLOR_ATTACHMENT31: case GL_COLOR_ATTACHMENT31:
if(!framebuffer || framebuffer->getColorbufferName(attachment - GL_COLOR_ATTACHMENT0) == 0) framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0, level, layer);
{
return error(GL_INVALID_OPERATION);
}
framebuffer->setColorbuffer(target, texture, attachment - GL_COLOR_ATTACHMENT0, layer, level);
break; break;
case GL_DEPTH_ATTACHMENT: case GL_DEPTH_ATTACHMENT:
if(!framebuffer || framebuffer->getDepthbufferName() == 0) framebuffer->setDepthbuffer(textarget, texture, level, layer);
{
return error(GL_INVALID_OPERATION);
}
framebuffer->setDepthbuffer(target, texture, layer, level);
break; break;
case GL_STENCIL_ATTACHMENT: case GL_STENCIL_ATTACHMENT:
if(!framebuffer || framebuffer->getStencilbufferName() == 0) framebuffer->setStencilbuffer(textarget, texture, level, layer);
{
return error(GL_INVALID_OPERATION);
}
framebuffer->setStencilbuffer(target, texture, layer, level);
break; break;
case GL_DEPTH_STENCIL_ATTACHMENT: case GL_DEPTH_STENCIL_ATTACHMENT:
if(!framebuffer || framebuffer->getDepthbufferName() == 0 || framebuffer->getStencilbufferName() == 0) framebuffer->setDepthbuffer(textarget, texture, level, layer);
{ framebuffer->setStencilbuffer(textarget, texture, level, layer);
return error(GL_INVALID_OPERATION);
}
framebuffer->setDepthbuffer(target, texture, layer, level);
framebuffer->setStencilbuffer(target, texture, layer, level);
break; break;
default: default:
return error(GL_INVALID_ENUM); 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