Commit 48faf80a by Jamie Madill

Use Context caps in Framebuffer completeness check.

This frees the Framebuffer from any dependency on the Renderer. BUG=angle:789 Change-Id: I0e9ae0edf93674e32ae4f6538a934cddbdc804d5 Reviewed-on: https://chromium-review.googlesource.com/225470Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 1e9ae079
...@@ -203,7 +203,7 @@ void Context::makeCurrent(egl::Surface *surface) ...@@ -203,7 +203,7 @@ void Context::makeCurrent(egl::Surface *surface)
rx::RenderbufferImpl *colorbufferZero = mRenderer->createRenderbuffer(swapchain, false); rx::RenderbufferImpl *colorbufferZero = mRenderer->createRenderbuffer(swapchain, false);
rx::RenderbufferImpl *depthStencilbufferZero = mRenderer->createRenderbuffer(swapchain, true); rx::RenderbufferImpl *depthStencilbufferZero = mRenderer->createRenderbuffer(swapchain, true);
Framebuffer *framebufferZero = new DefaultFramebuffer(mRenderer, colorbufferZero, depthStencilbufferZero); Framebuffer *framebufferZero = new DefaultFramebuffer(colorbufferZero, depthStencilbufferZero);
setFramebufferZero(framebufferZero); setFramebufferZero(framebufferZero);
...@@ -540,7 +540,7 @@ void Context::bindReadFramebuffer(GLuint framebuffer) ...@@ -540,7 +540,7 @@ void Context::bindReadFramebuffer(GLuint framebuffer)
{ {
if (!getFramebuffer(framebuffer)) if (!getFramebuffer(framebuffer))
{ {
mFramebufferMap[framebuffer] = new Framebuffer(mRenderer, framebuffer); mFramebufferMap[framebuffer] = new Framebuffer(framebuffer);
} }
mState.setReadFramebufferBinding(getFramebuffer(framebuffer)); mState.setReadFramebufferBinding(getFramebuffer(framebuffer));
...@@ -550,7 +550,7 @@ void Context::bindDrawFramebuffer(GLuint framebuffer) ...@@ -550,7 +550,7 @@ void Context::bindDrawFramebuffer(GLuint framebuffer)
{ {
if (!getFramebuffer(framebuffer)) if (!getFramebuffer(framebuffer))
{ {
mFramebufferMap[framebuffer] = new Framebuffer(mRenderer, framebuffer); mFramebufferMap[framebuffer] = new Framebuffer(framebuffer);
} }
mState.setDrawFramebufferBinding(getFramebuffer(framebuffer)); mState.setDrawFramebufferBinding(getFramebuffer(framebuffer));
...@@ -953,7 +953,7 @@ void Context::getIntegerv(GLenum pname, GLint *params) ...@@ -953,7 +953,7 @@ void Context::getIntegerv(GLenum pname, GLint *params)
*params = static_cast<GLint>(mExtensionStrings.size()); *params = static_cast<GLint>(mExtensionStrings.size());
break; break;
default: default:
mState.getIntegerv(pname, params); mState.getIntegerv(getData(), pname, params);
break; break;
} }
} }
...@@ -1305,7 +1305,7 @@ bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned ...@@ -1305,7 +1305,7 @@ bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned
Error Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport) Error Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport)
{ {
Framebuffer *framebufferObject = mState.getDrawFramebuffer(); Framebuffer *framebufferObject = mState.getDrawFramebuffer();
ASSERT(framebufferObject && framebufferObject->completeness() == GL_FRAMEBUFFER_COMPLETE); ASSERT(framebufferObject && framebufferObject->completeness(getData()) == GL_FRAMEBUFFER_COMPLETE);
gl::Error error = mRenderer->applyRenderTarget(framebufferObject); gl::Error error = mRenderer->applyRenderTarget(framebufferObject);
if (error.isError()) if (error.isError())
...@@ -1327,7 +1327,7 @@ Error Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport) ...@@ -1327,7 +1327,7 @@ Error Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport)
Error Context::applyState(GLenum drawMode) Error Context::applyState(GLenum drawMode)
{ {
Framebuffer *framebufferObject = mState.getDrawFramebuffer(); Framebuffer *framebufferObject = mState.getDrawFramebuffer();
int samples = framebufferObject->getSamples(); int samples = framebufferObject->getSamples(getData());
RasterizerState rasterizer = mState.getRasterizerState(); RasterizerState rasterizer = mState.getRasterizerState();
rasterizer.pointDrawMode = (drawMode == GL_POINTS); rasterizer.pointDrawMode = (drawMode == GL_POINTS);
...@@ -1980,7 +1980,7 @@ const Extensions &Context::getExtensions() const ...@@ -1980,7 +1980,7 @@ const Extensions &Context::getExtensions() const
void Context::getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type) void Context::getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type)
{ {
Framebuffer *framebuffer = mState.getReadFramebuffer(); Framebuffer *framebuffer = mState.getReadFramebuffer();
ASSERT(framebuffer && framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE); ASSERT(framebuffer && framebuffer->completeness(getData()) == GL_FRAMEBUFFER_COMPLETE);
FramebufferAttachment *attachment = framebuffer->getReadColorbuffer(); FramebufferAttachment *attachment = framebuffer->getReadColorbuffer();
ASSERT(attachment); ASSERT(attachment);
......
...@@ -72,9 +72,8 @@ unsigned int GetAttachmentSerial(gl::FramebufferAttachment *attachment) ...@@ -72,9 +72,8 @@ unsigned int GetAttachmentSerial(gl::FramebufferAttachment *attachment)
namespace gl namespace gl
{ {
Framebuffer::Framebuffer(rx::Renderer *renderer, GLuint id) Framebuffer::Framebuffer(GLuint id)
: mRenderer(renderer), : mId(id),
mId(id),
mReadBufferState(GL_COLOR_ATTACHMENT0_EXT), mReadBufferState(GL_COLOR_ATTACHMENT0_EXT),
mDepthbuffer(NULL), mDepthbuffer(NULL),
mStencilbuffer(NULL) mStencilbuffer(NULL)
...@@ -388,14 +387,13 @@ bool Framebuffer::usingExtendedDrawBuffers() const ...@@ -388,14 +387,13 @@ bool Framebuffer::usingExtendedDrawBuffers() const
return false; return false;
} }
GLenum Framebuffer::completeness() const GLenum Framebuffer::completeness(const gl::Data &data) const
{ {
int width = 0; int width = 0;
int height = 0; int height = 0;
unsigned int colorbufferSize = 0; unsigned int colorbufferSize = 0;
int samples = -1; int samples = -1;
bool missingAttachment = true; bool missingAttachment = true;
GLuint clientVersion = mRenderer->getCurrentClientVersion();
for (unsigned int colorAttachment = 0; colorAttachment < IMPLEMENTATION_MAX_DRAW_BUFFERS; colorAttachment++) for (unsigned int colorAttachment = 0; colorAttachment < IMPLEMENTATION_MAX_DRAW_BUFFERS; colorAttachment++)
{ {
...@@ -409,8 +407,7 @@ GLenum Framebuffer::completeness() const ...@@ -409,8 +407,7 @@ GLenum Framebuffer::completeness() const
} }
GLenum internalformat = colorbuffer->getInternalFormat(); GLenum internalformat = colorbuffer->getInternalFormat();
// TODO(geofflang): use context's texture caps const TextureCaps &formatCaps = data.textureCaps->get(internalformat);
const TextureCaps &formatCaps = mRenderer->getRendererTextureCaps().get(internalformat);
const InternalFormat &formatInfo = GetInternalFormatInfo(internalformat); const InternalFormat &formatInfo = GetInternalFormatInfo(internalformat);
if (colorbuffer->isTexture()) if (colorbuffer->isTexture())
{ {
...@@ -449,7 +446,7 @@ GLenum Framebuffer::completeness() const ...@@ -449,7 +446,7 @@ GLenum Framebuffer::completeness() const
// in GLES 2.0, all color attachments attachments must have the same number of bitplanes // in GLES 2.0, all color attachments attachments must have the same number of bitplanes
// in GLES 3.0, there is no such restriction // in GLES 3.0, there is no such restriction
if (clientVersion < 3) if (data.clientVersion < 3)
{ {
if (formatInfo.pixelBytes != colorbufferSize) if (formatInfo.pixelBytes != colorbufferSize)
{ {
...@@ -489,14 +486,12 @@ GLenum Framebuffer::completeness() const ...@@ -489,14 +486,12 @@ GLenum Framebuffer::completeness() const
} }
GLenum internalformat = mDepthbuffer->getInternalFormat(); GLenum internalformat = mDepthbuffer->getInternalFormat();
// TODO(geofflang): use context's texture caps const TextureCaps &formatCaps = data.textureCaps->get(internalformat);
const TextureCaps &formatCaps = mRenderer->getRendererTextureCaps().get(internalformat);
const InternalFormat &formatInfo = GetInternalFormatInfo(internalformat); const InternalFormat &formatInfo = GetInternalFormatInfo(internalformat);
if (mDepthbuffer->isTexture()) if (mDepthbuffer->isTexture())
{ {
// depth texture attachments require OES/ANGLE_depth_texture // depth texture attachments require OES/ANGLE_depth_texture
// TODO(geofflang): use context's extensions if (!data.extensions->depthTextures)
if (!mRenderer->getRendererExtensions().depthTextures)
{ {
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
...@@ -544,15 +539,13 @@ GLenum Framebuffer::completeness() const ...@@ -544,15 +539,13 @@ GLenum Framebuffer::completeness() const
} }
GLenum internalformat = mStencilbuffer->getInternalFormat(); GLenum internalformat = mStencilbuffer->getInternalFormat();
// TODO(geofflang): use context's texture caps const TextureCaps &formatCaps = data.textureCaps->get(internalformat);
const TextureCaps &formatCaps = mRenderer->getRendererTextureCaps().get(internalformat);
const InternalFormat &formatInfo = GetInternalFormatInfo(internalformat); const InternalFormat &formatInfo = GetInternalFormatInfo(internalformat);
if (mStencilbuffer->isTexture()) if (mStencilbuffer->isTexture())
{ {
// texture stencil attachments come along as part // texture stencil attachments come along as part
// of OES_packed_depth_stencil + OES/ANGLE_depth_texture // of OES_packed_depth_stencil + OES/ANGLE_depth_texture
// TODO(geofflang): use context's extensions if (!data.extensions->depthTextures)
if (!mRenderer->getRendererExtensions().depthTextures)
{ {
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
...@@ -616,7 +609,6 @@ Error Framebuffer::invalidate(const Caps &caps, GLsizei numAttachments, const GL ...@@ -616,7 +609,6 @@ Error Framebuffer::invalidate(const Caps &caps, GLsizei numAttachments, const GL
Error Framebuffer::invalidateSub(GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height) Error Framebuffer::invalidateSub(GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
{ {
ASSERT(completeness() == GL_FRAMEBUFFER_COMPLETE);
for (GLsizei attachIndex = 0; attachIndex < numAttachments; ++attachIndex) for (GLsizei attachIndex = 0; attachIndex < numAttachments; ++attachIndex)
{ {
GLenum attachmentTarget = attachments[attachIndex]; GLenum attachmentTarget = attachments[attachIndex];
...@@ -640,8 +632,8 @@ Error Framebuffer::invalidateSub(GLsizei numAttachments, const GLenum *attachmen ...@@ -640,8 +632,8 @@ Error Framebuffer::invalidateSub(GLsizei numAttachments, const GLenum *attachmen
return Error(GL_NO_ERROR); return Error(GL_NO_ERROR);
} }
DefaultFramebuffer::DefaultFramebuffer(rx::Renderer *renderer, rx::RenderbufferImpl *colorbuffer, rx::RenderbufferImpl *depthStencil) DefaultFramebuffer::DefaultFramebuffer(rx::RenderbufferImpl *colorbuffer, rx::RenderbufferImpl *depthStencil)
: Framebuffer(renderer, 0) : Framebuffer(0)
{ {
Renderbuffer *colorRenderbuffer = new Renderbuffer(colorbuffer, 0); Renderbuffer *colorRenderbuffer = new Renderbuffer(colorbuffer, 0);
mColorbuffers[0] = new RenderbufferAttachment(GL_BACK, colorRenderbuffer); mColorbuffers[0] = new RenderbufferAttachment(GL_BACK, colorRenderbuffer);
...@@ -657,9 +649,9 @@ DefaultFramebuffer::DefaultFramebuffer(rx::Renderer *renderer, rx::RenderbufferI ...@@ -657,9 +649,9 @@ DefaultFramebuffer::DefaultFramebuffer(rx::Renderer *renderer, rx::RenderbufferI
mReadBufferState = GL_BACK; mReadBufferState = GL_BACK;
} }
int Framebuffer::getSamples() const int Framebuffer::getSamples(const gl::Data &data) const
{ {
if (completeness() == GL_FRAMEBUFFER_COMPLETE) if (completeness(data) == GL_FRAMEBUFFER_COMPLETE)
{ {
// for a complete framebuffer, all attachments must have the same sample count // for a complete framebuffer, all attachments must have the same sample count
// in this case return the first nonzero sample size // in this case return the first nonzero sample size
...@@ -684,7 +676,7 @@ bool Framebuffer::hasValidDepthStencil() const ...@@ -684,7 +676,7 @@ bool Framebuffer::hasValidDepthStencil() const
mDepthbuffer->id() == mStencilbuffer->id()); mDepthbuffer->id() == mStencilbuffer->id());
} }
ColorbufferInfo Framebuffer::getColorbuffersForRender() const ColorbufferInfo Framebuffer::getColorbuffersForRender(const rx::Workarounds &workarounds) const
{ {
ColorbufferInfo colorbuffersForRender; ColorbufferInfo colorbuffersForRender;
...@@ -698,7 +690,7 @@ ColorbufferInfo Framebuffer::getColorbuffersForRender() const ...@@ -698,7 +690,7 @@ ColorbufferInfo Framebuffer::getColorbuffersForRender() const
ASSERT(drawBufferState == GL_BACK || drawBufferState == (GL_COLOR_ATTACHMENT0_EXT + colorAttachment)); ASSERT(drawBufferState == GL_BACK || drawBufferState == (GL_COLOR_ATTACHMENT0_EXT + colorAttachment));
colorbuffersForRender.push_back(colorbuffer); colorbuffersForRender.push_back(colorbuffer);
} }
else if (!mRenderer->getWorkarounds().mrtPerfWorkaround) else if (!workarounds.mrtPerfWorkaround)
{ {
colorbuffersForRender.push_back(NULL); colorbuffersForRender.push_back(NULL);
} }
...@@ -707,7 +699,7 @@ ColorbufferInfo Framebuffer::getColorbuffersForRender() const ...@@ -707,7 +699,7 @@ ColorbufferInfo Framebuffer::getColorbuffersForRender() const
return colorbuffersForRender; return colorbuffersForRender;
} }
GLenum DefaultFramebuffer::completeness() const GLenum DefaultFramebuffer::completeness(const gl::Data &) const
{ {
// The default framebuffer *must* always be complete, though it may not be // The default framebuffer *must* always be complete, though it may not be
// subject to the same rules as application FBOs. ie, it could have 0x0 size. // subject to the same rules as application FBOs. ie, it could have 0x0 size.
......
...@@ -20,21 +20,24 @@ ...@@ -20,21 +20,24 @@
namespace rx namespace rx
{ {
class Renderer;
class RenderbufferImpl; class RenderbufferImpl;
struct Workarounds;
} }
namespace gl namespace gl
{ {
class FramebufferAttachment; class FramebufferAttachment;
struct Caps; struct Caps;
struct Extensions;
class TextureCapsMap;
struct Data;
typedef std::vector<FramebufferAttachment *> ColorbufferInfo; typedef std::vector<FramebufferAttachment *> ColorbufferInfo;
class Framebuffer class Framebuffer
{ {
public: public:
Framebuffer(rx::Renderer *renderer, GLuint id); Framebuffer(GLuint id);
virtual ~Framebuffer(); virtual ~Framebuffer();
...@@ -65,10 +68,10 @@ class Framebuffer ...@@ -65,10 +68,10 @@ class Framebuffer
bool isEnabledColorAttachment(unsigned int colorAttachment) const; bool isEnabledColorAttachment(unsigned int colorAttachment) const;
bool hasEnabledColorAttachment() const; bool hasEnabledColorAttachment() const;
bool hasStencil() const; bool hasStencil() const;
int getSamples() const; int getSamples(const gl::Data &data) const;
bool usingExtendedDrawBuffers() const; bool usingExtendedDrawBuffers() const;
virtual GLenum completeness() const; virtual GLenum completeness(const gl::Data &data) const;
bool hasValidDepthStencil() const; bool hasValidDepthStencil() const;
Error invalidate(const Caps &caps, GLsizei numAttachments, const GLenum *attachments); Error invalidate(const Caps &caps, GLsizei numAttachments, const GLenum *attachments);
...@@ -77,11 +80,9 @@ class Framebuffer ...@@ -77,11 +80,9 @@ class Framebuffer
// Use this method to retrieve the color buffer map when doing rendering. // Use this method to retrieve the color buffer map when doing rendering.
// It will apply a workaround for poor shader performance on some systems // It will apply a workaround for poor shader performance on some systems
// by compacting the list to skip NULL values. // by compacting the list to skip NULL values.
ColorbufferInfo getColorbuffersForRender() const; ColorbufferInfo getColorbuffersForRender(const rx::Workarounds &workarounds) const;
protected: protected:
rx::Renderer *mRenderer;
GLuint mId; GLuint mId;
FramebufferAttachment *mColorbuffers[IMPLEMENTATION_MAX_DRAW_BUFFERS]; FramebufferAttachment *mColorbuffers[IMPLEMENTATION_MAX_DRAW_BUFFERS];
...@@ -100,9 +101,9 @@ class Framebuffer ...@@ -100,9 +101,9 @@ class Framebuffer
class DefaultFramebuffer : public Framebuffer class DefaultFramebuffer : public Framebuffer
{ {
public: public:
DefaultFramebuffer(rx::Renderer *Renderer, rx::RenderbufferImpl *colorbuffer, rx::RenderbufferImpl *depthStencil); DefaultFramebuffer(rx::RenderbufferImpl *colorbuffer, rx::RenderbufferImpl *depthStencil);
virtual GLenum completeness() const; GLenum completeness(const gl::Data &data) const override;
virtual FramebufferAttachment *getAttachment(GLenum attachment) const; virtual FramebufferAttachment *getAttachment(GLenum attachment) const;
private: private:
......
...@@ -1174,7 +1174,7 @@ void State::getFloatv(GLenum pname, GLfloat *params) ...@@ -1174,7 +1174,7 @@ void State::getFloatv(GLenum pname, GLfloat *params)
} }
} }
void State::getIntegerv(GLenum pname, GLint *params) void State::getIntegerv(const gl::Data &data, GLenum pname, GLint *params)
{ {
if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT) if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
{ {
...@@ -1232,12 +1232,12 @@ void State::getIntegerv(GLenum pname, GLint *params) ...@@ -1232,12 +1232,12 @@ void State::getIntegerv(GLenum pname, GLint *params)
case GL_SAMPLES: case GL_SAMPLES:
{ {
gl::Framebuffer *framebuffer = mDrawFramebuffer; gl::Framebuffer *framebuffer = mDrawFramebuffer;
if (framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE) if (framebuffer->completeness(data) == GL_FRAMEBUFFER_COMPLETE)
{ {
switch (pname) switch (pname)
{ {
case GL_SAMPLE_BUFFERS: case GL_SAMPLE_BUFFERS:
if (framebuffer->getSamples() != 0) if (framebuffer->getSamples(data) != 0)
{ {
*params = 1; *params = 1;
} }
...@@ -1247,7 +1247,7 @@ void State::getIntegerv(GLenum pname, GLint *params) ...@@ -1247,7 +1247,7 @@ void State::getIntegerv(GLenum pname, GLint *params)
} }
break; break;
case GL_SAMPLES: case GL_SAMPLES:
*params = framebuffer->getSamples(); *params = framebuffer->getSamples(data);
break; break;
} }
} }
......
...@@ -25,6 +25,7 @@ class Query; ...@@ -25,6 +25,7 @@ class Query;
class VertexArray; class VertexArray;
class Context; class Context;
struct Caps; struct Caps;
struct Data;
class State class State
{ {
...@@ -236,7 +237,7 @@ class State ...@@ -236,7 +237,7 @@ class State
// State query functions // State query functions
void getBooleanv(GLenum pname, GLboolean *params); void getBooleanv(GLenum pname, GLboolean *params);
void getFloatv(GLenum pname, GLfloat *params); void getFloatv(GLenum pname, GLfloat *params);
void getIntegerv(GLenum pname, GLint *params); void getIntegerv(const gl::Data &data, GLenum pname, GLint *params);
bool getIndexedIntegerv(GLenum target, GLuint index, GLint *data); bool getIndexedIntegerv(GLenum target, GLuint index, GLint *data);
bool getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data); bool getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data);
......
...@@ -621,7 +621,8 @@ GLenum GL_APIENTRY glCheckFramebufferStatus(GLenum target) ...@@ -621,7 +621,8 @@ GLenum GL_APIENTRY glCheckFramebufferStatus(GLenum target)
gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target); gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
ASSERT(framebuffer); ASSERT(framebuffer);
return framebuffer->completeness();
return framebuffer->completeness(context->getData());
} }
return 0; return 0;
...@@ -635,8 +636,9 @@ void GL_APIENTRY glClear(GLbitfield mask) ...@@ -635,8 +636,9 @@ void GL_APIENTRY glClear(GLbitfield mask)
if (context) if (context)
{ {
gl::Framebuffer *framebufferObject = context->getState().getDrawFramebuffer(); gl::Framebuffer *framebufferObject = context->getState().getDrawFramebuffer();
ASSERT(framebufferObject);
if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE) if (framebufferObject->completeness(context->getData()) != GL_FRAMEBUFFER_COMPLETE)
{ {
context->recordError(gl::Error(GL_INVALID_FRAMEBUFFER_OPERATION)); context->recordError(gl::Error(GL_INVALID_FRAMEBUFFER_OPERATION));
return; return;
...@@ -1638,6 +1640,7 @@ void GL_APIENTRY glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum ...@@ -1638,6 +1640,7 @@ void GL_APIENTRY glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum
} }
gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target); gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
ASSERT(framebuffer);
if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT) if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
{ {
...@@ -2285,6 +2288,7 @@ void GL_APIENTRY glGetFramebufferAttachmentParameteriv(GLenum target, GLenum att ...@@ -2285,6 +2288,7 @@ void GL_APIENTRY glGetFramebufferAttachmentParameteriv(GLenum target, GLenum att
GLuint framebufferHandle = context->getState().getTargetFramebuffer(target)->id(); GLuint framebufferHandle = context->getState().getTargetFramebuffer(target)->id();
gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle); gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
ASSERT(framebuffer);
if (framebufferHandle == 0) if (framebufferHandle == 0)
{ {
...@@ -8288,7 +8292,9 @@ void GL_APIENTRY glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, ...@@ -8288,7 +8292,9 @@ void GL_APIENTRY glInvalidateFramebuffer(GLenum target, GLsizei numAttachments,
} }
gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target); gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
if (framebuffer && framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE) ASSERT(framebuffer);
if (framebuffer->completeness(context->getData()) == GL_FRAMEBUFFER_COMPLETE)
{ {
gl::Error error = framebuffer->invalidate(context->getCaps(), numAttachments, attachments); gl::Error error = framebuffer->invalidate(context->getCaps(), numAttachments, attachments);
if (error.isError()) if (error.isError())
...@@ -8321,7 +8327,9 @@ void GL_APIENTRY glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachment ...@@ -8321,7 +8327,9 @@ void GL_APIENTRY glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachment
} }
gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target); gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
if (framebuffer && framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE) ASSERT(framebuffer);
if (framebuffer->completeness(context->getData()) == GL_FRAMEBUFFER_COMPLETE)
{ {
gl::Error error = framebuffer->invalidateSub(numAttachments, attachments, x, y, width, height); gl::Error error = framebuffer->invalidateSub(numAttachments, attachments, x, y, width, height);
if (error.isError()) if (error.isError())
...@@ -8611,6 +8619,8 @@ void GL_APIENTRY glDrawBuffersEXT(GLsizei n, const GLenum *bufs) ...@@ -8611,6 +8619,8 @@ void GL_APIENTRY glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
return; return;
} }
ASSERT(context->getState().getDrawFramebuffer());
if (context->getState().getDrawFramebuffer()->id() == 0) if (context->getState().getDrawFramebuffer()->id() == 0)
{ {
if (n != 1) if (n != 1)
...@@ -8639,6 +8649,7 @@ void GL_APIENTRY glDrawBuffersEXT(GLsizei n, const GLenum *bufs) ...@@ -8639,6 +8649,7 @@ void GL_APIENTRY glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
} }
gl::Framebuffer *framebuffer = context->getState().getDrawFramebuffer(); gl::Framebuffer *framebuffer = context->getState().getDrawFramebuffer();
ASSERT(framebuffer);
for (unsigned int colorAttachment = 0; colorAttachment < static_cast<unsigned int>(n); colorAttachment++) for (unsigned int colorAttachment = 0; colorAttachment < static_cast<unsigned int>(n); colorAttachment++)
{ {
......
...@@ -814,7 +814,7 @@ gl::Error ProgramD3D::getPixelExecutableForFramebuffer(const gl::Framebuffer *fb ...@@ -814,7 +814,7 @@ gl::Error ProgramD3D::getPixelExecutableForFramebuffer(const gl::Framebuffer *fb
{ {
std::vector<GLenum> outputs; std::vector<GLenum> outputs;
const gl::ColorbufferInfo &colorbuffers = fbo->getColorbuffersForRender(); const gl::ColorbufferInfo &colorbuffers = fbo->getColorbuffersForRender(mRenderer->getWorkarounds());
for (size_t colorAttachment = 0; colorAttachment < colorbuffers.size(); ++colorAttachment) for (size_t colorAttachment = 0; colorAttachment < colorbuffers.size(); ++colorAttachment)
{ {
......
...@@ -38,11 +38,14 @@ const unsigned int RenderStateCache::kMaxRasterizerStates = 4096; ...@@ -38,11 +38,14 @@ const unsigned int RenderStateCache::kMaxRasterizerStates = 4096;
const unsigned int RenderStateCache::kMaxDepthStencilStates = 4096; const unsigned int RenderStateCache::kMaxDepthStencilStates = 4096;
const unsigned int RenderStateCache::kMaxSamplerStates = 4096; const unsigned int RenderStateCache::kMaxSamplerStates = 4096;
RenderStateCache::RenderStateCache() : mDevice(NULL), mCounter(0), RenderStateCache::RenderStateCache(rx::Renderer11 *renderer)
mBlendStateCache(kMaxBlendStates, hashBlendState, compareBlendStates), : mRenderer(renderer),
mRasterizerStateCache(kMaxRasterizerStates, hashRasterizerState, compareRasterizerStates), mDevice(NULL),
mDepthStencilStateCache(kMaxDepthStencilStates, hashDepthStencilState, compareDepthStencilStates), mCounter(0),
mSamplerStateCache(kMaxSamplerStates, hashSamplerState, compareSamplerStates) mBlendStateCache(kMaxBlendStates, hashBlendState, compareBlendStates),
mRasterizerStateCache(kMaxRasterizerStates, hashRasterizerState, compareRasterizerStates),
mDepthStencilStateCache(kMaxDepthStencilStates, hashDepthStencilState, compareDepthStencilStates),
mSamplerStateCache(kMaxSamplerStates, hashSamplerState, compareSamplerStates)
{ {
} }
...@@ -89,7 +92,7 @@ gl::Error RenderStateCache::getBlendState(const gl::Framebuffer *framebuffer, co ...@@ -89,7 +92,7 @@ gl::Error RenderStateCache::getBlendState(const gl::Framebuffer *framebuffer, co
bool mrt = false; bool mrt = false;
const gl::ColorbufferInfo &colorbuffers = framebuffer->getColorbuffersForRender(); const gl::ColorbufferInfo &colorbuffers = framebuffer->getColorbuffersForRender(mRenderer->getWorkarounds());
BlendStateKey key = { 0 }; BlendStateKey key = { 0 };
key.blendState = blendState; key.blendState = blendState;
......
...@@ -28,7 +28,7 @@ class Renderer11; ...@@ -28,7 +28,7 @@ class Renderer11;
class RenderStateCache class RenderStateCache
{ {
public: public:
RenderStateCache(); RenderStateCache(rx::Renderer11 *renderer);
virtual ~RenderStateCache(); virtual ~RenderStateCache();
void initialize(ID3D11Device *device); void initialize(ID3D11Device *device);
...@@ -42,6 +42,7 @@ class RenderStateCache ...@@ -42,6 +42,7 @@ class RenderStateCache
private: private:
DISALLOW_COPY_AND_ASSIGN(RenderStateCache); DISALLOW_COPY_AND_ASSIGN(RenderStateCache);
rx::Renderer11 *mRenderer;
unsigned long long mCounter; unsigned long long mCounter;
// Blend state cache // Blend state cache
......
...@@ -96,7 +96,8 @@ ID3D11Resource *GetSRVResource(ID3D11ShaderResourceView *srv) ...@@ -96,7 +96,8 @@ ID3D11Resource *GetSRVResource(ID3D11ShaderResourceView *srv)
Renderer11::Renderer11(egl::Display *display, EGLNativeDisplayType hDc, const egl::AttributeMap &attributes) Renderer11::Renderer11(egl::Display *display, EGLNativeDisplayType hDc, const egl::AttributeMap &attributes)
: Renderer(display), : Renderer(display),
mDc(hDc) mDc(hDc),
mStateCache(this)
{ {
mVertexDataManager = NULL; mVertexDataManager = NULL;
mIndexDataManager = NULL; mIndexDataManager = NULL;
...@@ -868,7 +869,7 @@ gl::Error Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer) ...@@ -868,7 +869,7 @@ gl::Error Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
ID3D11RenderTargetView* framebufferRTVs[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS] = {NULL}; ID3D11RenderTargetView* framebufferRTVs[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS] = {NULL};
bool missingColorRenderTarget = true; bool missingColorRenderTarget = true;
const gl::ColorbufferInfo &colorbuffers = framebuffer->getColorbuffersForRender(); const gl::ColorbufferInfo &colorbuffers = framebuffer->getColorbuffersForRender(getWorkarounds());
for (size_t colorAttachment = 0; colorAttachment < colorbuffers.size(); ++colorAttachment) for (size_t colorAttachment = 0; colorAttachment < colorbuffers.size(); ++colorAttachment)
{ {
......
...@@ -500,14 +500,26 @@ bool ValidateBlitFramebufferParameters(gl::Context *context, GLint srcX0, GLint ...@@ -500,14 +500,26 @@ bool ValidateBlitFramebufferParameters(gl::Context *context, GLint srcX0, GLint
gl::Framebuffer *readFramebuffer = context->getState().getReadFramebuffer(); gl::Framebuffer *readFramebuffer = context->getState().getReadFramebuffer();
gl::Framebuffer *drawFramebuffer = context->getState().getDrawFramebuffer(); gl::Framebuffer *drawFramebuffer = context->getState().getDrawFramebuffer();
if (!readFramebuffer || readFramebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE ||
!drawFramebuffer || drawFramebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) if (!readFramebuffer || !drawFramebuffer)
{ {
context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION)); context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
return false; return false;
} }
if (drawFramebuffer->getSamples() != 0) if (!readFramebuffer->completeness(context->getData()))
{
context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
return false;
}
if (!drawFramebuffer->completeness(context->getData()))
{
context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
return false;
}
if (drawFramebuffer->getSamples(context->getData()) != 0)
{ {
context->recordError(Error(GL_INVALID_OPERATION)); context->recordError(Error(GL_INVALID_OPERATION));
return false; return false;
...@@ -599,9 +611,12 @@ bool ValidateBlitFramebufferParameters(gl::Context *context, GLint srcX0, GLint ...@@ -599,9 +611,12 @@ bool ValidateBlitFramebufferParameters(gl::Context *context, GLint srcX0, GLint
} }
} }
} }
if (readFramebuffer->getSamples() != 0 && IsPartialBlit(context, readColorBuffer, drawColorBuffer,
srcX0, srcY0, srcX1, srcY1, int readSamples = readFramebuffer->getSamples(context->getData());
dstX0, dstY0, dstX1, dstY1))
if (readSamples != 0 && IsPartialBlit(context, readColorBuffer, drawColorBuffer,
srcX0, srcY0, srcX1, srcY1,
dstX0, dstY0, dstX1, dstY1))
{ {
context->recordError(Error(GL_INVALID_OPERATION)); context->recordError(Error(GL_INVALID_OPERATION));
return false; return false;
...@@ -916,13 +931,14 @@ bool ValidateReadPixelsParameters(gl::Context *context, GLint x, GLint y, GLsize ...@@ -916,13 +931,14 @@ bool ValidateReadPixelsParameters(gl::Context *context, GLint x, GLint y, GLsize
gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer(); gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
ASSERT(framebuffer); ASSERT(framebuffer);
if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) if (framebuffer->completeness(context->getData()) != GL_FRAMEBUFFER_COMPLETE)
{ {
context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION)); context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
return false; return false;
} }
if (context->getState().getReadFramebuffer()->id() != 0 && framebuffer->getSamples() != 0) if (context->getState().getReadFramebuffer()->id() != 0 &&
framebuffer->getSamples(context->getData()) != 0)
{ {
context->recordError(Error(GL_INVALID_OPERATION)); context->recordError(Error(GL_INVALID_OPERATION));
return false; return false;
...@@ -1176,7 +1192,7 @@ bool ValidateStateQuery(gl::Context *context, GLenum pname, GLenum *nativeType, ...@@ -1176,7 +1192,7 @@ bool ValidateStateQuery(gl::Context *context, GLenum pname, GLenum *nativeType,
{ {
Framebuffer *framebuffer = context->getState().getReadFramebuffer(); Framebuffer *framebuffer = context->getState().getReadFramebuffer();
ASSERT(framebuffer); ASSERT(framebuffer);
if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) if (framebuffer->completeness(context->getData()) != GL_FRAMEBUFFER_COMPLETE)
{ {
context->recordError(Error(GL_INVALID_OPERATION)); context->recordError(Error(GL_INVALID_OPERATION));
return false; return false;
...@@ -1240,13 +1256,13 @@ bool ValidateCopyTexImageParametersBase(gl::Context* context, GLenum target, GLi ...@@ -1240,13 +1256,13 @@ bool ValidateCopyTexImageParametersBase(gl::Context* context, GLenum target, GLi
} }
gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer(); gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) if (framebuffer->completeness(context->getData()) != GL_FRAMEBUFFER_COMPLETE)
{ {
context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION)); context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
return false; return false;
} }
if (context->getState().getReadFramebuffer()->id() != 0 && framebuffer->getSamples() != 0) if (context->getState().getReadFramebuffer()->id() != 0 && framebuffer->getSamples(context->getData()) != 0)
{ {
context->recordError(Error(GL_INVALID_OPERATION)); context->recordError(Error(GL_INVALID_OPERATION));
return false; return false;
...@@ -1445,7 +1461,7 @@ static bool ValidateDrawBase(Context *context, GLenum mode, GLsizei count, GLsiz ...@@ -1445,7 +1461,7 @@ static bool ValidateDrawBase(Context *context, GLenum mode, GLsizei count, GLsiz
} }
const gl::Framebuffer *fbo = state.getDrawFramebuffer(); const gl::Framebuffer *fbo = state.getDrawFramebuffer();
if (!fbo || fbo->completeness() != GL_FRAMEBUFFER_COMPLETE) if (!fbo || fbo->completeness(context->getData()) != GL_FRAMEBUFFER_COMPLETE)
{ {
context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION)); context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
return false; return false;
......
...@@ -876,13 +876,14 @@ bool ValidateES3CopyTexImageParameters(Context *context, GLenum target, GLint le ...@@ -876,13 +876,14 @@ bool ValidateES3CopyTexImageParameters(Context *context, GLenum target, GLint le
gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer(); gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) if (framebuffer->completeness(context->getData()) != GL_FRAMEBUFFER_COMPLETE)
{ {
context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION)); context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
return false; return false;
} }
if (context->getState().getReadFramebuffer()->id() != 0 && framebuffer->getSamples() != 0) if (context->getState().getReadFramebuffer()->id() != 0 &&
framebuffer->getSamples(context->getData()) != 0)
{ {
context->recordError(Error(GL_INVALID_OPERATION)); context->recordError(Error(GL_INVALID_OPERATION));
return false; return false;
...@@ -1262,7 +1263,7 @@ bool ValidateClearBuffer(Context *context) ...@@ -1262,7 +1263,7 @@ bool ValidateClearBuffer(Context *context)
} }
const gl::Framebuffer *fbo = context->getState().getDrawFramebuffer(); const gl::Framebuffer *fbo = context->getState().getDrawFramebuffer();
if (!fbo || fbo->completeness() != GL_FRAMEBUFFER_COMPLETE) if (!fbo || fbo->completeness(context->getData()) != GL_FRAMEBUFFER_COMPLETE)
{ {
context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION)); context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
return false; return false;
......
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