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

Side by Side Diff: cc/texture_uploader_unittest.cc

Issue 11413005: YUV software decode path stride fixes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cc LGTM'ed. Created 8 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/texture_uploader.h" 5 #include "cc/texture_uploader.h"
6 6
7 #include "base/bits.h"
7 #include "cc/prioritized_resource.h" 8 #include "cc/prioritized_resource.h"
9 #include "cc/resource.h"
8 #include "cc/test/fake_web_graphics_context_3d.h" 10 #include "cc/test/fake_web_graphics_context_3d.h"
9 #include "testing/gmock/include/gmock/gmock.h" 11 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
11 #include "third_party/khronos/GLES2/gl2.h" 13 #include "third_party/khronos/GLES2/gl2.h"
12 #include "third_party/khronos/GLES2/gl2ext.h" 14 #include "third_party/khronos/GLES2/gl2ext.h"
13 15
14 using namespace WebKit; 16 using namespace WebKit;
15 17
16 namespace cc { 18 namespace cc {
17 namespace { 19 namespace {
18 20
19 class FakeWebGraphicsContext3DWithQueryTesting : public FakeWebGraphicsContext3D { 21 class FakeWebGraphicsContext3DTextureUpload : public FakeWebGraphicsContext3D {
20 public: 22 public:
21 FakeWebGraphicsContext3DWithQueryTesting() : m_resultAvailable(0) 23 FakeWebGraphicsContext3DTextureUpload()
24 : m_resultAvailable(0)
25 , m_unpackAlignment(4)
22 { 26 {
23 } 27 }
24 28
29 virtual void pixelStorei(WGC3Denum pname, WGC3Dint param)
30 {
31 switch (pname) {
32 case GL_UNPACK_ALIGNMENT:
33 // param should be a power of two <= 8
34 EXPECT_EQ(0, param & (param - 1));
35 EXPECT_GE(8, param);
36 switch (param) {
37 case 1:
38 case 2:
39 case 4:
40 case 8:
41 m_unpackAlignment = param;
42 break;
43 default:
44 break;
45 }
46 break;
47 default:
48 break;
49 }
50 }
51
25 virtual void getQueryObjectuivEXT(WebGLId, WGC3Denum type, WGC3Duint* value) 52 virtual void getQueryObjectuivEXT(WebGLId, WGC3Denum type, WGC3Duint* value)
26 { 53 {
27 switch (type) { 54 switch (type) {
28 case GL_QUERY_RESULT_AVAILABLE_EXT: 55 case GL_QUERY_RESULT_AVAILABLE_EXT:
29 *value = m_resultAvailable; 56 *value = m_resultAvailable;
30 break; 57 break;
31 default: 58 default:
32 *value = 0; 59 *value = 0;
33 break; 60 break;
34 } 61 }
35 } 62 }
36 63
64 virtual void texSubImage2D(WGC3Denum target, WGC3Dint level, WGC3Dint xoffse t, WGC3Dint yoffset, WGC3Dsizei width, WGC3Dsizei height, WGC3Denum format, WGC3 Denum type, const void* pixels)
65 {
66 EXPECT_EQ(GL_TEXTURE_2D, target);
67 EXPECT_EQ(0, level);
68 EXPECT_LE(0, width);
69 EXPECT_LE(0, height);
70 EXPECT_LE(0, xoffset);
71 EXPECT_LE(0, yoffset);
72 EXPECT_LE(0, width);
73 EXPECT_LE(0, height);
74
75 // Check for allowed format/type combination.
76 unsigned int bytesPerPixel = 0;
77 switch (format) {
78 case GL_ALPHA:
79 EXPECT_EQ(GL_UNSIGNED_BYTE, type);
80 bytesPerPixel = 1;
81 break;
82 case GL_RGB:
83 EXPECT_NE(GL_UNSIGNED_SHORT_4_4_4_4, type);
84 EXPECT_NE(GL_UNSIGNED_SHORT_5_5_5_1, type);
85 switch (type) {
86 case GL_UNSIGNED_BYTE:
87 bytesPerPixel = 3;
88 break;
89 case GL_UNSIGNED_SHORT_5_6_5:
90 bytesPerPixel = 2;
91 break;
92 }
93 break;
94 case GL_RGBA:
95 EXPECT_NE(GL_UNSIGNED_SHORT_5_6_5, type);
96 switch (type) {
97 case GL_UNSIGNED_BYTE:
98 bytesPerPixel = 4;
99 break;
100 case GL_UNSIGNED_SHORT_4_4_4_4:
101 bytesPerPixel = 2;
102 break;
103 case GL_UNSIGNED_SHORT_5_5_5_1:
104 bytesPerPixel = 2;
105 break;
106 }
107 break;
108 case GL_LUMINANCE:
109 EXPECT_EQ(GL_UNSIGNED_BYTE, type);
110 bytesPerPixel = 1;
111 break;
112 case GL_LUMINANCE_ALPHA:
113 EXPECT_EQ(GL_UNSIGNED_BYTE, type);
114 bytesPerPixel = 2;
115 break;
116 }
117
118 // If NULL, we aren't checking texture contents.
119 if (pixels == NULL)
120 return;
121
122 const uint8* bytes = static_cast<const uint8*>(pixels);
123 // We'll expect the first byte of every row to be 0x1, and the last byte to be 0x2
124 const unsigned int stride = base::bits::RoundUp(bytesPerPixel * width, m_unpackAlignment);
125 for (WGC3Dsizei row = 0; row < height; ++row) {
126 const uint8* rowBytes = bytes + (xoffset * bytesPerPixel + (yoffset + row) * stride);
127 EXPECT_EQ(0x1, rowBytes[0]);
128 EXPECT_EQ(0x2, rowBytes[width * bytesPerPixel - 1]);
129 }
130 }
131
37 void setResultAvailable(unsigned resultAvailable) { m_resultAvailable = resu ltAvailable; } 132 void setResultAvailable(unsigned resultAvailable) { m_resultAvailable = resu ltAvailable; }
38 133
39 private: 134 private:
135 unsigned m_unpackAlignment;
40 unsigned m_resultAvailable; 136 unsigned m_resultAvailable;
41 }; 137 };
42 138
43 void uploadTexture(TextureUploader* uploader) 139 void uploadTexture(TextureUploader* uploader, WGC3Denum format, const gfx::Size& size, const uint8* data)
44 { 140 {
45 gfx::Size size(256, 256); 141 uploader->upload(data,
46 uploader->upload(NULL,
47 gfx::Rect(gfx::Point(0, 0), size), 142 gfx::Rect(gfx::Point(0, 0), size),
48 gfx::Rect(gfx::Point(0, 0), size), 143 gfx::Rect(gfx::Point(0, 0), size),
49 gfx::Vector2d(), 144 gfx::Vector2d(),
50 GL_RGBA, 145 format,
51 size); 146 size);
52 } 147 }
53 148
54 TEST(TextureUploaderTest, NumBlockingUploads) 149 TEST(TextureUploaderTest, NumBlockingUploads)
55 { 150 {
56 scoped_ptr<FakeWebGraphicsContext3DWithQueryTesting> fakeContext(new FakeWeb GraphicsContext3DWithQueryTesting); 151 scoped_ptr<FakeWebGraphicsContext3DTextureUpload> fakeContext(new FakeWebGra phicsContext3DTextureUpload);
57 scoped_ptr<TextureUploader> uploader = TextureUploader::create(fakeContext.g et(), false, false); 152 scoped_ptr<TextureUploader> uploader = TextureUploader::create(fakeContext.g et(), false, false);
58 153
59 fakeContext->setResultAvailable(0); 154 fakeContext->setResultAvailable(0);
60 EXPECT_EQ(0, uploader->numBlockingUploads()); 155 EXPECT_EQ(0, uploader->numBlockingUploads());
61 uploadTexture(uploader.get()); 156 uploadTexture(uploader.get(), GL_RGBA, gfx::Size(0, 0), NULL);
62 EXPECT_EQ(1, uploader->numBlockingUploads()); 157 EXPECT_EQ(1, uploader->numBlockingUploads());
63 uploadTexture(uploader.get()); 158 uploadTexture(uploader.get(), GL_RGBA, gfx::Size(0, 0), NULL);
64 EXPECT_EQ(2, uploader->numBlockingUploads()); 159 EXPECT_EQ(2, uploader->numBlockingUploads());
65 160
66 fakeContext->setResultAvailable(1); 161 fakeContext->setResultAvailable(1);
67 EXPECT_EQ(0, uploader->numBlockingUploads()); 162 EXPECT_EQ(0, uploader->numBlockingUploads());
68 uploadTexture(uploader.get()); 163 uploadTexture(uploader.get(), GL_RGBA, gfx::Size(0, 0), NULL);
69 EXPECT_EQ(0, uploader->numBlockingUploads()); 164 EXPECT_EQ(0, uploader->numBlockingUploads());
70 uploadTexture(uploader.get()); 165 uploadTexture(uploader.get(), GL_RGBA, gfx::Size(0, 0), NULL);
71 uploadTexture(uploader.get()); 166 uploadTexture(uploader.get(), GL_RGBA, gfx::Size(0, 0), NULL);
72 EXPECT_EQ(0, uploader->numBlockingUploads()); 167 EXPECT_EQ(0, uploader->numBlockingUploads());
73 } 168 }
74 169
75 TEST(TextureUploaderTest, MarkPendingUploadsAsNonBlocking) 170 TEST(TextureUploaderTest, MarkPendingUploadsAsNonBlocking)
76 { 171 {
77 scoped_ptr<FakeWebGraphicsContext3DWithQueryTesting> fakeContext(new FakeWeb GraphicsContext3DWithQueryTesting); 172 scoped_ptr<FakeWebGraphicsContext3DTextureUpload> fakeContext(new FakeWebGra phicsContext3DTextureUpload);
78 scoped_ptr<TextureUploader> uploader = TextureUploader::create(fakeContext.g et(), false, false); 173 scoped_ptr<TextureUploader> uploader = TextureUploader::create(fakeContext.g et(), false, false);
79 174
80 fakeContext->setResultAvailable(0); 175 fakeContext->setResultAvailable(0);
81 EXPECT_EQ(0, uploader->numBlockingUploads()); 176 EXPECT_EQ(0, uploader->numBlockingUploads());
82 uploadTexture(uploader.get()); 177 uploadTexture(uploader.get(), GL_RGBA, gfx::Size(0, 0), NULL);
83 uploadTexture(uploader.get()); 178 uploadTexture(uploader.get(), GL_RGBA, gfx::Size(0, 0), NULL);
84 EXPECT_EQ(2, uploader->numBlockingUploads()); 179 EXPECT_EQ(2, uploader->numBlockingUploads());
85 180
86 uploader->markPendingUploadsAsNonBlocking(); 181 uploader->markPendingUploadsAsNonBlocking();
87 EXPECT_EQ(0, uploader->numBlockingUploads()); 182 EXPECT_EQ(0, uploader->numBlockingUploads());
88 uploadTexture(uploader.get()); 183 uploadTexture(uploader.get(), GL_RGBA, gfx::Size(0, 0), NULL);
89 EXPECT_EQ(1, uploader->numBlockingUploads()); 184 EXPECT_EQ(1, uploader->numBlockingUploads());
90 185
91 fakeContext->setResultAvailable(1); 186 fakeContext->setResultAvailable(1);
92 EXPECT_EQ(0, uploader->numBlockingUploads()); 187 EXPECT_EQ(0, uploader->numBlockingUploads());
93 uploadTexture(uploader.get()); 188 uploadTexture(uploader.get(), GL_RGBA, gfx::Size(0, 0), NULL);
94 uploader->markPendingUploadsAsNonBlocking(); 189 uploader->markPendingUploadsAsNonBlocking();
95 EXPECT_EQ(0, uploader->numBlockingUploads()); 190 EXPECT_EQ(0, uploader->numBlockingUploads());
96 } 191 }
97 192
193 TEST(TextureUploaderTest, UploadContentsTest)
194 {
195 scoped_ptr<FakeWebGraphicsContext3DTextureUpload> fakeContext(new FakeWebGra phicsContext3DTextureUpload);
196 scoped_ptr<TextureUploader> uploader = TextureUploader::create(fakeContext.g et(), false, false);
197 uint8 buffer[256 * 256 * 4];
198
199 // Upload a tightly packed 256x256 RGBA texture.
200 memset(buffer, 0, sizeof(buffer));
201 for (int i = 0; i < 256; ++i) {
202 // Mark the beginning and end of each row, for the test.
203 buffer[i * 4 * 256] = 0x1;
204 buffer[(i + 1) * 4 * 256 - 1] = 0x2;
205 }
206 uploadTexture(uploader.get(), GL_RGBA, gfx::Size(256, 256), buffer);
207
208 // Upload a tightly packed 41x43 RGBA texture.
209 memset(buffer, 0, sizeof(buffer));
210 for (int i = 0; i < 43; ++i) {
211 // Mark the beginning and end of each row, for the test.
212 buffer[i * 4 * 41] = 0x1;
213 buffer[(i + 1) * 4 * 41 - 1] = 0x2;
214 }
215 uploadTexture(uploader.get(), GL_RGBA, gfx::Size(41, 43), buffer);
216
217 // Upload a tightly packed 82x86 LUMINANCE texture.
218 memset(buffer, 0, sizeof(buffer));
219 for (int i = 0; i < 86; ++i) {
220 // Mark the beginning and end of each row, for the test.
221 buffer[i * 1 * 82] = 0x1;
222 buffer[(i + 1) * 82 - 1] = 0x2;
223 }
224 uploadTexture(uploader.get(), GL_LUMINANCE, gfx::Size(82, 86), buffer);
225 }
226
98 } // namespace 227 } // namespace
99 } // namespace cc 228 } // namespace cc
OLDNEW
« base/bits.h ('K') | « cc/texture_uploader.cc ('k') | cc/video_layer_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698