Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Unified Diff: gpu/command_buffer/service/framebuffer_manager_unittest.cc

Issue 2142353002: Validate fbo color image format and fragment shader output variable type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/framebuffer_manager.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/framebuffer_manager_unittest.cc
diff --git a/gpu/command_buffer/service/framebuffer_manager_unittest.cc b/gpu/command_buffer/service/framebuffer_manager_unittest.cc
index fef4b6e412e2f12bb6439a6f53bf0d3e799b1897..6c7dde58261145b95c7f1553574bcfe70d39eda1 100644
--- a/gpu/command_buffer/service/framebuffer_manager_unittest.cc
+++ b/gpu/command_buffer/service/framebuffer_manager_unittest.cc
@@ -1004,7 +1004,6 @@ TEST_F(FramebufferInfoTest, ClearIntegerOutsideRenderableRange) {
TEST_F(FramebufferInfoTest, DrawBuffers) {
const GLuint kTextureClientId[] = { 33, 34 };
const GLuint kTextureServiceId[] = { 333, 334 };
-
for (GLenum i = GL_COLOR_ATTACHMENT0;
i < GL_COLOR_ATTACHMENT0 + kMaxColorAttachments; ++i) {
EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(i));
@@ -1024,7 +1023,7 @@ TEST_F(FramebufferInfoTest, DrawBuffers) {
kTextureClientId[ii], kTextureServiceId[ii]);
scoped_refptr<TextureRef> texture(
texture_manager_->GetTexture(kTextureClientId[ii]));
- ASSERT_TRUE(texture.get() != NULL);
+ ASSERT_TRUE(texture.get());
framebuffer_->AttachTexture(
GL_COLOR_ATTACHMENT0 + ii, texture.get(), GL_TEXTURE_2D, 0, 0);
@@ -1033,7 +1032,7 @@ TEST_F(FramebufferInfoTest, DrawBuffers) {
const Framebuffer::Attachment* attachment =
framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0 + ii);
- ASSERT_TRUE(attachment != NULL);
+ ASSERT_TRUE(attachment);
EXPECT_TRUE(attachment->cleared());
}
EXPECT_TRUE(framebuffer_->IsCleared());
@@ -1049,7 +1048,7 @@ TEST_F(FramebufferInfoTest, DrawBuffers) {
const Framebuffer::Attachment* attachment1 =
framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT1);
- ASSERT_TRUE(attachment1 != NULL);
+ ASSERT_TRUE(attachment1);
EXPECT_FALSE(attachment1->cleared());
EXPECT_FALSE(framebuffer_->IsCleared());
EXPECT_TRUE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT1));
@@ -1071,7 +1070,8 @@ TEST_F(FramebufferInfoTest, DrawBuffers) {
EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
.Times(1)
.RetiresOnSaturation();
- EXPECT_TRUE(framebuffer_->PrepareDrawBuffersForClear());
+ EXPECT_TRUE(
+ framebuffer_->PrepareDrawBuffersForClearingUninitializedAttachments());
// Now we disable draw buffer 1.
buffers[1] = GL_NONE;
@@ -1081,14 +1081,153 @@ TEST_F(FramebufferInfoTest, DrawBuffers) {
EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
.Times(1)
.RetiresOnSaturation();
- EXPECT_TRUE(framebuffer_->PrepareDrawBuffersForClear());
+ EXPECT_TRUE(
+ framebuffer_->PrepareDrawBuffersForClearingUninitializedAttachments());
// Now we disable draw buffer 0, enable draw buffer 1.
buffers[0] = GL_NONE;
buffers[1] = GL_COLOR_ATTACHMENT1;
framebuffer_->SetDrawBuffers(2, buffers);
// This is the perfect setting for clear. No need to call DrawBuffers().
- EXPECT_FALSE(framebuffer_->PrepareDrawBuffersForClear());
+ EXPECT_FALSE(
+ framebuffer_->PrepareDrawBuffersForClearingUninitializedAttachments());
+}
+
+TEST_F(FramebufferInfoTest, DrawBufferMasks) {
+ const GLuint kTextureClientId[] = { 33, 34, 35, 36, 37 };
+ const GLuint kTextureServiceId[] = { 333, 334, 335, 336, 337 };
+ const GLenum kAttachment[] = {
+ GL_COLOR_ATTACHMENT0,
+ GL_COLOR_ATTACHMENT1,
+ GL_COLOR_ATTACHMENT2,
+ GL_COLOR_ATTACHMENT4,
+ GL_DEPTH_ATTACHMENT};
+ const GLenum kInternalFormat[] = {
+ GL_RGBA8,
+ GL_RG32UI,
+ GL_R16I,
+ GL_R16F,
+ GL_DEPTH_COMPONENT24};
+ const GLenum kFormat[] = {
+ GL_RGBA,
+ GL_RG_INTEGER,
+ GL_RED_INTEGER,
+ GL_RED,
+ GL_DEPTH_COMPONENT};
+ const GLenum kType[] = {
+ GL_UNSIGNED_BYTE,
+ GL_UNSIGNED_INT,
+ GL_SHORT,
+ GL_FLOAT,
+ GL_UNSIGNED_INT};
+
+ for (size_t ii = 0; ii < arraysize(kTextureClientId); ++ii) {
+ texture_manager_->CreateTexture(
+ kTextureClientId[ii], kTextureServiceId[ii]);
+ scoped_refptr<TextureRef> texture(
+ texture_manager_->GetTexture(kTextureClientId[ii]));
+ ASSERT_TRUE(texture.get());
+ texture_manager_->SetTarget(texture.get(), GL_TEXTURE_2D);
+ texture_manager_->SetLevelInfo(texture.get(), GL_TEXTURE_2D, 0,
+ kInternalFormat[ii], 4, 4, 1, 0,
+ kFormat[ii], kType[ii], gfx::Rect());
+ framebuffer_->AttachTexture(
+ kAttachment[ii], texture.get(), GL_TEXTURE_2D, 0, 0);
+ ASSERT_TRUE(framebuffer_->GetAttachment(kAttachment[ii]));
+ }
+
+ manager_.MarkAsComplete(framebuffer_);
+
+ { // Default draw buffer settings
+ EXPECT_EQ(0x3u, framebuffer_->draw_buffer_type_mask());
+ EXPECT_EQ(0x3u, framebuffer_->draw_buffer_bound_mask());
+ EXPECT_FALSE(framebuffer_->ContainsActiveIntegerAttachments());
+ }
+
+ { // Exact draw buffer settings.
+ GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
+ GL_COLOR_ATTACHMENT2, GL_NONE, GL_COLOR_ATTACHMENT4};
+ framebuffer_->SetDrawBuffers(5, buffers);
+ EXPECT_EQ(0x31Bu, framebuffer_->draw_buffer_type_mask());
+ EXPECT_EQ(0x33Fu, framebuffer_->draw_buffer_bound_mask());
+ EXPECT_TRUE(framebuffer_->ContainsActiveIntegerAttachments());
+ }
+
+ { // All disabled draw buffer settings.
+ GLenum buffers[] = {GL_NONE};
+ framebuffer_->SetDrawBuffers(1, buffers);
+ EXPECT_EQ(0u, framebuffer_->draw_buffer_type_mask());
+ EXPECT_EQ(0u, framebuffer_->draw_buffer_bound_mask());
+ EXPECT_FALSE(framebuffer_->ContainsActiveIntegerAttachments());
+ }
+
+ { // Filter out integer buffers.
+ GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_NONE, GL_NONE, GL_NONE,
+ GL_COLOR_ATTACHMENT4};
+ framebuffer_->SetDrawBuffers(5, buffers);
+ EXPECT_EQ(0x303u, framebuffer_->draw_buffer_type_mask());
+ EXPECT_EQ(0x303u, framebuffer_->draw_buffer_bound_mask());
+ EXPECT_FALSE(framebuffer_->ContainsActiveIntegerAttachments());
+ }
+
+ { // All enabled draw buffer settings.
+ GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
+ GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3,
+ GL_COLOR_ATTACHMENT4, GL_COLOR_ATTACHMENT5,
+ GL_COLOR_ATTACHMENT6, GL_COLOR_ATTACHMENT7};
+ framebuffer_->SetDrawBuffers(8, buffers);
+ EXPECT_EQ(0x31Bu, framebuffer_->draw_buffer_type_mask());
+ EXPECT_EQ(0x33Fu, framebuffer_->draw_buffer_bound_mask());
+ EXPECT_TRUE(framebuffer_->ContainsActiveIntegerAttachments());
+ }
+
+ // Test ValidateAndAdjustDrawBuffers().
+
+ // gl_FragColor situation.
+ EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_TRUE(framebuffer_->ValidateAndAdjustDrawBuffers(0x3u, 0x3u));
+ // gl_FragData situation.
+ EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
+ .Times(0);
+ EXPECT_FALSE(
+ framebuffer_->ValidateAndAdjustDrawBuffers(0xFFFFFFFFu, 0xFFFFFFFFu));
+ // User defined output variables, fully match.
+ EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_TRUE(
+ framebuffer_->ValidateAndAdjustDrawBuffers(0x31Bu, 0x33Fu));
+ // Call it a second time - this test is critical, making sure we don't
+ // call DrawBuffers() every draw call if program doesn't change.
+ EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
+ .Times(0);
+ EXPECT_TRUE(
+ framebuffer_->ValidateAndAdjustDrawBuffers(0x31Bu, 0x33Fu));
+ // User defined output variables, fully on, one type mismatch.
+ EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
+ .Times(0);
+ EXPECT_FALSE(
+ framebuffer_->ValidateAndAdjustDrawBuffers(0x32Bu, 0x33Fu));
+ // Empty output.
+ EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_TRUE(
+ framebuffer_->ValidateAndAdjustDrawBuffers(0u, 0u));
+ // User defined output variables, some active buffers have no corresponding
+ // output variables, but if they do, types match.
+ EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_TRUE(
+ framebuffer_->ValidateAndAdjustDrawBuffers(0x310u, 0x330u));
+ // Call it a second time - making sure DrawBuffers isn't triggered.
+ EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
+ .Times(0);
+ EXPECT_TRUE(
+ framebuffer_->ValidateAndAdjustDrawBuffers(0x310u, 0x330u));
}
class FramebufferInfoFloatTest : public FramebufferInfoTest {
« no previous file with comments | « gpu/command_buffer/service/framebuffer_manager.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698