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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp

Issue 2365653005: Fix failing transferToImageBitmap layout tests and commit pixel test on Mac (Closed)
Patch Set: rebase Created 4 years, 2 months 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010, Google Inc. All rights reserved. 2 * Copyright (c) 2010, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 GLuint m_oldTextureUnitZeroId; 83 GLuint m_oldTextureUnitZeroId;
84 }; 84 };
85 85
86 static bool shouldFailDrawingBufferCreationForTesting = false; 86 static bool shouldFailDrawingBufferCreationForTesting = false;
87 87
88 } // namespace 88 } // namespace
89 89
90 PassRefPtr<DrawingBuffer> DrawingBuffer::create(std::unique_ptr<WebGraphicsConte xt3DProvider> contextProvider, 90 PassRefPtr<DrawingBuffer> DrawingBuffer::create(std::unique_ptr<WebGraphicsConte xt3DProvider> contextProvider,
91 const IntSize& size, bool premultipliedAlpha, bool wantAlphaChannel, 91 const IntSize& size, bool premultipliedAlpha, bool wantAlphaChannel,
92 bool wantDepthBuffer, bool wantStencilBuffer, bool wantAntialiasing, 92 bool wantDepthBuffer, bool wantStencilBuffer, bool wantAntialiasing,
93 PreserveDrawingBuffer preserve, WebGLVersion webGLVersion) 93 PreserveDrawingBuffer preserve, WebGLVersion webGLVersion,
94 ChromiumImageUsage chromiumImageUsage)
94 { 95 {
95 ASSERT(contextProvider); 96 ASSERT(contextProvider);
96 97
97 if (shouldFailDrawingBufferCreationForTesting) { 98 if (shouldFailDrawingBufferCreationForTesting) {
98 shouldFailDrawingBufferCreationForTesting = false; 99 shouldFailDrawingBufferCreationForTesting = false;
99 return nullptr; 100 return nullptr;
100 } 101 }
101 102
102 std::unique_ptr<Extensions3DUtil> extensionsUtil = Extensions3DUtil::create( contextProvider->contextGL()); 103 std::unique_ptr<Extensions3DUtil> extensionsUtil = Extensions3DUtil::create( contextProvider->contextGL());
103 if (!extensionsUtil->isValid()) { 104 if (!extensionsUtil->isValid()) {
(...skipping 12 matching lines...) Expand all
116 extensionsUtil->ensureExtensionEnabled("GL_CHROMIUM_framebuffer_mult isample"); 117 extensionsUtil->ensureExtensionEnabled("GL_CHROMIUM_framebuffer_mult isample");
117 else 118 else
118 extensionsUtil->ensureExtensionEnabled("GL_EXT_multisampled_render_t o_texture"); 119 extensionsUtil->ensureExtensionEnabled("GL_EXT_multisampled_render_t o_texture");
119 } 120 }
120 bool discardFramebufferSupported = extensionsUtil->supportsExtension("GL_EXT _discard_framebuffer"); 121 bool discardFramebufferSupported = extensionsUtil->supportsExtension("GL_EXT _discard_framebuffer");
121 if (discardFramebufferSupported) 122 if (discardFramebufferSupported)
122 extensionsUtil->ensureExtensionEnabled("GL_EXT_discard_framebuffer"); 123 extensionsUtil->ensureExtensionEnabled("GL_EXT_discard_framebuffer");
123 124
124 RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(std::move(c ontextProvider), std::move(extensionsUtil), 125 RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(std::move(c ontextProvider), std::move(extensionsUtil),
125 discardFramebufferSupported, wantAlphaChannel, premultipliedAlpha, 126 discardFramebufferSupported, wantAlphaChannel, premultipliedAlpha,
126 preserve, webGLVersion, wantDepthBuffer, wantStencilBuffer)); 127 preserve, webGLVersion, wantDepthBuffer, wantStencilBuffer, chromiumImag eUsage));
127 if (!drawingBuffer->initialize(size, multisampleSupported)) { 128 if (!drawingBuffer->initialize(size, multisampleSupported)) {
128 drawingBuffer->beginDestruction(); 129 drawingBuffer->beginDestruction();
129 return PassRefPtr<DrawingBuffer>(); 130 return PassRefPtr<DrawingBuffer>();
130 } 131 }
131 return drawingBuffer.release(); 132 return drawingBuffer.release();
132 } 133 }
133 134
134 void DrawingBuffer::forceNextDrawingBufferCreationToFail() 135 void DrawingBuffer::forceNextDrawingBufferCreationToFail()
135 { 136 {
136 shouldFailDrawingBufferCreationForTesting = true; 137 shouldFailDrawingBufferCreationForTesting = true;
137 } 138 }
138 139
139 DrawingBuffer::DrawingBuffer( 140 DrawingBuffer::DrawingBuffer(
140 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider, 141 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider,
141 std::unique_ptr<Extensions3DUtil> extensionsUtil, 142 std::unique_ptr<Extensions3DUtil> extensionsUtil,
142 bool discardFramebufferSupported, 143 bool discardFramebufferSupported,
143 bool wantAlphaChannel, 144 bool wantAlphaChannel,
144 bool premultipliedAlpha, 145 bool premultipliedAlpha,
145 PreserveDrawingBuffer preserve, 146 PreserveDrawingBuffer preserve,
146 WebGLVersion webGLVersion, 147 WebGLVersion webGLVersion,
147 bool wantDepth, 148 bool wantDepth,
148 bool wantStencil) 149 bool wantStencil,
150 ChromiumImageUsage chromiumImageUsage)
149 : m_preserveDrawingBuffer(preserve) 151 : m_preserveDrawingBuffer(preserve)
150 , m_webGLVersion(webGLVersion) 152 , m_webGLVersion(webGLVersion)
151 , m_contextProvider(std::move(contextProvider)) 153 , m_contextProvider(std::move(contextProvider))
152 , m_gl(m_contextProvider->contextGL()) 154 , m_gl(m_contextProvider->contextGL())
153 , m_extensionsUtil(std::move(extensionsUtil)) 155 , m_extensionsUtil(std::move(extensionsUtil))
154 , m_discardFramebufferSupported(discardFramebufferSupported) 156 , m_discardFramebufferSupported(discardFramebufferSupported)
155 , m_wantAlphaChannel(wantAlphaChannel) 157 , m_wantAlphaChannel(wantAlphaChannel)
156 , m_premultipliedAlpha(premultipliedAlpha) 158 , m_premultipliedAlpha(premultipliedAlpha)
157 , m_softwareRendering(m_contextProvider->isSoftwareRendering()) 159 , m_softwareRendering(m_contextProvider->isSoftwareRendering())
158 , m_wantDepth(wantDepth) 160 , m_wantDepth(wantDepth)
159 , m_wantStencil(wantStencil) 161 , m_wantStencil(wantStencil)
162 , m_chromiumImageUsage(chromiumImageUsage)
160 { 163 {
161 memset(m_colorMask, 0, 4 * sizeof(GLboolean)); 164 memset(m_colorMask, 0, 4 * sizeof(GLboolean));
162 memset(m_clearColor, 0, 4 * sizeof(GLfloat)); 165 memset(m_clearColor, 0, 4 * sizeof(GLfloat));
163 // Used by browser tests to detect the use of a DrawingBuffer. 166 // Used by browser tests to detect the use of a DrawingBuffer.
164 TRACE_EVENT_INSTANT0("test_gpu", "DrawingBufferCreation", TRACE_EVENT_SCOPE_ GLOBAL); 167 TRACE_EVENT_INSTANT0("test_gpu", "DrawingBufferCreation", TRACE_EVENT_SCOPE_ GLOBAL);
165 } 168 }
166 169
167 DrawingBuffer::~DrawingBuffer() 170 DrawingBuffer::~DrawingBuffer()
168 { 171 {
169 ASSERT(m_destructionInProgress); 172 ASSERT(m_destructionInProgress);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 return !m_drawFramebufferBinding && defaultBufferRequiresAlphaChannelToBePre served(); 228 return !m_drawFramebufferBinding && defaultBufferRequiresAlphaChannelToBePre served();
226 } 229 }
227 230
228 bool DrawingBuffer::defaultBufferRequiresAlphaChannelToBePreserved() 231 bool DrawingBuffer::defaultBufferRequiresAlphaChannelToBePreserved()
229 { 232 {
230 if (wantExplicitResolve()) { 233 if (wantExplicitResolve()) {
231 return !m_wantAlphaChannel && getMultisampledRenderbufferFormat() == GL_ RGBA8_OES; 234 return !m_wantAlphaChannel && getMultisampledRenderbufferFormat() == GL_ RGBA8_OES;
232 } 235 }
233 236
234 bool rgbEmulation = contextProvider()->getCapabilities().emulate_rgb_buffer_ with_rgba 237 bool rgbEmulation = contextProvider()->getCapabilities().emulate_rgb_buffer_ with_rgba
235 || (RuntimeEnabledFeatures::webGLImageChromiumEnabled() && contextProvid er()->getCapabilities().chromium_image_rgb_emulation); 238 || (shouldUseChromiumImage() && contextProvider()->getCapabilities().chr omium_image_rgb_emulation);
236 return !m_wantAlphaChannel && rgbEmulation; 239 return !m_wantAlphaChannel && rgbEmulation;
237 } 240 }
238 241
239 void DrawingBuffer::freeRecycledMailboxes() 242 void DrawingBuffer::freeRecycledMailboxes()
240 { 243 {
241 while (!m_recycledMailboxQueue.isEmpty()) { 244 while (!m_recycledMailboxQueue.isEmpty()) {
242 RefPtr<RecycledMailbox> recycled = m_recycledMailboxQueue.takeLast(); 245 RefPtr<RecycledMailbox> recycled = m_recycledMailboxQueue.takeLast();
243 deleteMailbox(recycled->mailbox, recycled->syncToken); 246 deleteMailbox(recycled->mailbox, recycled->syncToken);
244 } 247 }
245 } 248 }
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 } 532 }
530 533
531 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::takeRecycledMailbox() 534 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::takeRecycledMailbox()
532 { 535 {
533 if (m_recycledMailboxQueue.isEmpty()) 536 if (m_recycledMailboxQueue.isEmpty())
534 return nullptr; 537 return nullptr;
535 538
536 // Creation of image backed mailboxes is very expensive, so be less 539 // Creation of image backed mailboxes is very expensive, so be less
537 // aggressive about pruning them. 540 // aggressive about pruning them.
538 size_t cacheLimit = 1; 541 size_t cacheLimit = 1;
539 if (RuntimeEnabledFeatures::webGLImageChromiumEnabled()) 542 if (shouldUseChromiumImage())
540 cacheLimit = 4; 543 cacheLimit = 4;
541 544
542 RefPtr<RecycledMailbox> recycled; 545 RefPtr<RecycledMailbox> recycled;
543 while (m_recycledMailboxQueue.size() > cacheLimit) { 546 while (m_recycledMailboxQueue.size() > cacheLimit) {
544 recycled = m_recycledMailboxQueue.takeLast(); 547 recycled = m_recycledMailboxQueue.takeLast();
545 deleteMailbox(recycled->mailbox, recycled->syncToken); 548 deleteMailbox(recycled->mailbox, recycled->syncToken);
546 } 549 }
547 recycled = m_recycledMailboxQueue.takeLast(); 550 recycled = m_recycledMailboxQueue.takeLast();
548 551
549 if (recycled->syncToken.HasData()) 552 if (recycled->syncToken.HasData())
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 m_gl->Clear(GL_COLOR_BUFFER_BIT); 1134 m_gl->Clear(GL_COLOR_BUFFER_BIT);
1132 m_gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, info.parame ters.target, 0, 0); 1135 m_gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, info.parame ters.target, 0, 0);
1133 m_gl->DeleteFramebuffers(1, &fbo); 1136 m_gl->DeleteFramebuffers(1, &fbo);
1134 restoreFramebufferBindings(); 1137 restoreFramebufferBindings();
1135 m_gl->ClearColor(m_clearColor[0], m_clearColor[1], m_clearColor[2], m_clearC olor[3]); 1138 m_gl->ClearColor(m_clearColor[0], m_clearColor[1], m_clearColor[2], m_clearC olor[3]);
1136 m_gl->ColorMask(m_colorMask[0], m_colorMask[1], m_colorMask[2], m_colorMask[ 3]); 1139 m_gl->ColorMask(m_colorMask[0], m_colorMask[1], m_colorMask[2], m_colorMask[ 3]);
1137 } 1140 }
1138 1141
1139 DrawingBuffer::TextureInfo DrawingBuffer::createTextureAndAllocateMemory(const I ntSize& size) 1142 DrawingBuffer::TextureInfo DrawingBuffer::createTextureAndAllocateMemory(const I ntSize& size)
1140 { 1143 {
1141 if (!RuntimeEnabledFeatures::webGLImageChromiumEnabled()) 1144 if (!shouldUseChromiumImage())
1142 return createDefaultTextureAndAllocateMemory(size); 1145 return createDefaultTextureAndAllocateMemory(size);
1143 1146
1144 TextureParameters parameters = chromiumImageTextureParameters(); 1147 TextureParameters parameters = chromiumImageTextureParameters();
1145 GLuint imageId = m_gl->CreateGpuMemoryBufferImageCHROMIUM(size.width(), size .height(), parameters.creationInternalColorFormat, GC3D_SCANOUT_CHROMIUM); 1148 GLuint imageId = m_gl->CreateGpuMemoryBufferImageCHROMIUM(size.width(), size .height(), parameters.creationInternalColorFormat, GC3D_SCANOUT_CHROMIUM);
1146 GLuint textureId = createColorTexture(parameters); 1149 GLuint textureId = createColorTexture(parameters);
1147 if (imageId) { 1150 if (imageId) {
1148 m_gl->BindTexImage2DCHROMIUM(parameters.target, imageId); 1151 m_gl->BindTexImage2DCHROMIUM(parameters.target, imageId);
1149 } 1152 }
1150 1153
1151 TextureInfo info; 1154 TextureInfo info;
(...skipping 12 matching lines...) Expand all
1164 info.textureId = createColorTexture(parameters); 1167 info.textureId = createColorTexture(parameters);
1165 allocateConditionallyImmutableTexture(parameters.target, parameters.creation InternalColorFormat, 1168 allocateConditionallyImmutableTexture(parameters.target, parameters.creation InternalColorFormat,
1166 size.width(), size.height(), 0, parameters.colorFormat, GL_UNSIGNED_BYTE ); 1169 size.width(), size.height(), 0, parameters.colorFormat, GL_UNSIGNED_BYTE );
1167 info.immutable = m_storageTextureSupported; 1170 info.immutable = m_storageTextureSupported;
1168 return info; 1171 return info;
1169 } 1172 }
1170 1173
1171 void DrawingBuffer::resizeTextureMemory(TextureInfo* info, const IntSize& size) 1174 void DrawingBuffer::resizeTextureMemory(TextureInfo* info, const IntSize& size)
1172 { 1175 {
1173 ASSERT(info->textureId); 1176 ASSERT(info->textureId);
1174 if (!RuntimeEnabledFeatures::webGLImageChromiumEnabled()) { 1177 if (!shouldUseChromiumImage()) {
1175 if (info->immutable) { 1178 if (info->immutable) {
1176 DCHECK(m_storageTextureSupported); 1179 DCHECK(m_storageTextureSupported);
1177 m_gl->DeleteTextures(1, &info->textureId); 1180 m_gl->DeleteTextures(1, &info->textureId);
1178 info->textureId = createColorTexture(info->parameters); 1181 info->textureId = createColorTexture(info->parameters);
1179 } 1182 }
1180 m_gl->BindTexture(info->parameters.target, info->textureId); 1183 m_gl->BindTexture(info->parameters.target, info->textureId);
1181 allocateConditionallyImmutableTexture(info->parameters.target, info->par ameters.creationInternalColorFormat, 1184 allocateConditionallyImmutableTexture(info->parameters.target, info->par ameters.creationInternalColorFormat,
1182 size.width(), size.height(), 0, info->parameters.colorFormat, GL_UNS IGNED_BYTE); 1185 size.width(), size.height(), 0, info->parameters.colorFormat, GL_UNS IGNED_BYTE);
1183 info->immutable = m_storageTextureSupported; 1186 info->immutable = m_storageTextureSupported;
1184 return; 1187 return;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1224 bool DrawingBuffer::wantDepthOrStencil() 1227 bool DrawingBuffer::wantDepthOrStencil()
1225 { 1228 {
1226 return m_wantDepth || m_wantStencil; 1229 return m_wantDepth || m_wantStencil;
1227 } 1230 }
1228 1231
1229 GLenum DrawingBuffer::getMultisampledRenderbufferFormat() 1232 GLenum DrawingBuffer::getMultisampledRenderbufferFormat()
1230 { 1233 {
1231 DCHECK(wantExplicitResolve()); 1234 DCHECK(wantExplicitResolve());
1232 if (m_wantAlphaChannel) 1235 if (m_wantAlphaChannel)
1233 return GL_RGBA8_OES; 1236 return GL_RGBA8_OES;
1234 if (RuntimeEnabledFeatures::webGLImageChromiumEnabled() && contextProvider() ->getCapabilities().chromium_image_rgb_emulation) 1237 if (shouldUseChromiumImage() && contextProvider()->getCapabilities().chromiu m_image_rgb_emulation)
1235 return GL_RGBA8_OES; 1238 return GL_RGBA8_OES;
1236 if (contextProvider()->getCapabilities().disable_webgl_rgb_multisampling_usa ge) 1239 if (contextProvider()->getCapabilities().disable_webgl_rgb_multisampling_usa ge)
1237 return GL_RGBA8_OES; 1240 return GL_RGBA8_OES;
1238 return GL_RGB8_OES; 1241 return GL_RGB8_OES;
1239 } 1242 }
1240 1243
1241 void DrawingBuffer::restoreTextureBindings() 1244 void DrawingBuffer::restoreTextureBindings()
1242 { 1245 {
1243 // This class potentially modifies the bindings for GL_TEXTURE_2D and 1246 // This class potentially modifies the bindings for GL_TEXTURE_2D and
1244 // GL_TEXTURE_RECTANGLE. Only GL_TEXTURE_2D needs to be restored since 1247 // GL_TEXTURE_RECTANGLE. Only GL_TEXTURE_2D needs to be restored since
1245 // the public interface for WebGL does not support GL_TEXTURE_RECTANGLE. 1248 // the public interface for WebGL does not support GL_TEXTURE_RECTANGLE.
1246 m_gl->BindTexture(GL_TEXTURE_2D, m_texture2DBinding); 1249 m_gl->BindTexture(GL_TEXTURE_2D, m_texture2DBinding);
1247 } 1250 }
1248 1251
1252 bool DrawingBuffer::shouldUseChromiumImage()
1253 {
1254 return RuntimeEnabledFeatures::webGLImageChromiumEnabled() && m_chromiumImag eUsage == AllowChromiumImage;
1255 }
1256
1249 } // namespace blink 1257 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698