OLD | NEW |
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 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 , m_drawFramebufferBinding(0) | 144 , m_drawFramebufferBinding(0) |
145 , m_readFramebufferBinding(0) | 145 , m_readFramebufferBinding(0) |
146 , m_activeTextureUnit(GL_TEXTURE0) | 146 , m_activeTextureUnit(GL_TEXTURE0) |
147 , m_context(context) | 147 , m_context(context) |
148 , m_extensionsUtil(extensionsUtil) | 148 , m_extensionsUtil(extensionsUtil) |
149 , m_size(-1, -1) | 149 , m_size(-1, -1) |
150 , m_requestedAttributes(requestedAttributes) | 150 , m_requestedAttributes(requestedAttributes) |
151 , m_multisampleExtensionSupported(multisampleExtensionSupported) | 151 , m_multisampleExtensionSupported(multisampleExtensionSupported) |
152 , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupporte
d) | 152 , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupporte
d) |
153 , m_discardFramebufferSupported(discardFramebufferSupported) | 153 , m_discardFramebufferSupported(discardFramebufferSupported) |
154 , m_storageTextureSupported(false) | |
155 , m_fbo(0) | 154 , m_fbo(0) |
156 , m_depthStencilBuffer(0) | 155 , m_depthStencilBuffer(0) |
157 , m_depthBuffer(0) | 156 , m_depthBuffer(0) |
158 , m_stencilBuffer(0) | 157 , m_stencilBuffer(0) |
159 , m_multisampleFBO(0) | 158 , m_multisampleFBO(0) |
160 , m_multisampleColorBuffer(0) | 159 , m_multisampleColorBuffer(0) |
161 , m_contentsChanged(true) | 160 , m_contentsChanged(true) |
162 , m_contentsChangeCommitted(false) | 161 , m_contentsChangeCommitted(false) |
163 , m_bufferClearNeeded(false) | 162 , m_bufferClearNeeded(false) |
164 , m_antiAliasingMode(None) | 163 , m_antiAliasingMode(None) |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 m_context->framebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COL
OR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBuffer.textureId, 0, m_sampleCount); | 298 m_context->framebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COL
OR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBuffer.textureId, 0, m_sampleCount); |
300 else | 299 else |
301 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0
, GL_TEXTURE_2D, m_colorBuffer.textureId, 0); | 300 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0
, GL_TEXTURE_2D, m_colorBuffer.textureId, 0); |
302 | 301 |
303 if (m_discardFramebufferSupported) { | 302 if (m_discardFramebufferSupported) { |
304 // Explicitly discard framebuffer to save GPU memory bandwidth for t
ile-based GPU arch. | 303 // Explicitly discard framebuffer to save GPU memory bandwidth for t
ile-based GPU arch. |
305 const WGC3Denum attachments[3] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_AT
TACHMENT, GL_STENCIL_ATTACHMENT}; | 304 const WGC3Denum attachments[3] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_AT
TACHMENT, GL_STENCIL_ATTACHMENT}; |
306 m_context->discardFramebufferEXT(GL_FRAMEBUFFER, 3, attachments); | 305 m_context->discardFramebufferEXT(GL_FRAMEBUFFER, 3, attachments); |
307 } | 306 } |
308 } else { | 307 } else { |
309 m_context->copySubTextureCHROMIUM(GL_TEXTURE_2D, m_colorBuffer.textureId
, frontColorBufferMailbox->textureInfo.textureId, | 308 m_context->copyTextureCHROMIUM(GL_TEXTURE_2D, m_colorBuffer.textureId, f
rontColorBufferMailbox->textureInfo.textureId, GL_RGBA, GL_UNSIGNED_BYTE, GL_FAL
SE, GL_FALSE, GL_FALSE); |
310 0, 0, 0, 0, m_size.width(), m_size.height(), GL_FALSE, GL_FALSE, GL_
FALSE); | |
311 } | 309 } |
312 | 310 |
313 restoreFramebufferBindings(); | 311 restoreFramebufferBindings(); |
314 m_contentsChanged = false; | 312 m_contentsChanged = false; |
315 | 313 |
316 m_context->produceTextureDirectCHROMIUM(frontColorBufferMailbox->textureInfo
.textureId, GL_TEXTURE_2D, frontColorBufferMailbox->mailbox.name); | 314 m_context->produceTextureDirectCHROMIUM(frontColorBufferMailbox->textureInfo
.textureId, GL_TEXTURE_2D, frontColorBufferMailbox->mailbox.name); |
317 m_context->flush(); | 315 m_context->flush(); |
318 frontColorBufferMailbox->mailbox.validSyncToken = m_context->insertSyncPoint
(frontColorBufferMailbox->mailbox.syncToken); | 316 frontColorBufferMailbox->mailbox.validSyncToken = m_context->insertSyncPoint
(frontColorBufferMailbox->mailbox.syncToken); |
319 frontColorBufferMailbox->mailbox.allowOverlay = frontColorBufferMailbox->tex
tureInfo.imageId != 0; | 317 frontColorBufferMailbox->mailbox.allowOverlay = frontColorBufferMailbox->tex
tureInfo.imageId != 0; |
320 setBufferClearNeeded(true); | 318 setBufferClearNeeded(true); |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 if (m_requestedAttributes.antialias && m_multisampleExtensionSupported) { | 442 if (m_requestedAttributes.antialias && m_multisampleExtensionSupported) { |
445 m_context->getIntegerv(GL_MAX_SAMPLES_ANGLE, &maxSampleCount); | 443 m_context->getIntegerv(GL_MAX_SAMPLES_ANGLE, &maxSampleCount); |
446 m_antiAliasingMode = MSAAExplicitResolve; | 444 m_antiAliasingMode = MSAAExplicitResolve; |
447 if (m_extensionsUtil->supportsExtension("GL_EXT_multisampled_render_to_t
exture")) { | 445 if (m_extensionsUtil->supportsExtension("GL_EXT_multisampled_render_to_t
exture")) { |
448 m_antiAliasingMode = MSAAImplicitResolve; | 446 m_antiAliasingMode = MSAAImplicitResolve; |
449 } else if (m_extensionsUtil->supportsExtension("GL_CHROMIUM_screen_space
_antialiasing")) { | 447 } else if (m_extensionsUtil->supportsExtension("GL_CHROMIUM_screen_space
_antialiasing")) { |
450 m_antiAliasingMode = ScreenSpaceAntialiasing; | 448 m_antiAliasingMode = ScreenSpaceAntialiasing; |
451 } | 449 } |
452 } | 450 } |
453 m_sampleCount = std::min(4, maxSampleCount); | 451 m_sampleCount = std::min(4, maxSampleCount); |
454 m_storageTextureSupported = m_extensionsUtil->supportsExtension("GL_EXT_text
ure_storage"); | |
455 | 452 |
456 m_fbo = m_context->createFramebuffer(); | 453 m_fbo = m_context->createFramebuffer(); |
457 | 454 |
458 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo); | 455 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo); |
459 m_colorBuffer.textureId = createColorTexture(); | 456 m_colorBuffer.textureId = createColorTexture(); |
460 if (m_antiAliasingMode == MSAAImplicitResolve) | 457 if (m_antiAliasingMode == MSAAImplicitResolve) |
461 m_context->framebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_A
TTACHMENT0, GL_TEXTURE_2D, m_colorBuffer.textureId, 0, m_sampleCount); | 458 m_context->framebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_A
TTACHMENT0, GL_TEXTURE_2D, m_colorBuffer.textureId, 0, m_sampleCount); |
462 else | 459 else |
463 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL
_TEXTURE_2D, m_colorBuffer.textureId, 0); | 460 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL
_TEXTURE_2D, m_colorBuffer.textureId, 0); |
464 createSecondaryBuffers(); | 461 createSecondaryBuffers(); |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
955 unsigned count = height / 2; | 952 unsigned count = height / 2; |
956 for (unsigned i = 0; i < count; i++) { | 953 for (unsigned i = 0; i < count; i++) { |
957 uint8* rowA = framebuffer + i * rowBytes; | 954 uint8* rowA = framebuffer + i * rowBytes; |
958 uint8* rowB = framebuffer + (height - i - 1) * rowBytes; | 955 uint8* rowB = framebuffer + (height - i - 1) * rowBytes; |
959 memcpy(scanline, rowB, rowBytes); | 956 memcpy(scanline, rowB, rowBytes); |
960 memcpy(rowB, rowA, rowBytes); | 957 memcpy(rowB, rowA, rowBytes); |
961 memcpy(rowA, scanline, rowBytes); | 958 memcpy(rowA, scanline, rowBytes); |
962 } | 959 } |
963 } | 960 } |
964 | 961 |
| 962 void DrawingBuffer::texImage2DResourceSafe(GLenum target, GLint level, GLenum in
ternalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum
type, GLint unpackAlignment) |
| 963 { |
| 964 ASSERT(unpackAlignment == 1 || unpackAlignment == 2 || unpackAlignment == 4
|| unpackAlignment == 8); |
| 965 m_context->texImage2D(target, level, internalformat, width, height, border,
format, type, 0); |
| 966 } |
| 967 |
965 void DrawingBuffer::allocateTextureMemory(TextureInfo* info, const IntSize& size
) | 968 void DrawingBuffer::allocateTextureMemory(TextureInfo* info, const IntSize& size
) |
966 { | 969 { |
967 if (RuntimeEnabledFeatures::webGLImageChromiumEnabled()) { | 970 if (RuntimeEnabledFeatures::webGLImageChromiumEnabled()) { |
968 deleteChromiumImageForTexture(info); | 971 deleteChromiumImageForTexture(info); |
969 | 972 |
970 info->imageId = m_context->createGpuMemoryBufferImageCHROMIUM(size.width
(), size.height(), GL_RGBA, GC3D_SCANOUT_CHROMIUM); | 973 info->imageId = m_context->createGpuMemoryBufferImageCHROMIUM(size.width
(), size.height(), GL_RGBA, GC3D_SCANOUT_CHROMIUM); |
971 if (info->imageId) { | 974 if (info->imageId) { |
972 m_context->bindTexImage2DCHROMIUM(GL_TEXTURE_2D, info->imageId); | 975 m_context->bindTexImage2DCHROMIUM(GL_TEXTURE_2D, info->imageId); |
973 return; | 976 return; |
974 } | 977 } |
975 } | 978 } |
976 | 979 |
977 if (m_storageTextureSupported) { | 980 texImage2DResourceSafe(GL_TEXTURE_2D, 0, m_internalColorFormat, size.width()
, size.height(), 0, m_colorFormat, GL_UNSIGNED_BYTE); |
978 if (info->immutable) { | |
979 m_context->deleteTexture(info->textureId); | |
980 info->textureId = createColorTexture(); | |
981 } | |
982 | |
983 // TODO(dshwang): GL_BGRA8_EXT can be better in some platforms. crbug.co
m/557848 | |
984 m_context->texStorage2DEXT(GL_TEXTURE_2D, 1, m_internalRenderbufferForma
t, size.width(), size.height()); | |
985 info->immutable = true; | |
986 return; | |
987 } | |
988 m_context->texImage2D(GL_TEXTURE_2D, 0, m_internalColorFormat, size.width(),
size.height(), 0, m_colorFormat, GL_UNSIGNED_BYTE, 0); | |
989 } | 981 } |
990 | 982 |
991 void DrawingBuffer::deleteChromiumImageForTexture(TextureInfo* info) | 983 void DrawingBuffer::deleteChromiumImageForTexture(TextureInfo* info) |
992 { | 984 { |
993 if (info->imageId) { | 985 if (info->imageId) { |
994 m_context->releaseTexImage2DCHROMIUM(GL_TEXTURE_2D, info->imageId); | 986 m_context->releaseTexImage2DCHROMIUM(GL_TEXTURE_2D, info->imageId); |
995 m_context->destroyImageCHROMIUM(info->imageId); | 987 m_context->destroyImageCHROMIUM(info->imageId); |
996 info->imageId = 0; | 988 info->imageId = 0; |
997 } | 989 } |
998 } | 990 } |
999 | 991 |
1000 } // namespace blink | 992 } // namespace blink |
OLD | NEW |