Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <GLES2/gl2.h> | 5 #include <GLES2/gl2.h> |
| 6 #include <GLES2/gl2chromium.h> | 6 #include <GLES2/gl2chromium.h> |
| 7 #include <GLES2/gl2ext.h> | 7 #include <GLES2/gl2ext.h> |
| 8 #include <GLES2/gl2extchromium.h> | 8 #include <GLES2/gl2extchromium.h> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 31 namespace gpu { | 31 namespace gpu { |
| 32 namespace gles2 { | 32 namespace gles2 { |
| 33 | 33 |
| 34 static const int kImageWidth = 32; | 34 static const int kImageWidth = 32; |
| 35 static const int kImageHeight = 32; | 35 static const int kImageHeight = 32; |
| 36 | 36 |
| 37 class GpuMemoryBufferTest | 37 class GpuMemoryBufferTest |
| 38 : public testing::TestWithParam<gfx::GpuMemoryBuffer::Format> { | 38 : public testing::TestWithParam<gfx::GpuMemoryBuffer::Format> { |
| 39 protected: | 39 protected: |
| 40 void SetUp() override { | 40 void SetUp() override { |
| 41 gl_.Initialize(GLManager::Options()); | 41 auto options = GLManager::Options(); |
|
piman
2015/04/07 20:55:56
nit: GLManager::Options options;
Daniele Castagna
2015/04/07 21:02:57
Done.
| |
| 42 options.size = gfx::Size(kImageWidth, kImageHeight); | |
| 43 gl_.Initialize(options); | |
| 42 gl_.MakeCurrent(); | 44 gl_.MakeCurrent(); |
| 43 | |
| 44 glGenTextures(2, texture_ids_); | |
| 45 glBindTexture(GL_TEXTURE_2D, texture_ids_[1]); | |
| 46 | |
| 47 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | |
| 48 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | |
| 49 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
| 50 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | |
| 51 | |
| 52 glGenFramebuffers(1, &framebuffer_id_); | |
| 53 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id_); | |
| 54 glFramebufferTexture2D(GL_FRAMEBUFFER, | |
| 55 GL_COLOR_ATTACHMENT0, | |
| 56 GL_TEXTURE_2D, | |
| 57 texture_ids_[1], | |
| 58 0); | |
| 59 } | 45 } |
| 60 | 46 |
| 61 void TearDown() override { | 47 void TearDown() override { |
| 62 glDeleteTextures(2, texture_ids_); | |
| 63 glDeleteFramebuffers(1, &framebuffer_id_); | |
| 64 | |
| 65 gl_.Destroy(); | 48 gl_.Destroy(); |
| 66 } | 49 } |
| 67 | 50 |
| 68 GLManager gl_; | 51 GLManager gl_; |
| 69 GLuint texture_ids_[2]; | |
| 70 GLuint framebuffer_id_; | |
| 71 }; | 52 }; |
| 72 | 53 |
| 73 namespace { | 54 namespace { |
| 74 | 55 |
| 56 #define SHADER(Src) #Src | |
| 57 | |
| 58 // clang-format off | |
| 59 const char kVertexShader[] = | |
| 60 SHADER( | |
| 61 attribute vec4 a_position; | |
| 62 varying vec2 v_texCoord; | |
| 63 void main() { | |
| 64 gl_Position = a_position; | |
| 65 v_texCoord = vec2((a_position.x + 1.0) * 0.5, (a_position.y + 1.0) * 0.5); | |
| 66 } | |
| 67 ); | |
| 68 | |
| 69 const char* kFragmentShader = | |
| 70 SHADER( | |
| 71 precision mediump float; | |
| 72 uniform sampler2D a_texture; | |
| 73 varying vec2 v_texCoord; | |
| 74 void main() { | |
| 75 gl_FragColor = texture2D(a_texture, v_texCoord); | |
| 76 } | |
| 77 ); | |
| 78 // clang-format on | |
| 79 | |
| 75 std::vector<uint8> GetTexturePixel(const gfx::GpuMemoryBuffer::Format format) { | 80 std::vector<uint8> GetTexturePixel(const gfx::GpuMemoryBuffer::Format format) { |
| 76 std::vector<uint8> pixel; | 81 std::vector<uint8> pixel; |
| 77 switch (format) { | 82 switch (format) { |
| 78 case gfx::GpuMemoryBuffer::RGBA_8888: | 83 case gfx::GpuMemoryBuffer::RGBA_8888: |
| 79 pixel.push_back(255u); | 84 pixel.push_back(255u); |
| 80 pixel.push_back(0u); | 85 pixel.push_back(0u); |
| 81 pixel.push_back(0u); | 86 pixel.push_back(0u); |
| 82 pixel.push_back(255u); | 87 pixel.push_back(255u); |
| 83 return pixel; | 88 return pixel; |
| 84 case gfx::GpuMemoryBuffer::BGRA_8888: | 89 case gfx::GpuMemoryBuffer::BGRA_8888: |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 143 } | 148 } |
| 144 | 149 |
| 145 NOTREACHED(); | 150 NOTREACHED(); |
| 146 return 0; | 151 return 0; |
| 147 } | 152 } |
| 148 | 153 |
| 149 } // namespace | 154 } // namespace |
| 150 | 155 |
| 151 // An end to end test that tests the whole GpuMemoryBuffer lifecycle. | 156 // An end to end test that tests the whole GpuMemoryBuffer lifecycle. |
| 152 TEST_P(GpuMemoryBufferTest, Lifecycle) { | 157 TEST_P(GpuMemoryBufferTest, Lifecycle) { |
| 158 GLuint texture_id = 0; | |
| 159 glGenTextures(1, &texture_id); | |
| 160 ASSERT_NE(0u, texture_id); | |
| 161 glBindTexture(GL_TEXTURE_2D, texture_id); | |
| 162 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | |
| 163 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | |
| 164 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
| 165 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | |
| 166 | |
| 167 // Create the gpu memory buffer. | |
| 153 scoped_ptr<gfx::GpuMemoryBuffer> buffer(gl_.CreateGpuMemoryBuffer( | 168 scoped_ptr<gfx::GpuMemoryBuffer> buffer(gl_.CreateGpuMemoryBuffer( |
| 154 gfx::Size(kImageWidth, kImageHeight), GetParam())); | 169 gfx::Size(kImageWidth, kImageHeight), GetParam())); |
| 155 | 170 |
| 156 // Map buffer for writing. | 171 // Map buffer for writing. |
| 157 void* data; | 172 void* data; |
| 158 bool rv = buffer->Map(&data); | 173 bool rv = buffer->Map(&data); |
| 159 DCHECK(rv); | 174 DCHECK(rv); |
| 160 | 175 |
| 161 uint8* mapped_buffer = static_cast<uint8*>(data); | 176 uint8* mapped_buffer = static_cast<uint8*>(data); |
| 162 ASSERT_TRUE(mapped_buffer != NULL); | 177 ASSERT_TRUE(mapped_buffer != NULL); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 173 } | 188 } |
| 174 } | 189 } |
| 175 | 190 |
| 176 // Unmap the buffer. | 191 // Unmap the buffer. |
| 177 buffer->Unmap(); | 192 buffer->Unmap(); |
| 178 | 193 |
| 179 // Create the image. This should add the image ID to the ImageManager. | 194 // Create the image. This should add the image ID to the ImageManager. |
| 180 GLuint image_id = | 195 GLuint image_id = |
| 181 glCreateImageCHROMIUM(buffer->AsClientBuffer(), kImageWidth, kImageHeight, | 196 glCreateImageCHROMIUM(buffer->AsClientBuffer(), kImageWidth, kImageHeight, |
| 182 InternalFormat(GetParam())); | 197 InternalFormat(GetParam())); |
| 183 EXPECT_NE(0u, image_id); | 198 ASSERT_NE(0u, image_id); |
| 184 EXPECT_TRUE(gl_.decoder()->GetImageManager()->LookupImage(image_id) != NULL); | 199 ASSERT_TRUE(gl_.decoder()->GetImageManager()->LookupImage(image_id) != NULL); |
| 185 | 200 |
| 186 // Bind the texture and the image. | 201 // Bind the image. |
| 187 glBindTexture(GL_TEXTURE_2D, texture_ids_[0]); | |
| 188 glBindTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id); | 202 glBindTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id); |
| 189 | 203 |
| 190 // Copy texture so we can verify result using CheckPixels. | 204 // Build program, buffers and draw the texture. |
| 191 glCopyTextureCHROMIUM(GL_TEXTURE_2D, texture_ids_[0], texture_ids_[1], | 205 GLuint vertex_shader = |
| 192 InternalFormat(GetParam()), GL_UNSIGNED_BYTE); | 206 GLTestHelper::LoadShader(GL_VERTEX_SHADER, kVertexShader); |
| 193 EXPECT_TRUE(glGetError() == GL_NO_ERROR); | 207 GLuint fragment_shader = |
| 208 GLTestHelper::LoadShader(GL_FRAGMENT_SHADER, kFragmentShader); | |
| 209 GLuint program = GLTestHelper::SetupProgram(vertex_shader, fragment_shader); | |
| 210 ASSERT_NE(0u, program); | |
| 211 glUseProgram(program); | |
| 212 | |
| 213 GLint sampler_location = glGetUniformLocation(program, "a_texture"); | |
| 214 ASSERT_NE(-1, sampler_location); | |
| 215 glUniform1i(sampler_location, 0); | |
| 216 | |
| 217 GLuint vbo = | |
| 218 GLTestHelper::SetupUnitQuad(glGetAttribLocation(program, "a_position")); | |
| 219 ASSERT_NE(0u, vbo); | |
| 220 glViewport(0, 0, kImageWidth, kImageHeight); | |
| 221 glDrawArrays(GL_TRIANGLES, 0, 6); | |
| 222 ASSERT_TRUE(glGetError() == GL_NO_ERROR); | |
| 194 | 223 |
| 195 // Check if pixels match the values that were assigned to the mapped buffer. | 224 // Check if pixels match the values that were assigned to the mapped buffer. |
| 196 GLTestHelper::CheckPixels(0, 0, kImageWidth, kImageHeight, 0, | 225 GLTestHelper::CheckPixels(0, 0, kImageWidth, kImageHeight, 0, |
| 197 &GetFramebufferPixel(GetParam()).front()); | 226 &GetFramebufferPixel(GetParam()).front()); |
| 198 EXPECT_TRUE(GL_NO_ERROR == glGetError()); | 227 EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
| 199 | 228 |
| 200 // Release the image. | 229 // Release the image. |
| 201 glReleaseTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id); | 230 glReleaseTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id); |
| 202 | 231 |
| 203 // Destroy the image. | 232 // Clean up. |
| 233 glDeleteProgram(program); | |
| 234 glDeleteShader(vertex_shader); | |
| 235 glDeleteShader(fragment_shader); | |
| 236 glDeleteBuffers(1, &vbo); | |
| 204 glDestroyImageCHROMIUM(image_id); | 237 glDestroyImageCHROMIUM(image_id); |
| 238 glDeleteTextures(1, &texture_id); | |
| 205 } | 239 } |
| 206 | 240 |
| 207 INSTANTIATE_TEST_CASE_P(GpuMemoryBufferTests, | 241 INSTANTIATE_TEST_CASE_P(GpuMemoryBufferTests, |
| 208 GpuMemoryBufferTest, | 242 GpuMemoryBufferTest, |
| 209 ::testing::Values(gfx::GpuMemoryBuffer::RGBA_8888, | 243 ::testing::Values(gfx::GpuMemoryBuffer::RGBA_8888, |
| 210 gfx::GpuMemoryBuffer::BGRA_8888)); | 244 gfx::GpuMemoryBuffer::BGRA_8888)); |
| 211 | 245 |
| 212 } // namespace gles2 | 246 } // namespace gles2 |
| 213 } // namespace gpu | 247 } // namespace gpu |
| OLD | NEW |