Hash :
ccd0b7e1
Author :
Date :
2020-11-30T08:37:04
Add support for OES_framebuffer_object extension Expose OES_framebuffer_object extension for GLES1 contexts. Bug: angleproject:5401 Test: FramebufferObjectTest* Change-Id: I63b504f580cdab4655b4bfbd3438bcd807b422ea Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2561795 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
//
// Copyright 2020 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// FramebufferObjectTest.cpp: Tests basic usage of OES_framebuffer_object extension.
#include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h"
using namespace angle;
class FramebufferObjectTest : public ANGLETest
{
protected:
FramebufferObjectTest()
{
setWindowWidth(32);
setWindowHeight(32);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
setConfigDepthBits(24);
}
void testSetUp() override
{
mTexture.reset(new GLTexture());
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, mTexture->get());
}
void testTearDown() override { mTexture.reset(); }
std::unique_ptr<GLTexture> mTexture;
};
// Checks that framebuffer object can be used without GL errors.
TEST_P(FramebufferObjectTest, FramebufferObject)
{
GLuint fboId;
GLint params;
glGenFramebuffersOES(1, &fboId);
EXPECT_GL_NO_ERROR();
glIsFramebufferOES(fboId);
EXPECT_GL_NO_ERROR();
glBindFramebufferOES(GL_FRAMEBUFFER, fboId);
EXPECT_GL_NO_ERROR();
glCheckFramebufferStatusOES(GL_FRAMEBUFFER);
EXPECT_GL_NO_ERROR();
glGetFramebufferAttachmentParameterivOES(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, ¶ms);
EXPECT_GL_NO_ERROR();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDeleteFramebuffersOES(1, &fboId);
EXPECT_GL_NO_ERROR();
}
// Checks that texture object can be bound for framebuffer object.
TEST_P(FramebufferObjectTest, TextureObject)
{
GLuint fboId;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glFramebufferTexture2DOES(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture->get(),
0);
EXPECT_GL_NO_ERROR();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDeleteFramebuffers(1, &fboId);
}
// Checks that renderbuffer object can be used and can be bound for framebuffer object.
TEST_P(FramebufferObjectTest, RenderbufferObject)
{
GLuint fboId;
GLuint rboId;
GLint params;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glGenRenderbuffersOES(1, &rboId);
EXPECT_GL_NO_ERROR();
glIsRenderbufferOES(rboId);
EXPECT_GL_NO_ERROR();
glBindRenderbufferOES(GL_RENDERBUFFER, rboId);
EXPECT_GL_NO_ERROR();
glRenderbufferStorageOES(GL_RENDERBUFFER, GL_RGBA8, 32, 32);
EXPECT_GL_NO_ERROR();
glFramebufferRenderbufferOES(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rboId);
EXPECT_GL_NO_ERROR();
glGetRenderbufferParameterivOES(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, ¶ms);
EXPECT_GL_NO_ERROR();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDeleteFramebuffers(1, &fboId);
glDeleteRenderbuffersOES(1, &rboId);
EXPECT_GL_NO_ERROR();
}
// Checks that generateMipmap can be called without GL errors.
TEST_P(FramebufferObjectTest, GenerateMipmap)
{
constexpr uint32_t kSize = 32;
std::vector<unsigned char> pixelData(kSize * kSize * 4, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data());
glGenerateMipmapOES(GL_TEXTURE_2D);
EXPECT_GL_NO_ERROR();
}
ANGLE_INSTANTIATE_TEST_ES1(FramebufferObjectTest);