| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "cc/scheduler/texture_uploader.h" | 5 #include "cc/scheduler/texture_uploader.h" |
| 6 | 6 |
| 7 #include "cc/base/util.h" | 7 #include "cc/base/util.h" |
| 8 #include "cc/resources/prioritized_resource.h" | 8 #include "cc/resources/prioritized_resource.h" |
| 9 #include "cc/test/test_web_graphics_context_3d.h" | 9 #include "cc/test/test_web_graphics_context_3d.h" |
| 10 #include "testing/gmock/include/gmock/gmock.h" | 10 #include "testing/gmock/include/gmock/gmock.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 | 63 |
| 64 virtual void texSubImage2D(WGC3Denum target, | 64 virtual void texSubImage2D(WGC3Denum target, |
| 65 WGC3Dint level, | 65 WGC3Dint level, |
| 66 WGC3Dint xoffset, | 66 WGC3Dint xoffset, |
| 67 WGC3Dint yoffset, | 67 WGC3Dint yoffset, |
| 68 WGC3Dsizei width, | 68 WGC3Dsizei width, |
| 69 WGC3Dsizei height, | 69 WGC3Dsizei height, |
| 70 WGC3Denum format, | 70 WGC3Denum format, |
| 71 WGC3Denum type, | 71 WGC3Denum type, |
| 72 const void* pixels) OVERRIDE { | 72 const void* pixels) OVERRIDE { |
| 73 EXPECT_EQ(GL_TEXTURE_2D, target); | 73 EXPECT_EQ(static_cast<unsigned>(GL_TEXTURE_2D), target); |
| 74 EXPECT_EQ(0, level); | 74 EXPECT_EQ(0, level); |
| 75 EXPECT_LE(0, width); | 75 EXPECT_LE(0, width); |
| 76 EXPECT_LE(0, height); | 76 EXPECT_LE(0, height); |
| 77 EXPECT_LE(0, xoffset); | 77 EXPECT_LE(0, xoffset); |
| 78 EXPECT_LE(0, yoffset); | 78 EXPECT_LE(0, yoffset); |
| 79 EXPECT_LE(0, width); | 79 EXPECT_LE(0, width); |
| 80 EXPECT_LE(0, height); | 80 EXPECT_LE(0, height); |
| 81 | 81 |
| 82 // Check for allowed format/type combination. | 82 // Check for allowed format/type combination. |
| 83 unsigned int bytes_per_pixel = 0; | 83 unsigned int bytes_per_pixel = 0; |
| 84 switch (format) { | 84 switch (format) { |
| 85 case GL_ALPHA: | 85 case GL_ALPHA: |
| 86 EXPECT_EQ(GL_UNSIGNED_BYTE, type); | 86 EXPECT_EQ(static_cast<unsigned>(GL_UNSIGNED_BYTE), type); |
| 87 bytes_per_pixel = 1; | 87 bytes_per_pixel = 1; |
| 88 break; | 88 break; |
| 89 case GL_RGB: | 89 case GL_RGB: |
| 90 EXPECT_NE(GL_UNSIGNED_SHORT_4_4_4_4, type); | 90 EXPECT_NE(static_cast<unsigned>(GL_UNSIGNED_SHORT_4_4_4_4), type); |
| 91 EXPECT_NE(GL_UNSIGNED_SHORT_5_5_5_1, type); | 91 EXPECT_NE(static_cast<unsigned>(GL_UNSIGNED_SHORT_5_5_5_1), type); |
| 92 switch (type) { | 92 switch (type) { |
| 93 case GL_UNSIGNED_BYTE: | 93 case GL_UNSIGNED_BYTE: |
| 94 bytes_per_pixel = 3; | 94 bytes_per_pixel = 3; |
| 95 break; | 95 break; |
| 96 case GL_UNSIGNED_SHORT_5_6_5: | 96 case GL_UNSIGNED_SHORT_5_6_5: |
| 97 bytes_per_pixel = 2; | 97 bytes_per_pixel = 2; |
| 98 break; | 98 break; |
| 99 } | 99 } |
| 100 break; | 100 break; |
| 101 case GL_RGBA: | 101 case GL_RGBA: |
| 102 EXPECT_NE(GL_UNSIGNED_SHORT_5_6_5, type); | 102 EXPECT_NE(static_cast<unsigned>(GL_UNSIGNED_SHORT_5_6_5), type); |
| 103 switch (type) { | 103 switch (type) { |
| 104 case GL_UNSIGNED_BYTE: | 104 case GL_UNSIGNED_BYTE: |
| 105 bytes_per_pixel = 4; | 105 bytes_per_pixel = 4; |
| 106 break; | 106 break; |
| 107 case GL_UNSIGNED_SHORT_4_4_4_4: | 107 case GL_UNSIGNED_SHORT_4_4_4_4: |
| 108 bytes_per_pixel = 2; | 108 bytes_per_pixel = 2; |
| 109 break; | 109 break; |
| 110 case GL_UNSIGNED_SHORT_5_5_5_1: | 110 case GL_UNSIGNED_SHORT_5_5_5_1: |
| 111 bytes_per_pixel = 2; | 111 bytes_per_pixel = 2; |
| 112 break; | 112 break; |
| 113 } | 113 } |
| 114 break; | 114 break; |
| 115 case GL_LUMINANCE: | 115 case GL_LUMINANCE: |
| 116 EXPECT_EQ(GL_UNSIGNED_BYTE, type); | 116 EXPECT_EQ(static_cast<unsigned>(GL_UNSIGNED_BYTE), type); |
| 117 bytes_per_pixel = 1; | 117 bytes_per_pixel = 1; |
| 118 break; | 118 break; |
| 119 case GL_LUMINANCE_ALPHA: | 119 case GL_LUMINANCE_ALPHA: |
| 120 EXPECT_EQ(GL_UNSIGNED_BYTE, type); | 120 EXPECT_EQ(static_cast<unsigned>(GL_UNSIGNED_BYTE), type); |
| 121 bytes_per_pixel = 2; | 121 bytes_per_pixel = 2; |
| 122 break; | 122 break; |
| 123 } | 123 } |
| 124 | 124 |
| 125 // If NULL, we aren't checking texture contents. | 125 // If NULL, we aren't checking texture contents. |
| 126 if (pixels == NULL) | 126 if (pixels == NULL) |
| 127 return; | 127 return; |
| 128 | 128 |
| 129 const uint8* bytes = static_cast<const uint8*>(pixels); | 129 const uint8* bytes = static_cast<const uint8*>(pixels); |
| 130 // We'll expect the first byte of every row to be 0x1, and the last byte to | 130 // We'll expect the first byte of every row to be 0x1, and the last byte to |
| 131 // be 0x2. | 131 // be 0x2. |
| 132 const unsigned int stride = | 132 const unsigned int stride = |
| 133 RoundUp(bytes_per_pixel * width, unpack_alignment_); | 133 RoundUp(bytes_per_pixel * width, unpack_alignment_); |
| 134 for (WGC3Dsizei row = 0; row < height; ++row) { | 134 for (WGC3Dsizei row = 0; row < height; ++row) { |
| 135 const uint8* row_bytes = | 135 const uint8* row_bytes = |
| 136 bytes + (xoffset * bytes_per_pixel + (yoffset + row) * stride); | 136 bytes + (xoffset * bytes_per_pixel + (yoffset + row) * stride); |
| 137 EXPECT_EQ(0x1, row_bytes[0]); | 137 EXPECT_EQ(0x1, row_bytes[0]); |
| 138 EXPECT_EQ(0x2, row_bytes[width * bytes_per_pixel - 1]); | 138 EXPECT_EQ(0x2, row_bytes[width * bytes_per_pixel - 1]); |
| 139 } | 139 } |
| 140 } | 140 } |
| 141 | 141 |
| 142 void SetResultAvailable(unsigned result_available) { | 142 void SetResultAvailable(unsigned result_available) { |
| 143 result_available_ = result_available; | 143 result_available_ = result_available; |
| 144 } | 144 } |
| 145 | 145 |
| 146 private: | 146 private: |
| 147 unsigned result_available_; |
| 147 unsigned unpack_alignment_; | 148 unsigned unpack_alignment_; |
| 148 unsigned result_available_; | |
| 149 | 149 |
| 150 DISALLOW_COPY_AND_ASSIGN(TestWebGraphicsContext3DTextureUpload); | 150 DISALLOW_COPY_AND_ASSIGN(TestWebGraphicsContext3DTextureUpload); |
| 151 }; | 151 }; |
| 152 | 152 |
| 153 void UploadTexture(TextureUploader* uploader, | 153 void UploadTexture(TextureUploader* uploader, |
| 154 WGC3Denum format, | 154 WGC3Denum format, |
| 155 gfx::Size size, | 155 gfx::Size size, |
| 156 const uint8* data) { | 156 const uint8* data) { |
| 157 uploader->Upload(data, | 157 uploader->Upload(data, |
| 158 gfx::Rect(size), | 158 gfx::Rect(size), |
| 159 gfx::Rect(size), | 159 gfx::Rect(size), |
| 160 gfx::Vector2d(), | 160 gfx::Vector2d(), |
| 161 format, | 161 format, |
| 162 size); | 162 size); |
| 163 } | 163 } |
| 164 | 164 |
| 165 TEST(TextureUploaderTest, NumBlockingUploads) { | 165 TEST(TextureUploaderTest, NumBlockingUploads) { |
| 166 scoped_ptr<TestWebGraphicsContext3DTextureUpload> fake_context( | 166 scoped_ptr<TestWebGraphicsContext3DTextureUpload> fake_context( |
| 167 new TestWebGraphicsContext3DTextureUpload); | 167 new TestWebGraphicsContext3DTextureUpload); |
| 168 scoped_ptr<TextureUploader> uploader = | 168 scoped_ptr<TextureUploader> uploader = |
| 169 TextureUploader::Create(fake_context.get(), false, false); | 169 TextureUploader::Create(fake_context.get(), false, false); |
| 170 | 170 |
| 171 fake_context->SetResultAvailable(0); | 171 fake_context->SetResultAvailable(0); |
| 172 EXPECT_EQ(0, uploader->NumBlockingUploads()); | 172 EXPECT_EQ(0u, uploader->NumBlockingUploads()); |
| 173 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 173 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
| 174 EXPECT_EQ(1, uploader->NumBlockingUploads()); | 174 EXPECT_EQ(1u, uploader->NumBlockingUploads()); |
| 175 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 175 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
| 176 EXPECT_EQ(2, uploader->NumBlockingUploads()); | 176 EXPECT_EQ(2u, uploader->NumBlockingUploads()); |
| 177 | 177 |
| 178 fake_context->SetResultAvailable(1); | 178 fake_context->SetResultAvailable(1); |
| 179 EXPECT_EQ(0, uploader->NumBlockingUploads()); | 179 EXPECT_EQ(0u, uploader->NumBlockingUploads()); |
| 180 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 180 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
| 181 EXPECT_EQ(0, uploader->NumBlockingUploads()); | 181 EXPECT_EQ(0u, uploader->NumBlockingUploads()); |
| 182 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 182 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
| 183 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 183 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
| 184 EXPECT_EQ(0, uploader->NumBlockingUploads()); | 184 EXPECT_EQ(0u, uploader->NumBlockingUploads()); |
| 185 } | 185 } |
| 186 | 186 |
| 187 TEST(TextureUploaderTest, MarkPendingUploadsAsNonBlocking) { | 187 TEST(TextureUploaderTest, MarkPendingUploadsAsNonBlocking) { |
| 188 scoped_ptr<TestWebGraphicsContext3DTextureUpload> fake_context( | 188 scoped_ptr<TestWebGraphicsContext3DTextureUpload> fake_context( |
| 189 new TestWebGraphicsContext3DTextureUpload); | 189 new TestWebGraphicsContext3DTextureUpload); |
| 190 scoped_ptr<TextureUploader> uploader = | 190 scoped_ptr<TextureUploader> uploader = |
| 191 TextureUploader::Create(fake_context.get(), false, false); | 191 TextureUploader::Create(fake_context.get(), false, false); |
| 192 | 192 |
| 193 fake_context->SetResultAvailable(0); | 193 fake_context->SetResultAvailable(0); |
| 194 EXPECT_EQ(0, uploader->NumBlockingUploads()); | 194 EXPECT_EQ(0u, uploader->NumBlockingUploads()); |
| 195 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 195 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
| 196 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 196 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
| 197 EXPECT_EQ(2, uploader->NumBlockingUploads()); | 197 EXPECT_EQ(2u, uploader->NumBlockingUploads()); |
| 198 | 198 |
| 199 uploader->MarkPendingUploadsAsNonBlocking(); | 199 uploader->MarkPendingUploadsAsNonBlocking(); |
| 200 EXPECT_EQ(0, uploader->NumBlockingUploads()); | 200 EXPECT_EQ(0u, uploader->NumBlockingUploads()); |
| 201 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 201 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
| 202 EXPECT_EQ(1, uploader->NumBlockingUploads()); | 202 EXPECT_EQ(1u, uploader->NumBlockingUploads()); |
| 203 | 203 |
| 204 fake_context->SetResultAvailable(1); | 204 fake_context->SetResultAvailable(1); |
| 205 EXPECT_EQ(0, uploader->NumBlockingUploads()); | 205 EXPECT_EQ(0u, uploader->NumBlockingUploads()); |
| 206 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 206 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
| 207 uploader->MarkPendingUploadsAsNonBlocking(); | 207 uploader->MarkPendingUploadsAsNonBlocking(); |
| 208 EXPECT_EQ(0, uploader->NumBlockingUploads()); | 208 EXPECT_EQ(0u, uploader->NumBlockingUploads()); |
| 209 } | 209 } |
| 210 | 210 |
| 211 TEST(TextureUploaderTest, UploadContentsTest) { | 211 TEST(TextureUploaderTest, UploadContentsTest) { |
| 212 scoped_ptr<TestWebGraphicsContext3DTextureUpload> fake_context( | 212 scoped_ptr<TestWebGraphicsContext3DTextureUpload> fake_context( |
| 213 new TestWebGraphicsContext3DTextureUpload); | 213 new TestWebGraphicsContext3DTextureUpload); |
| 214 scoped_ptr<TextureUploader> uploader = | 214 scoped_ptr<TextureUploader> uploader = |
| 215 TextureUploader::Create(fake_context.get(), false, false); | 215 TextureUploader::Create(fake_context.get(), false, false); |
| 216 uint8 buffer[256 * 256 * 4]; | 216 uint8 buffer[256 * 256 * 4]; |
| 217 | 217 |
| 218 // Upload a tightly packed 256x256 RGBA texture. | 218 // Upload a tightly packed 256x256 RGBA texture. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 238 for (int i = 0; i < 86; ++i) { | 238 for (int i = 0; i < 86; ++i) { |
| 239 // Mark the beginning and end of each row, for the test. | 239 // Mark the beginning and end of each row, for the test. |
| 240 buffer[i * 1 * 82] = 0x1; | 240 buffer[i * 1 * 82] = 0x1; |
| 241 buffer[(i + 1) * 82 - 1] = 0x2; | 241 buffer[(i + 1) * 82 - 1] = 0x2; |
| 242 } | 242 } |
| 243 UploadTexture(uploader.get(), GL_LUMINANCE, gfx::Size(82, 86), buffer); | 243 UploadTexture(uploader.get(), GL_LUMINANCE, gfx::Size(82, 86), buffer); |
| 244 } | 244 } |
| 245 | 245 |
| 246 } // namespace | 246 } // namespace |
| 247 } // namespace cc | 247 } // namespace cc |
| OLD | NEW |