1 // Copyright (c) 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <GLES2/gl2.h>
6 #include <GLES2/gl2ext.h>
7 #include <GLES2/gl2extchromium.h>
8 #include <GLES3/gl3.h>
9 #include <stdint.h>
10 
11 #include "gpu/command_buffer/tests/gl_manager.h"
12 #include "gpu/command_buffer/tests/gl_test_utils.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 
16 namespace gpu {
17 
18 class ObjectBindingsTest : public testing::Test {
19  protected:
SetUp()20   void SetUp() override {
21     GLManager::Options options;
22     options.context_type = CONTEXT_TYPE_OPENGLES3;
23     gl_.Initialize(options);
24   }
25 
TearDown()26   void TearDown() override { gl_.Destroy(); }
IsApplicable() const27   bool IsApplicable() const { return gl_.IsInitialized(); }
28 
29   GLManager gl_;
30 };
31 
TEST_F(ObjectBindingsTest,Buffers)32 TEST_F(ObjectBindingsTest, Buffers) {
33   if (!IsApplicable()) {
34     return;
35   }
36 
37   const std::pair<GLenum, GLenum> buffer_bindings[] = {
38       {GL_ARRAY_BUFFER, GL_ARRAY_BUFFER_BINDING},
39       {GL_ELEMENT_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER_BINDING},
40       {GL_PIXEL_PACK_BUFFER, GL_PIXEL_PACK_BUFFER_BINDING},
41       {GL_PIXEL_UNPACK_BUFFER, GL_PIXEL_UNPACK_BUFFER_BINDING},
42       {GL_TRANSFORM_FEEDBACK_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER_BINDING},
43       {GL_COPY_READ_BUFFER, GL_COPY_READ_BUFFER_BINDING},
44       {GL_COPY_WRITE_BUFFER, GL_COPY_WRITE_BUFFER_BINDING},
45       {GL_UNIFORM_BUFFER, GL_UNIFORM_BUFFER_BINDING},
46   };
47 
48   for (auto binding : buffer_bindings) {
49     GLuint buffer = 0;
50     glGenBuffers(1, &buffer);
51     glBindBuffer(binding.first, buffer);
52 
53     {
54       GLint result = 0;
55       glGetIntegerv(binding.second, &result);
56       EXPECT_EQ(static_cast<GLuint>(result), buffer);
57     }
58 
59     {
60       GLfloat result = 0;
61       glGetFloatv(binding.second, &result);
62       EXPECT_EQ(static_cast<GLuint>(result), buffer);
63     }
64 
65     glBindBuffer(binding.first, 0);
66     glDeleteBuffers(1, &buffer);
67   }
68 
69   GLTestHelper::CheckGLError("no errors", __LINE__);
70 }
71 
TEST_F(ObjectBindingsTest,FramebufferAttachments)72 TEST_F(ObjectBindingsTest, FramebufferAttachments) {
73   if (!IsApplicable()) {
74     return;
75   }
76 
77   GLuint texture = 0;
78   glGenTextures(1, &texture);
79   glBindTexture(GL_TEXTURE_2D, texture);
80   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
81                nullptr);
82 
83   GLuint renderbuffer = 0;
84   glGenRenderbuffers(1, &renderbuffer);
85   glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
86   glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
87 
88   GLuint framebuffer = 0;
89   glGenFramebuffers(1, &framebuffer);
90   glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
91 
92   glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
93                          texture, 0);
94   {
95     GLint result = 0;
96     glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
97                                           GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,
98                                           &result);
99     EXPECT_EQ(static_cast<GLuint>(result), texture);
100   }
101 
102   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
103                             GL_RENDERBUFFER, renderbuffer);
104   {
105     GLint result = 0;
106     glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
107                                           GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,
108                                           &result);
109     EXPECT_EQ(static_cast<GLuint>(result), renderbuffer);
110   }
111 
112   GLTestHelper::CheckGLError("no errors", __LINE__);
113 }
114 
115 }  // namespace gpu
116