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) ...@@ -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 GLuint Context::getArrayBufferName() const
{ {
return mState.arrayBuffer.name(); return mState.arrayBuffer.name();
...@@ -4118,7 +4104,7 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1 ...@@ -4118,7 +4104,7 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1
if(mask & GL_COLOR_BUFFER_BIT) if(mask & GL_COLOR_BUFFER_BIT)
{ {
GLenum readColorbufferType = readFramebuffer->getColorbufferType(getReadFramebufferColorIndex()); GLenum readColorbufferType = readFramebuffer->getReadBufferType();
GLenum drawColorbufferType = drawFramebuffer->getColorbufferType(0); GLenum drawColorbufferType = drawFramebuffer->getColorbufferType(0);
const bool validReadType = readColorbufferType == GL_TEXTURE_2D || Framebuffer::IsRenderbuffer(readColorbufferType); const bool validReadType = readColorbufferType == GL_TEXTURE_2D || Framebuffer::IsRenderbuffer(readColorbufferType);
const bool validDrawType = drawColorbufferType == GL_TEXTURE_2D || Framebuffer::IsRenderbuffer(drawColorbufferType); const bool validDrawType = drawColorbufferType == GL_TEXTURE_2D || Framebuffer::IsRenderbuffer(drawColorbufferType);
......
...@@ -515,7 +515,6 @@ public: ...@@ -515,7 +515,6 @@ public:
void setFramebufferReadBuffer(GLenum buf); void setFramebufferReadBuffer(GLenum buf);
void setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs); void setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs);
GLuint getReadFramebufferColorIndex() const;
GLuint getActiveQuery(GLenum target) const; GLuint getActiveQuery(GLenum target) const;
......
...@@ -169,20 +169,22 @@ void Framebuffer::detachRenderbuffer(GLuint renderbuffer) ...@@ -169,20 +169,22 @@ void Framebuffer::detachRenderbuffer(GLuint renderbuffer)
// caller must Release() the returned surface // caller must Release() the returned surface
egl::Image *Framebuffer::getRenderTarget(GLuint index) egl::Image *Framebuffer::getRenderTarget(GLuint index)
{ {
if(index < MAX_COLOR_ATTACHMENTS)
{
Renderbuffer *colorbuffer = mColorbufferPointer[index]; Renderbuffer *colorbuffer = mColorbufferPointer[index];
if(colorbuffer) if(colorbuffer)
{ {
return colorbuffer->getRenderTarget(); return colorbuffer->getRenderTarget();
} }
}
return nullptr; return nullptr;
} }
egl::Image *Framebuffer::getReadRenderTarget() egl::Image *Framebuffer::getReadRenderTarget()
{ {
Context *context = getContext(); return getRenderTarget(getReadBufferIndex());
return getRenderTarget(context->getReadFramebufferColorIndex());
} }
// Increments refcount on surface. // Increments refcount on surface.
...@@ -220,8 +222,7 @@ Renderbuffer *Framebuffer::getColorbuffer(GLuint index) const ...@@ -220,8 +222,7 @@ Renderbuffer *Framebuffer::getColorbuffer(GLuint index) const
Renderbuffer *Framebuffer::getReadColorbuffer() const Renderbuffer *Framebuffer::getReadColorbuffer() const
{ {
Context *context = getContext(); return getColorbuffer(getReadBufferIndex());
return getColorbuffer(context->getReadFramebufferColorIndex());
} }
Renderbuffer *Framebuffer::getDepthbuffer() const Renderbuffer *Framebuffer::getDepthbuffer() const
...@@ -234,6 +235,16 @@ Renderbuffer *Framebuffer::getStencilbuffer() const ...@@ -234,6 +235,16 @@ Renderbuffer *Framebuffer::getStencilbuffer() const
return mStencilbufferPointer; return mStencilbufferPointer;
} }
GLenum Framebuffer::getReadBufferType()
{
if(readBuffer == GL_NONE)
{
return GL_NONE;
}
return mColorbufferType[getReadBufferIndex()];
}
GLenum Framebuffer::getColorbufferType(GLuint index) GLenum Framebuffer::getColorbufferType(GLuint index)
{ {
return mColorbufferType[index]; return mColorbufferType[index];
...@@ -654,6 +665,19 @@ GLenum Framebuffer::getDepthReadType() const ...@@ -654,6 +665,19 @@ GLenum Framebuffer::getDepthReadType() const
return GL_NONE; 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) DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
{ {
GLenum defaultRenderbufferType = egl::getClientVersion() < 3 ? GL_RENDERBUFFER : GL_FRAMEBUFFER_DEFAULT; GLenum defaultRenderbufferType = egl::getClientVersion() < 3 ? GL_RENDERBUFFER : GL_FRAMEBUFFER_DEFAULT;
......
...@@ -61,6 +61,7 @@ public: ...@@ -61,6 +61,7 @@ public:
Renderbuffer *getDepthbuffer() const; Renderbuffer *getDepthbuffer() const;
Renderbuffer *getStencilbuffer() const; Renderbuffer *getStencilbuffer() const;
GLenum getReadBufferType();
GLenum getColorbufferType(GLuint index); GLenum getColorbufferType(GLuint index);
GLenum getDepthbufferType(); GLenum getDepthbufferType();
GLenum getStencilbufferType(); GLenum getStencilbufferType();
...@@ -88,11 +89,14 @@ public: ...@@ -88,11 +89,14 @@ public:
static bool IsRenderbuffer(GLenum type); static bool IsRenderbuffer(GLenum type);
protected: protected:
GLenum mColorbufferType[MAX_COLOR_ATTACHMENTS]; GLuint getReadBufferIndex() const;
gl::BindingPointer<Renderbuffer> mColorbufferPointer[MAX_COLOR_ATTACHMENTS];
GLenum readBuffer; GLenum readBuffer;
GLenum drawBuffer[MAX_COLOR_ATTACHMENTS]; GLenum drawBuffer[MAX_COLOR_ATTACHMENTS];
GLenum mColorbufferType[MAX_COLOR_ATTACHMENTS];
gl::BindingPointer<Renderbuffer> mColorbufferPointer[MAX_COLOR_ATTACHMENTS];
GLenum mDepthbufferType; GLenum mDepthbufferType;
gl::BindingPointer<Renderbuffer> mDepthbufferPointer; 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