Commit e8afa902 by Geoff Lang Committed by Commit Bot

Make GL_ANGLE_framebuffer_blit enableable.

BUG=angleproject:1523 Change-Id: I5d6df35d2e65be6d73ec6100e3351ba5f9ff53a2 Reviewed-on: https://chromium-review.googlesource.com/688639 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent 1d33c219
......@@ -645,7 +645,7 @@ const ExtensionInfoMap &GetExtensionInfoMap()
map["GL_EXT_robustness"] = esOnlyExtension(&Extensions::robustness);
map["GL_KHR_robust_buffer_access_behavior"] = esOnlyExtension(&Extensions::robustBufferAccessBehavior);
map["GL_EXT_blend_minmax"] = enableableExtension(&Extensions::blendMinMax);
map["GL_ANGLE_framebuffer_blit"] = esOnlyExtension(&Extensions::framebufferBlit);
map["GL_ANGLE_framebuffer_blit"] = enableableExtension(&Extensions::framebufferBlit);
map["GL_ANGLE_framebuffer_multisample"] = enableableExtension(&Extensions::framebufferMultisample);
map["GL_ANGLE_instanced_arrays"] = enableableExtension(&Extensions::instancedArrays);
map["GL_ANGLE_pack_reverse_row_order"] = enableableExtension(&Extensions::packReverseRowOrder);
......
......@@ -171,9 +171,7 @@ bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsign
case GL_NUM_SHADER_BINARY_FORMATS:
case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
case GL_ARRAY_BUFFER_BINDING:
// case GL_FRAMEBUFFER_BINDING: // equivalent to DRAW_FRAMEBUFFER_BINDING_ANGLE
case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
case GL_FRAMEBUFFER_BINDING:
case GL_RENDERBUFFER_BINDING:
case GL_CURRENT_PROGRAM:
case GL_PACK_ALIGNMENT:
......@@ -461,6 +459,16 @@ bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsign
// Check for ES3.0+ parameter names which are also exposed as ES2 extensions
switch (pname)
{
// case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
{
......
......@@ -757,7 +757,7 @@ bool ValidTexLevelDestinationTarget(const ValidationContext *context, GLenum tar
}
}
bool ValidFramebufferTarget(GLenum target)
bool ValidFramebufferTarget(const ValidationContext *context, GLenum target)
{
static_assert(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER &&
GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER,
......@@ -767,10 +767,12 @@ bool ValidFramebufferTarget(GLenum target)
{
case GL_FRAMEBUFFER:
return true;
case GL_READ_FRAMEBUFFER:
return true;
case GL_DRAW_FRAMEBUFFER:
return true;
return (context->getExtensions().framebufferBlit ||
context->getClientMajorVersion() >= 3);
default:
return false;
}
......@@ -1280,7 +1282,7 @@ bool ValidateFramebufferRenderbufferParameters(gl::Context *context,
GLenum renderbuffertarget,
GLuint renderbuffer)
{
if (!ValidFramebufferTarget(target))
if (!ValidFramebufferTarget(context, target))
{
context->handleError(InvalidEnum());
return false;
......@@ -3000,7 +3002,7 @@ bool ValidateFramebufferTextureBase(Context *context,
GLuint texture,
GLint level)
{
if (!ValidFramebufferTarget(target))
if (!ValidFramebufferTarget(context, target))
{
ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
return false;
......@@ -3796,7 +3798,7 @@ bool ValidateGetFramebufferAttachmentParameterivBase(ValidationContext *context,
GLenum pname,
GLsizei *numParams)
{
if (!ValidFramebufferTarget(target))
if (!ValidFramebufferTarget(context, target))
{
context->handleError(InvalidEnum());
return false;
......
......@@ -37,7 +37,7 @@ bool ValidTextureExternalTarget(const ValidationContext *context, GLenum target)
bool ValidTexture2DDestinationTarget(const ValidationContext *context, GLenum target);
bool ValidTexture3DDestinationTarget(const ValidationContext *context, GLenum target);
bool ValidTexLevelDestinationTarget(const ValidationContext *context, GLenum target);
bool ValidFramebufferTarget(GLenum target);
bool ValidFramebufferTarget(const ValidationContext *context, GLenum target);
bool ValidBufferType(const ValidationContext *context, BufferBinding target);
bool ValidBufferParameter(const ValidationContext *context, GLenum pname, GLsizei *numParams);
bool ValidMipLevel(const ValidationContext *context, GLenum target, GLint level);
......
......@@ -4410,7 +4410,7 @@ bool ValidateBindBuffer(ValidationContext *context, BufferBinding target, GLuint
bool ValidateBindFramebuffer(ValidationContext *context, GLenum target, GLuint framebuffer)
{
if (!ValidFramebufferTarget(target))
if (!ValidFramebufferTarget(context, target))
{
ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
return false;
......@@ -4795,7 +4795,7 @@ bool ValidateRenderbufferStorageMultisampleANGLE(ValidationContext *context,
bool ValidateCheckFramebufferStatus(ValidationContext *context, GLenum target)
{
if (!ValidFramebufferTarget(target))
if (!ValidFramebufferTarget(context, target))
{
ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
return false;
......@@ -5929,7 +5929,7 @@ bool ValidateFramebufferRenderbuffer(Context *context,
GLenum renderbuffertarget,
GLuint renderbuffer)
{
if (!ValidFramebufferTarget(target))
if (!ValidFramebufferTarget(context, target))
{
ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
return false;
......
......@@ -668,7 +668,7 @@ bool ValidationFramebufferParameteri(Context *context, GLenum target, GLenum pna
return false;
}
if (!ValidFramebufferTarget(target))
if (!ValidFramebufferTarget(context, target))
{
context->handleError(InvalidEnum() << "Invalid framebuffer target.");
return false;
......@@ -744,7 +744,7 @@ bool ValidationGetFramebufferParameteri(Context *context,
return false;
}
if (!ValidFramebufferTarget(target))
if (!ValidFramebufferTarget(context, target))
{
ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
return false;
......
......@@ -158,13 +158,12 @@ class BlendMinMaxTest : public ANGLETest
void SetUpFramebuffer(GLenum colorFormat)
{
glGenFramebuffers(1, &mFramebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
glGenRenderbuffers(1, &mColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, colorFormat, getWindowWidth(), getWindowHeight());
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mColorRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mColorRenderbuffer);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
......
......@@ -890,6 +890,37 @@ TEST_P(WebGLCompatibilityTest, EnableRGB8RGBA8Extension)
}
}
// Test enabling the GL_ANGLE_framebuffer_blit extension
TEST_P(WebGLCompatibilityTest, EnableFramebufferBlitExtension)
{
EXPECT_FALSE(extensionEnabled("GL_ANGLE_framebuffer_blit"));
// This extensions become core in in ES3/WebGL2.
ANGLE_SKIP_TEST_IF(getClientMajorVersion() >= 3);
GLFramebuffer fbo;
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, fbo);
EXPECT_GL_ERROR(GL_INVALID_ENUM);
GLint result;
glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING_ANGLE, &result);
EXPECT_GL_ERROR(GL_INVALID_ENUM);
glBlitFramebufferANGLE(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
if (extensionRequestable("GL_ANGLE_framebuffer_blit"))
{
glRequestExtensionANGLE("GL_ANGLE_framebuffer_blit");
EXPECT_GL_NO_ERROR();
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, fbo);
glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING_ANGLE, &result);
EXPECT_GL_NO_ERROR();
}
}
// Test enabling the GL_OES_get_program_binary extension
TEST_P(WebGLCompatibilityTest, EnableProgramBinaryExtension)
{
......@@ -3495,12 +3526,12 @@ TEST_P(WebGLCompatibilityTest, DrawBuffers)
// Clears all the renderbuffers to red.
auto ClearEverythingToRed = [](GLRenderbuffer *renderbuffers) {
GLFramebuffer clearFBO;
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, clearFBO);
glBindFramebuffer(GL_FRAMEBUFFER, clearFBO);
glClearColor(1, 0, 0, 1);
for (int i = 0; i < 4; ++i)
{
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
renderbuffers[i]);
glClear(GL_COLOR_BUFFER_BIT);
}
......@@ -3510,14 +3541,14 @@ TEST_P(WebGLCompatibilityTest, DrawBuffers)
// Checks that the renderbuffers specified by mask have the correct color
auto CheckColors = [](GLRenderbuffer *renderbuffers, int mask, GLColor color) {
GLFramebuffer readFBO;
glBindFramebuffer(GL_READ_FRAMEBUFFER, readFBO);
glBindFramebuffer(GL_FRAMEBUFFER, readFBO);
for (int i = 0; i < 4; ++i)
{
if (mask & (1 << i))
{
glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER, renderbuffers[i]);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
renderbuffers[i]);
EXPECT_PIXEL_COLOR_EQ(0, 0, color);
}
}
......@@ -3538,14 +3569,14 @@ TEST_P(WebGLCompatibilityTest, DrawBuffers)
// Initialized the test framebuffer
GLFramebuffer drawFBO;
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
GLRenderbuffer renderbuffers[4];
for (int i = 0; i < 4; ++i)
{
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[i]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 1, 1);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_RENDERBUFFER,
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_RENDERBUFFER,
renderbuffers[i]);
}
......@@ -3585,7 +3616,7 @@ TEST_P(WebGLCompatibilityTest, DrawBuffers)
{
ClearEverythingToRed(renderbuffers);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
DrawBuffers(useEXT, 4, allDrawBuffers);
drawQuad(programESSL1, "a_pos", 0.5, 1.0, true);
ASSERT_GL_NO_ERROR();
......@@ -3599,7 +3630,7 @@ TEST_P(WebGLCompatibilityTest, DrawBuffers)
{
ClearEverythingToRed(renderbuffers);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
DrawBuffers(useEXT, 4, halfDrawBuffers);
drawQuad(programESSL1, "a_pos", 0.5, 1.0, true);
ASSERT_GL_NO_ERROR();
......@@ -3652,7 +3683,7 @@ TEST_P(WebGLCompatibilityTest, DrawBuffers)
{
ClearEverythingToRed(renderbuffers);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
DrawBuffers(useEXT, 4, allDrawBuffers);
drawQuad(writeOddOutputsProgram, "a_pos", 0.5, 1.0, true);
ASSERT_GL_NO_ERROR();
......@@ -3666,7 +3697,7 @@ TEST_P(WebGLCompatibilityTest, DrawBuffers)
{
ClearEverythingToRed(renderbuffers);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
DrawBuffers(useEXT, 4, halfDrawBuffers);
drawQuad(writeOddOutputsProgram, "a_pos", 0.5, 1.0, true);
ASSERT_GL_NO_ERROR();
......
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