Commit 1fc7e2c5 by Jamie Madill

Refactor validation of FramebufferRenderbuffer.

Consolidate a lot of duplicated code into helper methods. Also move GetTargetTexture to the context class. Change-Id: I8e3990a5e3c1976cb533941d0a0946466accec30 Reviewed-on: https://chromium-review.googlesource.com/181556Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 92bfd5c6
......@@ -27,6 +27,7 @@
#include "libGLESv2/renderer/Renderer.h"
#include "libGLESv2/VertexArray.h"
#include "libGLESv2/Sampler.h"
#include "libGLESv2/validationES.h"
#include "libEGL/Surface.h"
......@@ -1388,9 +1389,9 @@ void Context::setRenderbufferStorage(GLsizei width, GLsizei height, GLenum inter
renderbufferObject->setStorage(renderbuffer);
}
Framebuffer *Context::getFramebuffer(unsigned int handle)
Framebuffer *Context::getFramebuffer(unsigned int handle) const
{
FramebufferMap::iterator framebuffer = mFramebufferMap.find(handle);
FramebufferMap::const_iterator framebuffer = mFramebufferMap.find(handle);
if (framebuffer == mFramebufferMap.end())
{
......@@ -1450,22 +1451,62 @@ ProgramBinary *Context::getCurrentProgramBinary()
return mCurrentProgramBinary.get();
}
Texture2D *Context::getTexture2D()
Texture *Context::getTargetTexture(GLenum target) const
{
if (!ValidTextureTarget(this, target))
{
return NULL;
}
switch (target)
{
case GL_TEXTURE_2D: return getTexture2D();
case GL_TEXTURE_CUBE_MAP: return getTextureCubeMap();
case GL_TEXTURE_3D: return getTexture3D();
case GL_TEXTURE_2D_ARRAY: return getTexture2DArray();
default: return NULL;
}
}
GLuint Context::getTargetFramebufferHandle(GLenum target) const
{
if (!ValidFramebufferTarget(target))
{
return GL_INVALID_INDEX;
}
if (target == GL_READ_FRAMEBUFFER_ANGLE)
{
return mState.readFramebuffer;
}
else
{
return mState.drawFramebuffer;
}
}
Framebuffer *Context::getTargetFramebuffer(GLenum target) const
{
GLuint framebufferHandle = getTargetFramebufferHandle(target);
return (framebufferHandle == GL_INVALID_INDEX ? NULL : getFramebuffer(framebufferHandle));
}
Texture2D *Context::getTexture2D() const
{
return static_cast<Texture2D*>(getSamplerTexture(mState.activeSampler, TEXTURE_2D));
}
TextureCubeMap *Context::getTextureCubeMap()
TextureCubeMap *Context::getTextureCubeMap() const
{
return static_cast<TextureCubeMap*>(getSamplerTexture(mState.activeSampler, TEXTURE_CUBE));
}
Texture3D *Context::getTexture3D()
Texture3D *Context::getTexture3D() const
{
return static_cast<Texture3D*>(getSamplerTexture(mState.activeSampler, TEXTURE_3D));
}
Texture2DArray *Context::getTexture2DArray()
Texture2DArray *Context::getTexture2DArray() const
{
return static_cast<Texture2DArray*>(getSamplerTexture(mState.activeSampler, TEXTURE_2D_ARRAY));
}
......@@ -1500,7 +1541,7 @@ Buffer *Context::getPixelUnpackBuffer()
return mState.unpack.pixelBuffer.get();
}
Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type)
Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
{
GLuint texid = mState.samplerTexture[type][sampler].id();
......
......@@ -325,7 +325,7 @@ class Context
Shader *getShader(GLuint handle);
Program *getProgram(GLuint handle);
Texture *getTexture(GLuint handle);
Framebuffer *getFramebuffer(GLuint handle);
Framebuffer *getFramebuffer(GLuint handle) const;
Renderbuffer *getRenderbuffer(GLuint handle);
VertexArray *getVertexArray(GLuint handle) const;
Sampler *getSampler(GLuint handle) const;
......@@ -334,17 +334,23 @@ class Context
Buffer *getArrayBuffer();
Buffer *getElementArrayBuffer();
ProgramBinary *getCurrentProgramBinary();
Texture2D *getTexture2D();
TextureCubeMap *getTextureCubeMap();
Texture3D *getTexture3D();
Texture2DArray *getTexture2DArray();
Texture *getTargetTexture(GLenum target) const;
Texture2D *getTexture2D() const;
TextureCubeMap *getTextureCubeMap() const;
Texture3D *getTexture3D() const;
Texture2DArray *getTexture2DArray() const;
Buffer *getGenericUniformBuffer();
Buffer *getGenericTransformFeedbackBuffer();
Buffer *getCopyReadBuffer();
Buffer *getCopyWriteBuffer();
Buffer *getPixelPackBuffer();
Buffer *getPixelUnpackBuffer();
Texture *getSamplerTexture(unsigned int sampler, TextureType type);
Texture *getSamplerTexture(unsigned int sampler, TextureType type) const;
Framebuffer *getTargetFramebuffer(GLenum target) const;
GLuint getTargetFramebufferHandle(GLenum target) const;
Framebuffer *getReadFramebuffer();
Framebuffer *getDrawFramebuffer();
VertexArray *getCurrentVertexArray() const;
......
......@@ -28,23 +28,6 @@
#include "libGLESv2/validationES3.h"
#include "libGLESv2/queryconversions.h"
gl::Texture *GetTargetTexture(gl::Context *context, GLenum target)
{
if (!ValidTextureTarget(context, target))
{
return NULL;
}
switch (target)
{
case GL_TEXTURE_2D: return context->getTexture2D();
case GL_TEXTURE_CUBE_MAP: return context->getTextureCubeMap();
case GL_TEXTURE_3D: return context->getTexture3D();
case GL_TEXTURE_2D_ARRAY: return context->getTexture2DArray();
default: return NULL;
}
}
extern "C"
{
......@@ -267,7 +250,7 @@ void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
try
{
if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
if (!gl::ValidFramebufferTarget(target))
{
return gl::error(GL_INVALID_ENUM);
}
......@@ -781,7 +764,7 @@ GLenum __stdcall glCheckFramebufferStatus(GLenum target)
try
{
if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
if (!gl::ValidFramebufferTarget(target))
{
return gl::error(GL_INVALID_ENUM, 0);
}
......@@ -790,16 +773,8 @@ GLenum __stdcall glCheckFramebufferStatus(GLenum target)
if (context)
{
gl::Framebuffer *framebuffer = NULL;
if (target == GL_READ_FRAMEBUFFER_ANGLE)
{
framebuffer = context->getReadFramebuffer();
}
else
{
framebuffer = context->getDrawFramebuffer();
}
gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
ASSERT(framebuffer);
return framebuffer->completeness();
}
}
......@@ -2007,8 +1982,7 @@ void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenu
try
{
if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
|| (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
{
return gl::error(GL_INVALID_ENUM);
}
......@@ -2017,33 +1991,17 @@ void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenu
if (context)
{
gl::Framebuffer *framebuffer = NULL;
GLuint framebufferHandle = 0;
if (target == GL_READ_FRAMEBUFFER_ANGLE)
{
framebuffer = context->getReadFramebuffer();
framebufferHandle = context->getReadFramebufferHandle();
}
else
if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
{
framebuffer = context->getDrawFramebuffer();
framebufferHandle = context->getDrawFramebufferHandle();
return;
}
if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
{
return gl::error(GL_INVALID_OPERATION);
}
gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
ASSERT(framebuffer);
if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
{
const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
if (colorAttachment >= context->getMaximumRenderTargets())
{
return gl::error(GL_INVALID_VALUE);
}
unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
}
else
......@@ -2057,14 +2015,11 @@ void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenu
framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
break;
case GL_DEPTH_STENCIL_ATTACHMENT:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
break;
default:
return gl::error(GL_INVALID_ENUM);
UNREACHABLE();
break;
}
}
}
......@@ -2102,15 +2057,7 @@ void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum t
textarget = GL_NONE;
}
gl::Framebuffer *framebuffer = NULL;
if (target == GL_READ_FRAMEBUFFER_ANGLE)
{
framebuffer = context->getReadFramebuffer();
}
else
{
framebuffer = context->getDrawFramebuffer();
}
gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
{
......@@ -2205,7 +2152,7 @@ void __stdcall glGenerateMipmap(GLenum target)
return gl::error(GL_INVALID_ENUM);
}
gl::Texture *texture = GetTargetTexture(context, target);
gl::Texture *texture = context->getTargetTexture(target);
if (texture == NULL)
{
......@@ -2360,7 +2307,7 @@ void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
void __stdcall glGenTextures(GLsizei n, GLuint* textures)
{
EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
try
{
......@@ -2739,8 +2686,7 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac
if (context)
{
META_ASSERT(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER && GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER);
if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
if (!gl::ValidFramebufferTarget(target))
{
return gl::error(GL_INVALID_ENUM);
}
......@@ -2795,9 +2741,8 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac
break;
}
GLuint framebufferHandle = (target == GL_READ_FRAMEBUFFER) ? context->getReadFramebufferHandle()
: context->getDrawFramebufferHandle();
GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
ASSERT(framebufferHandle != GL_INVALID_INDEX);
gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
GLenum attachmentType;
......@@ -3569,7 +3514,7 @@ void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
if (context)
{
gl::Texture *texture = GetTargetTexture(context, target);
gl::Texture *texture = context->getTargetTexture(target);
if (!texture)
{
......@@ -3667,7 +3612,7 @@ void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
if (context)
{
gl::Texture *texture = GetTargetTexture(context, target);
gl::Texture *texture = context->getTargetTexture(target);
if (!texture)
{
......@@ -4994,7 +4939,7 @@ void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GL
GLint border, GLenum format, GLenum type, const GLvoid* pixels)
{
EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
"GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
"GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
target, level, internalformat, width, height, border, format, type, pixels);
try
......@@ -5086,7 +5031,7 @@ void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
return;
}
gl::Texture *texture = GetTargetTexture(context, target);
gl::Texture *texture = context->getTargetTexture(target);
if (!texture)
{
......@@ -5146,7 +5091,7 @@ void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
return;
}
gl::Texture *texture = GetTargetTexture(context, target);
gl::Texture *texture = context->getTargetTexture(target);
if (!texture)
{
......@@ -7145,15 +7090,8 @@ void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuin
return;
}
gl::Framebuffer *framebuffer = NULL;
if (target == GL_READ_FRAMEBUFFER)
{
framebuffer = context->getReadFramebuffer();
}
else
{
framebuffer = context->getDrawFramebuffer();
}
gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
ASSERT(framebuffer);
gl::Texture *textureObject = context->getTexture(texture);
GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
......
......@@ -21,7 +21,7 @@
namespace gl
{
bool ValidTextureTarget(gl::Context *context, GLenum target)
bool ValidTextureTarget(const Context *context, GLenum target)
{
if (context->getClientVersion() < 3)
{
......@@ -34,6 +34,19 @@ bool ValidTextureTarget(gl::Context *context, GLenum target)
return true;
}
bool ValidFramebufferTarget(GLenum target)
{
META_ASSERT(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER && GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER);
switch (target)
{
case GL_FRAMEBUFFER: return true;
case GL_READ_FRAMEBUFFER: return true;
case GL_DRAW_FRAMEBUFFER: return true;
default: return false;
}
}
bool ValidMipLevel(const gl::Context *context, GLenum target, GLint level)
{
int maxLevel = 0;
......@@ -171,6 +184,48 @@ bool ValidateRenderbufferStorageParameters(const gl::Context *context, GLenum ta
return true;
}
bool ValidateFramebufferRenderbufferParameters(gl::Context *context, GLenum target, GLenum attachment,
GLenum renderbuffertarget, GLuint renderbuffer)
{
gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
{
return gl::error(GL_INVALID_OPERATION, false);
}
if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
{
const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
if (colorAttachment >= context->getMaximumRenderTargets())
{
return gl::error(GL_INVALID_VALUE, false);
}
}
else
{
switch (attachment)
{
case GL_DEPTH_ATTACHMENT:
break;
case GL_STENCIL_ATTACHMENT:
break;
case GL_DEPTH_STENCIL_ATTACHMENT:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM, false);
}
break;
default:
return gl::error(GL_INVALID_ENUM, false);
}
}
return true;
}
static bool IsPartialBlit(gl::Context *context, gl::Renderbuffer *readBuffer, gl::Renderbuffer *writeBuffer,
GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1)
......
......@@ -14,14 +14,17 @@ namespace gl
class Context;
bool ValidTextureTarget(gl::Context *context, GLenum target);
bool ValidMipLevel(const gl::Context *context, GLenum target, GLint level);
bool ValidTextureTarget(const Context *context, GLenum target);
bool ValidFramebufferTarget(GLenum target);
bool ValidMipLevel(const Context *context, GLenum target, GLint level);
bool ValidImageSize(const gl::Context *context, GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth);
bool ValidCompressedImageSize(const gl::Context *context, GLenum internalFormat, GLsizei width, GLsizei height);
bool ValidateRenderbufferStorageParameters(const gl::Context *context, GLenum target, GLsizei samples,
GLenum internalformat, GLsizei width, GLsizei height,
bool angleExtension);
bool ValidateFramebufferRenderbufferParameters(gl::Context *context, GLenum target, GLenum attachment,
GLenum renderbuffertarget, GLuint renderbuffer);
bool ValidateBlitFramebufferParameters(gl::Context *context, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask,
......
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