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(static_cast<unsigned>(GL_TEXTURE_2D), target); | 73 EXPECT_EQ(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(static_cast<unsigned>(GL_UNSIGNED_BYTE), type); | 86 EXPECT_EQ(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(static_cast<unsigned>(GL_UNSIGNED_SHORT_4_4_4_4), type); | 90 EXPECT_NE(GL_UNSIGNED_SHORT_4_4_4_4, type); |
91 EXPECT_NE(static_cast<unsigned>(GL_UNSIGNED_SHORT_5_5_5_1), type); | 91 EXPECT_NE(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(static_cast<unsigned>(GL_UNSIGNED_SHORT_5_6_5), type); | 102 EXPECT_NE(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(static_cast<unsigned>(GL_UNSIGNED_BYTE), type); | 116 EXPECT_EQ(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(static_cast<unsigned>(GL_UNSIGNED_BYTE), type); | 120 EXPECT_EQ(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 unpack_alignment_; |
147 unsigned result_available_; | 148 unsigned result_available_; |
148 unsigned unpack_alignment_; | |
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(0u, uploader->NumBlockingUploads()); | 172 EXPECT_EQ(0, uploader->NumBlockingUploads()); |
173 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 173 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
174 EXPECT_EQ(1u, uploader->NumBlockingUploads()); | 174 EXPECT_EQ(1, uploader->NumBlockingUploads()); |
175 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 175 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
176 EXPECT_EQ(2u, uploader->NumBlockingUploads()); | 176 EXPECT_EQ(2, uploader->NumBlockingUploads()); |
177 | 177 |
178 fake_context->SetResultAvailable(1); | 178 fake_context->SetResultAvailable(1); |
179 EXPECT_EQ(0u, uploader->NumBlockingUploads()); | 179 EXPECT_EQ(0, uploader->NumBlockingUploads()); |
180 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 180 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
181 EXPECT_EQ(0u, uploader->NumBlockingUploads()); | 181 EXPECT_EQ(0, 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(0u, uploader->NumBlockingUploads()); | 184 EXPECT_EQ(0, 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(0u, uploader->NumBlockingUploads()); | 194 EXPECT_EQ(0, 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(2u, uploader->NumBlockingUploads()); | 197 EXPECT_EQ(2, uploader->NumBlockingUploads()); |
198 | 198 |
199 uploader->MarkPendingUploadsAsNonBlocking(); | 199 uploader->MarkPendingUploadsAsNonBlocking(); |
200 EXPECT_EQ(0u, uploader->NumBlockingUploads()); | 200 EXPECT_EQ(0, uploader->NumBlockingUploads()); |
201 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); | 201 UploadTexture(uploader.get(), GL_RGBA, gfx::Size(), NULL); |
202 EXPECT_EQ(1u, uploader->NumBlockingUploads()); | 202 EXPECT_EQ(1, uploader->NumBlockingUploads()); |
203 | 203 |
204 fake_context->SetResultAvailable(1); | 204 fake_context->SetResultAvailable(1); |
205 EXPECT_EQ(0u, uploader->NumBlockingUploads()); | 205 EXPECT_EQ(0, 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(0u, uploader->NumBlockingUploads()); | 208 EXPECT_EQ(0, 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 |