Commit 3be576c0 by Nicolas Capens Committed by Nicolas Capens

Refactor read buffer access.

The read buffer state is part of the framebuffer object, so determining the index is moved to the Framebuffer class. Also make sure GL_NONE is handled without causing invalid access by using GL_INVALID_INDEX. Change-Id: I26476024cd8dd820b0e3f53d9c3dd5a7d46c082e Reviewed-on: https://swiftshader-review.googlesource.com/14748Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent e4bdbc3c
......@@ -769,20 +769,6 @@ void Context::setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs)
}
}
GLuint Context::getReadFramebufferColorIndex() const
{
GLenum buf = getReadFramebuffer()->getReadBuffer();
switch(buf)
{
case GL_BACK:
return 0;
case GL_NONE:
return GL_INVALID_INDEX;
default:
return buf - GL_COLOR_ATTACHMENT0;
}
}
GLuint Context::getArrayBufferName() const
{
return mState.arrayBuffer.name();
......@@ -4118,7 +4104,7 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1
if(mask & GL_COLOR_BUFFER_BIT)
{
GLenum readColorbufferType = readFramebuffer->getColorbufferType(getReadFramebufferColorIndex());
GLenum readColorbufferType = readFramebuffer->getReadBufferType();
GLenum drawColorbufferType = drawFramebuffer->getColorbufferType(0);
const bool validReadType = readColorbufferType == GL_TEXTURE_2D || Framebuffer::IsRenderbuffer(readColorbufferType);
const bool validDrawType = drawColorbufferType == GL_TEXTURE_2D || Framebuffer::IsRenderbuffer(drawColorbufferType);
......
......@@ -515,7 +515,6 @@ public:
void setFramebufferReadBuffer(GLenum buf);
void setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs);
GLuint getReadFramebufferColorIndex() const;
GLuint getActiveQuery(GLenum target) const;
......
......@@ -169,11 +169,14 @@ void Framebuffer::detachRenderbuffer(GLuint renderbuffer)
// caller must Release() the returned surface
egl::Image *Framebuffer::getRenderTarget(GLuint index)
{
Renderbuffer *colorbuffer = mColorbufferPointer[index];
if(colorbuffer)
if(index < MAX_COLOR_ATTACHMENTS)
{
return colorbuffer->getRenderTarget();
Renderbuffer *colorbuffer = mColorbufferPointer[index];
if(colorbuffer)
{
return colorbuffer->getRenderTarget();
}
}
return nullptr;
......@@ -181,8 +184,7 @@ egl::Image *Framebuffer::getRenderTarget(GLuint index)
egl::Image *Framebuffer::getReadRenderTarget()
{
Context *context = getContext();
return getRenderTarget(context->getReadFramebufferColorIndex());
return getRenderTarget(getReadBufferIndex());
}
// Increments refcount on surface.
......@@ -220,8 +222,7 @@ Renderbuffer *Framebuffer::getColorbuffer(GLuint index) const
Renderbuffer *Framebuffer::getReadColorbuffer() const
{
Context *context = getContext();
return getColorbuffer(context->getReadFramebufferColorIndex());
return getColorbuffer(getReadBufferIndex());
}
Renderbuffer *Framebuffer::getDepthbuffer() const
......@@ -234,6 +235,16 @@ Renderbuffer *Framebuffer::getStencilbuffer() const
return mStencilbufferPointer;
}
GLenum Framebuffer::getReadBufferType()
{
if(readBuffer == GL_NONE)
{
return GL_NONE;
}
return mColorbufferType[getReadBufferIndex()];
}
GLenum Framebuffer::getColorbufferType(GLuint index)
{
return mColorbufferType[index];
......@@ -654,6 +665,19 @@ GLenum Framebuffer::getDepthReadType() const
return GL_NONE;
}
GLuint Framebuffer::getReadBufferIndex() const
{
switch(readBuffer)
{
case GL_BACK:
return 0;
case GL_NONE:
return GL_INVALID_INDEX;
default:
return readBuffer - GL_COLOR_ATTACHMENT0;
}
}
DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
{
GLenum defaultRenderbufferType = egl::getClientVersion() < 3 ? GL_RENDERBUFFER : GL_FRAMEBUFFER_DEFAULT;
......
......@@ -61,6 +61,7 @@ public:
Renderbuffer *getDepthbuffer() const;
Renderbuffer *getStencilbuffer() const;
GLenum getReadBufferType();
GLenum getColorbufferType(GLuint index);
GLenum getDepthbufferType();
GLenum getStencilbufferType();
......@@ -88,11 +89,14 @@ public:
static bool IsRenderbuffer(GLenum type);
protected:
GLenum mColorbufferType[MAX_COLOR_ATTACHMENTS];
gl::BindingPointer<Renderbuffer> mColorbufferPointer[MAX_COLOR_ATTACHMENTS];
GLuint getReadBufferIndex() const;
GLenum readBuffer;
GLenum drawBuffer[MAX_COLOR_ATTACHMENTS];
GLenum mColorbufferType[MAX_COLOR_ATTACHMENTS];
gl::BindingPointer<Renderbuffer> mColorbufferPointer[MAX_COLOR_ATTACHMENTS];
GLenum mDepthbufferType;
gl::BindingPointer<Renderbuffer> mDepthbufferPointer;
......
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