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