Changeset 222961 in webkit
- Timestamp:
- Oct 5, 2017 11:37:16 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/TestExpectations
r222921 r222961 1514 1514 1515 1515 webkit.org/b/177799 accessibility/table-detection.html [ Pass Failure ] 1516 1517 webkit.org/b/177997 webgl/1.0.2/conformance/textures/copy-tex-image-2d-formats.html [ Pass Failure ] -
trunk/Source/WebCore/ChangeLog
r222960 r222961 1 2017-10-05 Dean Jackson <dino@apple.com> 2 3 Lots of missing frames in YouTube360 when fullscreen on MacBook 4 https://bugs.webkit.org/show_bug.cgi?id=177903 5 <rdar://problem/33273300> 6 7 Reviewed by Sam Weinig. 8 9 Our compositing path for WebGL on macOS was too slow, requiring a copy 10 of the framebuffer into another GL context. Replace this by having 11 WebGL render into a texture that is backed by an IOSurface, and then 12 set the WebGLLayer to use the IOSurface as contents. 13 14 Covered by the existing WebGL tests. 15 16 * platform/graphics/GraphicsContext3D.h: 17 (WebCore::GraphicsContext3D::platformTexture const): We no longer use the 18 framebuffer object outside the class, so change this to return the GL texture 19 that the framebuffer is rendering in to. It was kind-of strange that it was 20 named this way originally. 21 Also make endPaint available on macOS, and add the definitions for 22 createIOSurfaceBackingStore and updateFramebufferTextureBackingStoreFromLayer. 23 24 * platform/graphics/cocoa/GraphicsContext3DCocoa.mm: 25 (WebCore::GraphicsContext3D::GraphicsContext3D): Now that we're using an IOSurface, 26 we're binding to a new attachment point, GL_TEXTURE_RECTANGLE. 27 (WebCore::GraphicsContext3D::endPaint): This is now being called on macOS and iOS, 28 so add a comment that explains the extra work that iOS needs to do. At some future 29 point it would be nice to make this slightly cleaner, so that iOS and macOS are 30 more similar. 31 (WebCore::GraphicsContext3D::allocateIOSurfaceBackingStore): New function that calls 32 into the corresponding WebGLLayer function. 33 (WebCore::GraphicsContext3D::updateFramebufferTextureBackingStoreFromLayer): Ditto. 34 35 * platform/graphics/opengl/GraphicsContext3DOpenGL.cpp: 36 (WebCore::wipeAlphaChannelFromPixels): Both readPixels and drawing a WebGL context 37 into another buffer need to fill out the alpha channel if this context was 38 created without one, otherwise the IOSurface backing store will happily provide 39 what might be non-zero values. 40 (WebCore::GraphicsContext3D::readPixelsAndConvertToBGRAIfNecessary): Call the helper above. 41 (WebCore::GraphicsContext3D::reshapeFBOs): Add more code to call into the macOS-specific 42 function to use an IOSurface as the framebuffer texture. 43 (WebCore::GraphicsContext3D::readPixels): Call the helper above. 44 45 * platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm: 46 (PlatformCALayerCocoa::copyContentsFromLayer): Replace the use of the 47 deprecated setContentsChanged with reloadValueForKeyPath. 48 49 * platform/graphics/cocoa/WebGLLayer.h: The macOS implementation now 50 inherits from CALayer directly rather than CAOpenGLLayer. It also adds 51 a few member variables to handle the IOSurfaces used for triple buffering. 52 53 * platform/graphics/cocoa/WebGLLayer.mm: 54 (-[WebGLLayer initWithGraphicsContext3D:]): If we were created without an 55 alpha channel, tell CA that we're an opaque layer. Also set the layer's transform 56 to identity, so that it calls into the code below to flip the contents. 57 (-[WebGLLayer setTransform:]): Because an IOSurface is used for the layer contents, 58 we don't get a chance to flip the drawing the way we do via the drawInContext delegate. 59 Instead we have to apply a scale(1, -1) transform on top of the layer transform to 60 make sure the layer is rendered right-way up. 61 (-[WebGLLayer setAnchorPoint:]): Ditto, except we have to assume the anchor point is 62 at the bottom of the layer, so flip the Y value. 63 (-[WebGLLayer display]): Swap between the drawing buffer and the contents buffer, and 64 then get a new buffer ready for display. 65 (createAppropriateIOSurface): Helper. 66 (-[WebGLLayer allocateIOSurfaceBackingStoreWithSize:usingAlpha:]): Initializes the 67 IOSurfaces used for drawing buffers. 68 (-[WebGLLayer bindFramebufferToNextAvailableSurface]): Take the next available IOSurface and 69 make it the drawing buffer (binding in to WebGL at the same time). 70 (-[WebGLLayer copyCGLPixelFormatForDisplayMask:]): Deleted. 71 (-[WebGLLayer copyCGLContextForPixelFormat:]): Deleted. 72 (-[WebGLLayer drawInCGLContext:pixelFormat:forLayerTime:displayTime:]): Deleted. 73 74 * platform/graphics/mac/WebLayer.mm: Remove the definition of reloadValueForKeyPath. 75 1 76 2017-10-05 Frederic Wang <fwang@igalia.com> 2 77 -
trunk/Source/WebCore/PAL/ChangeLog
r222957 r222961 1 2017-10-05 Dean Jackson <dino@apple.com> 2 3 Lots of missing frames in YouTube360 when fullscreen on MacBook 4 https://bugs.webkit.org/show_bug.cgi?id=177903 5 <rdar://problem/33273300> 6 7 Reviewed by Sam Weinig. 8 9 Add reloadValueForKeyPath to replace setContentsChanged on CALayer. 10 11 * pal/spi/cocoa/QuartzCoreSPI.h: 12 1 13 2017-10-05 Commit Queue <commit-queue@webkit.org> 2 14 -
trunk/Source/WebCore/PAL/pal/spi/cocoa/QuartzCoreSPI.h
r222957 r222961 92 92 - (CGSize)size; 93 93 - (void *)regionBeingDrawn; 94 - (void) setContentsChanged;94 - (void)reloadValueForKeyPath:(NSString *)keyPath; 95 95 @property BOOL allowsGroupBlending; 96 96 @property BOOL canDrawConcurrently; -
trunk/Source/WebCore/platform/graphics/GraphicsContext3D.h
r222957 r222961 748 748 #if PLATFORM(COCOA) 749 749 PlatformGraphicsContext3D platformGraphicsContext3D() const { return m_contextObj; } 750 Platform3DObject platformTexture() const { return m_ fbo; }750 Platform3DObject platformTexture() const { return m_texture; } 751 751 CALayer* platformLayer() const { return reinterpret_cast<CALayer*>(m_webGLLayer.get()); } 752 752 #else … … 1148 1148 bool paintCompositedResultsToCanvas(ImageBuffer*); 1149 1149 1150 #if PLATFORM( IOS)1150 #if PLATFORM(COCOA) 1151 1151 void endPaint(); 1152 1152 #endif 1153 1153 1154 #if PLATFORM(MAC) 1155 void allocateIOSurfaceBackingStore(IntSize); 1156 void updateFramebufferTextureBackingStoreFromLayer(); 1154 1157 void updateCGLContext(); 1155 1158 #endif 1159 1156 1160 void setContextVisibility(bool); 1157 1161 -
trunk/Source/WebCore/platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm
r222957 r222961 412 412 [m_layer setContents:[caLayer contents]]; 413 413 else 414 [m_layer setContentsChanged];414 [m_layer reloadValueForKeyPath:@"contents"]; 415 415 END_BLOCK_OBJC_EXCEPTIONS 416 416 } -
trunk/Source/WebCore/platform/graphics/cocoa/GraphicsContext3DCocoa.mm
r222957 r222961 480 480 #endif 481 481 482 // Create the texture that will be used for the framebuffer. 482 483 #if PLATFORM(IOS) 483 484 ::glGenRenderbuffers(1, &m_texture); 484 485 #else 485 // create a texture to render into486 486 ::glGenTextures(1, &m_texture); 487 ::glBindTexture(GL_TEXTURE_2D, m_texture); 488 ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 489 ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 490 ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 491 ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 492 ::glBindTexture(GL_TEXTURE_2D, 0); 493 #endif 494 495 // create an FBO 487 // We bind to GL_TEXTURE_RECTANGLE_EXT rather than TEXTURE_2D because 488 // that's what is required for a texture backed by IOSurface. 489 ::glBindTexture(GL_TEXTURE_RECTANGLE_EXT, m_texture); 490 ::glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 491 ::glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 492 ::glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 493 ::glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 494 ::glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 0); 495 #endif 496 497 // Create the framebuffer object. 496 498 ::glGenFramebuffersEXT(1, &m_fbo); 497 499 ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); … … 501 503 ::glGenRenderbuffersEXT(1, &m_depthStencilBuffer); 502 504 503 // create an multisample FBO505 // If necessary, create another framebuffer for the multisample results. 504 506 if (m_attrs.antialias) { 505 507 ::glGenFramebuffersEXT(1, &m_multisampleFBO); … … 655 657 } 656 658 657 #if PLATFORM(IOS)658 659 void GraphicsContext3D::endPaint() 659 660 { … … 661 662 if (m_attrs.antialias) 662 663 resolveMultisamplingIfNecessary(); 664 #if PLATFORM(IOS) 665 // This is the place where we actually push our current rendering 666 // results to the compositor on iOS. On macOS it comes from the 667 // calling function, which is inside WebGLLayer. 663 668 ::glFlush(); 664 669 ::glBindRenderbuffer(GL_RENDERBUFFER, m_texture); 665 670 [static_cast<EAGLContext*>(m_contextObj) presentRenderbuffer:GL_RENDERBUFFER]; 666 671 [EAGLContext setCurrentContext:nil]; 667 } 668 #endif 669 670 #if PLATFORM(MAC) 672 #endif 673 } 674 675 #if PLATFORM(MAC) 676 void GraphicsContext3D::allocateIOSurfaceBackingStore(IntSize size) 677 { 678 LOG(WebGL, "GraphicsContext3D::allocateIOSurfaceBackingStore at %d x %d. (%p)", size.width(), size.height(), this); 679 [m_webGLLayer allocateIOSurfaceBackingStoreWithSize:size usingAlpha:m_attrs.alpha]; 680 } 681 682 void GraphicsContext3D::updateFramebufferTextureBackingStoreFromLayer() 683 { 684 LOG(WebGL, "GraphicsContext3D::updateFramebufferTextureBackingStoreFromLayer(). (%p)", this); 685 [m_webGLLayer bindFramebufferToNextAvailableSurface]; 686 } 687 671 688 void GraphicsContext3D::updateCGLContext() 672 689 { -
trunk/Source/WebCore/platform/graphics/cocoa/WebGLLayer.h
r222957 r222961 26 26 #pragma once 27 27 28 #import "IOSurface.h" 29 #import "IntSize.h" 28 30 #import <QuartzCore/QuartzCore.h> 29 31 … … 33 35 } 34 36 35 #if PLATFORM(IOS) 37 #if PLATFORM(MAC) 38 @interface WebGLLayer : CALayer 39 #else 36 40 @interface WebGLLayer : CAEAGLLayer 37 #else38 @interface WebGLLayer : CAOpenGLLayer39 41 #endif 40 42 { 41 43 WebCore::GraphicsContext3D* _context; 42 44 float _devicePixelRatio; 45 #if PLATFORM(MAC) 46 std::unique_ptr<WebCore::IOSurface> _contentsBuffer; 47 std::unique_ptr<WebCore::IOSurface> _drawingBuffer; 48 std::unique_ptr<WebCore::IOSurface> _spareBuffer; 49 WebCore::IntSize _bufferSize; 50 BOOL _usingAlpha; 51 #endif 43 52 } 44 53 … … 49 58 - (CGImageRef)copyImageSnapshotWithColorSpace:(CGColorSpaceRef)colorSpace; 50 59 60 #if PLATFORM(MAC) 61 - (void)allocateIOSurfaceBackingStoreWithSize:(WebCore::IntSize)size usingAlpha:(BOOL)usingAlpha; 62 - (void)bindFramebufferToNextAvailableSurface; 63 #endif 64 51 65 @end 52 66 -
trunk/Source/WebCore/platform/graphics/cocoa/WebGLLayer.mm
r222957 r222961 34 34 #import "GraphicsLayerCA.h" 35 35 #import "PlatformCALayer.h" 36 #import <pal/spi/cocoa/QuartzCoreSPI.h> 36 37 #import <wtf/FastMalloc.h> 37 38 #import <wtf/RetainPtr.h> 38 39 39 #if !PLATFORM(IOS)40 #if PLATFORM(MAC) 40 41 #import <OpenGL/OpenGL.h> 41 42 #import <OpenGL/gl.h> … … 54 55 _devicePixelRatio = context->getContextAttributes().devicePixelRatio; 55 56 #if PLATFORM(MAC) 57 if (!context->getContextAttributes().alpha) 58 self.opaque = YES; 59 self.transform = CATransform3DIdentity; 56 60 self.contentsScale = _devicePixelRatio; 57 self.colorspace = sRGBColorSpaceRef();58 61 #endif 59 62 return self; 60 63 } 61 64 62 #if !PLATFORM(IOS) 63 -(CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask 65 #if PLATFORM(MAC) 66 // On Mac, we need to flip the layer to take into account 67 // that the IOSurface provides content in Y-up. This 68 // means that any incoming transform (unlikely, since this 69 // is a contents layer) and anchor point must add a 70 // Y scale of -1 and make sure the transform happens from 71 // the top. 72 73 - (void)setTransform:(CATransform3D)t 64 74 { 65 // We're basically copying the pixel format object from the existing 66 // WebGL context, so we don't need to use the display mask. 67 UNUSED_PARAM(mask); 68 69 CGLPixelFormatObj webglPixelFormat = CGLGetPixelFormat(_context->platformGraphicsContext3D()); 70 71 Vector<CGLPixelFormatAttribute> attribs; 72 GLint value; 73 74 CGLDescribePixelFormat(webglPixelFormat, 0, kCGLPFAColorSize, &value); 75 attribs.append(kCGLPFAColorSize); 76 attribs.append(static_cast<CGLPixelFormatAttribute>(value)); 77 78 // We don't need to specify a depth size since we're only 79 // using this context as a 2d blit destination for the WebGL FBO. 80 attribs.append(kCGLPFADepthSize); 81 attribs.append(static_cast<CGLPixelFormatAttribute>(0)); 82 83 CGLDescribePixelFormat(webglPixelFormat, 0, kCGLPFAAllowOfflineRenderers, &value); 84 if (value) 85 attribs.append(kCGLPFAAllowOfflineRenderers); 86 87 CGLDescribePixelFormat(webglPixelFormat, 0, kCGLPFAAccelerated, &value); 88 if (value) 89 attribs.append(kCGLPFAAccelerated); 90 91 CGLDescribePixelFormat(webglPixelFormat, 0, kCGLPFAOpenGLProfile, &value); 92 if (value) { 93 attribs.append(kCGLPFAOpenGLProfile); 94 attribs.append(static_cast<CGLPixelFormatAttribute>(value)); 95 } 96 97 attribs.append(static_cast<CGLPixelFormatAttribute>(0)); 98 99 CGLPixelFormatObj pixelFormat; 100 GLint numPixelFormats = 0; 101 CGLChoosePixelFormat(attribs.data(), &pixelFormat, &numPixelFormats); 102 103 ASSERT(pixelFormat); 104 ASSERT(numPixelFormats); 105 106 return pixelFormat; 75 [super setTransform:CATransform3DScale(t, 1, -1, 1)]; 107 76 } 108 77 109 - (CGLContextObj)copyCGLContextForPixelFormat:(CGLPixelFormatObj)pixelFormat78 - (void)setAnchorPoint:(CGPoint)p 110 79 { 111 CGLContextObj contextObj; 112 CGLCreateContext(pixelFormat, _context->platformGraphicsContext3D(), &contextObj); 113 return contextObj; 114 } 115 116 -(void)drawInCGLContext:(CGLContextObj)glContext pixelFormat:(CGLPixelFormatObj)pixelFormat forLayerTime:(CFTimeInterval)timeInterval displayTime:(const CVTimeStamp *)timeStamp 117 { 118 if (!_context) 119 return; 120 121 _context->prepareTexture(); 122 123 CGLSetCurrentContext(glContext); 124 125 CGRect frame = [self frame]; 126 frame.size.width *= _devicePixelRatio; 127 frame.size.height *= _devicePixelRatio; 128 129 // draw the FBO into the layer 130 glViewport(0, 0, frame.size.width, frame.size.height); 131 glMatrixMode(GL_PROJECTION); 132 glLoadIdentity(); 133 glOrtho(-1, 1, -1, 1, -1, 1); 134 glMatrixMode(GL_MODELVIEW); 135 glLoadIdentity(); 136 137 glEnable(GL_TEXTURE_2D); 138 glBindTexture(GL_TEXTURE_2D, _context->platformTexture()); 139 140 glBegin(GL_TRIANGLE_FAN); 141 glTexCoord2f(0, 0); 142 glVertex2f(-1, -1); 143 glTexCoord2f(1, 0); 144 glVertex2f(1, -1); 145 glTexCoord2f(1, 1); 146 glVertex2f(1, 1); 147 glTexCoord2f(0, 1); 148 glVertex2f(-1, 1); 149 glEnd(); 150 151 glBindTexture(GL_TEXTURE_2D, 0); 152 glDisable(GL_TEXTURE_2D); 153 154 // Call super to finalize the drawing. By default all it does is call glFlush(). 155 [super drawInCGLContext:glContext pixelFormat:pixelFormat forLayerTime:timeInterval displayTime:timeStamp]; 80 [super setAnchorPoint:CGPointMake(p.x, 1.0 - p.y)]; 156 81 } 157 82 … … 204 129 return; 205 130 206 #if PLATFORM(IOS)207 131 _context->endPaint(); 208 #else 209 [super display]; 132 133 #if PLATFORM(MAC) 134 _context->prepareTexture(); 135 if (_drawingBuffer) { 136 std::swap(_contentsBuffer, _drawingBuffer); 137 self.contents = _contentsBuffer->asLayerContents(); 138 [self reloadValueForKeyPath:@"contents"]; 139 [self bindFramebufferToNextAvailableSurface]; 140 } 210 141 #endif 142 211 143 _context->markLayerComposited(); 212 144 PlatformCALayer* layer = PlatformCALayer::platformCALayer(self); … … 215 147 } 216 148 149 #if PLATFORM(MAC) 150 - (void)allocateIOSurfaceBackingStoreWithSize:(IntSize)size usingAlpha:(BOOL)usingAlpha 151 { 152 _bufferSize = size; 153 _usingAlpha = usingAlpha; 154 _contentsBuffer = WebCore::IOSurface::create(size, sRGBColorSpaceRef()); 155 _drawingBuffer = WebCore::IOSurface::create(size, sRGBColorSpaceRef()); 156 ASSERT(_contentsBuffer); 157 ASSERT(_drawingBuffer); 158 } 159 160 - (void)bindFramebufferToNextAvailableSurface 161 { 162 GC3Denum texture = _context->platformTexture(); 163 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture); 164 165 if (_drawingBuffer && _drawingBuffer->isInUse()) { 166 if (!_spareBuffer) 167 _spareBuffer = WebCore::IOSurface::create(_bufferSize, sRGBColorSpaceRef()); 168 std::swap(_drawingBuffer, _spareBuffer); 169 } 170 171 IOSurfaceRef ioSurface = _drawingBuffer->surface(); 172 GC3Denum internalFormat = _usingAlpha ? GL_RGBA : GL_RGB; 173 174 // Link the IOSurface to the texture. 175 CGLError error = CGLTexImageIOSurface2D(_context->platformGraphicsContext3D(), GL_TEXTURE_RECTANGLE_ARB, internalFormat, _bufferSize.width(), _bufferSize.height(), GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, ioSurface, 0); 176 ASSERT_UNUSED(error, error == kCGLNoError); 177 } 178 #endif 179 217 180 @end 218 181 -
trunk/Source/WebCore/platform/graphics/mac/WebLayer.mm
r222957 r222961 31 31 #import "PlatformCALayer.h" 32 32 #import <QuartzCore/QuartzCore.h> 33 #import <pal/spi/cocoa/QuartzCoreSPI.h> 33 34 #import <wtf/SetForScope.h> 34 35 … … 38 39 #import "WebCoreThread.h" 39 40 #endif 40 41 @interface CALayer(WebCoreCALayerPrivate)42 - (void)reloadValueForKeyPath:(NSString *)keyPath;43 @end44 41 45 42 using namespace WebCore; -
trunk/Source/WebCore/platform/graphics/opengl/GraphicsContext3DOpenGL.cpp
r222957 r222961 30 30 31 31 #include "GraphicsContext3D.h" 32 32 33 #if PLATFORM(IOS) 33 34 #include "GraphicsContext3DIOS.h" 34 35 #endif 35 36 36 #include "Extensions3DOpenGL.h" 37 37 #include "IntRect.h" … … 39 39 #include "NotImplemented.h" 40 40 #include "TemporaryOpenGLSetting.h" 41 42 41 #include <algorithm> 43 42 #include <cstring> … … 71 70 } 72 71 72 #if PLATFORM(MAC) 73 static void wipeAlphaChannelFromPixels(int width, int height, unsigned char* pixels) 74 { 75 // We can assume this doesn't overflow because the calling functions 76 // use checked arithmetic. 77 int totalBytes = width * height * 4; 78 for (int i = 0; i < totalBytes; i += 4) 79 pixels[i + 3] = 255; 80 } 81 #endif 82 73 83 void GraphicsContext3D::readPixelsAndConvertToBGRAIfNecessary(int x, int y, int width, int height, unsigned char* pixels) 74 84 { … … 99 109 } else 100 110 ::glReadPixels(x, y, width, height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, pixels); 111 112 #if PLATFORM(MAC) 113 if (!m_attrs.alpha) 114 wipeAlphaChannelFromPixels(width, height, pixels); 115 #endif 101 116 } 102 117 … … 171 186 ::glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_texture); 172 187 setRenderbufferStorageFromDrawable(m_currentWidth, m_currentHeight); 188 #elif PLATFORM(MAC) 189 allocateIOSurfaceBackingStore(IntSize(width, height)); 190 updateFramebufferTextureBackingStoreFromLayer(); 191 ::glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, m_texture, 0); 173 192 #else 174 193 ::glBindTexture(GL_TEXTURE_2D, m_texture); … … 443 462 if (m_attrs.antialias && m_state.boundFBO == m_multisampleFBO) 444 463 ::glBindFramebufferEXT(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO); 464 465 #if PLATFORM(MAC) 466 if (!m_attrs.alpha && (format == GraphicsContext3D::RGBA || format == GraphicsContext3D::BGRA) && (m_state.boundFBO == m_fbo || (m_attrs.antialias && m_state.boundFBO == m_multisampleFBO))) 467 wipeAlphaChannelFromPixels(width, height, static_cast<unsigned char*>(data)); 468 #endif 445 469 } 446 470
Note: See TracChangeset
for help on using the changeset viewer.