Chromium Code Reviews| 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 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 525 | 525 |
| 526 DrawingBuffer::ColorBufferParameters | 526 DrawingBuffer::ColorBufferParameters |
| 527 DrawingBuffer::GpuMemoryBufferColorBufferParameters() { | 527 DrawingBuffer::GpuMemoryBufferColorBufferParameters() { |
| 528 #if OS(MACOSX) | 528 #if OS(MACOSX) |
| 529 // A CHROMIUM_image backed texture requires a specialized set of parameters | 529 // A CHROMIUM_image backed texture requires a specialized set of parameters |
| 530 // on OSX. | 530 // on OSX. |
| 531 ColorBufferParameters parameters; | 531 ColorBufferParameters parameters; |
| 532 parameters.target = GC3D_TEXTURE_RECTANGLE_ARB; | 532 parameters.target = GC3D_TEXTURE_RECTANGLE_ARB; |
| 533 | 533 |
| 534 if (want_alpha_channel_) { | 534 if (want_alpha_channel_) { |
| 535 parameters.creation_internal_color_format = GL_RGBA; | 535 parameters.allocate_alpha_channel = true; |
| 536 parameters.internal_color_format = GL_RGBA; | |
| 537 } else if (ContextProvider() | 536 } else if (ContextProvider() |
| 538 ->GetCapabilities() | 537 ->GetCapabilities() |
| 539 .chromium_image_rgb_emulation) { | 538 .chromium_image_rgb_emulation) { |
| 540 parameters.creation_internal_color_format = GL_RGB; | 539 parameters.allocate_alpha_channel = true; |
| 541 parameters.internal_color_format = GL_RGBA; | |
| 542 } else { | 540 } else { |
| 543 GLenum format = | 541 parameters.allocate_alpha_channel = |
| 544 DefaultBufferRequiresAlphaChannelToBePreserved() ? GL_RGBA : GL_RGB; | 542 DefaultBufferRequiresAlphaChannelToBePreserved(); |
| 545 parameters.creation_internal_color_format = format; | |
| 546 parameters.internal_color_format = format; | |
| 547 } | 543 } |
| 548 | |
| 549 // Unused when CHROMIUM_image is being used. | |
| 550 parameters.color_format = 0; | |
| 551 return parameters; | 544 return parameters; |
| 552 #else | 545 #else |
| 553 return TextureColorBufferParameters(); | 546 return TextureColorBufferParameters(); |
| 554 #endif | 547 #endif |
| 555 } | 548 } |
| 556 | 549 |
| 557 DrawingBuffer::ColorBufferParameters | 550 DrawingBuffer::ColorBufferParameters |
| 558 DrawingBuffer::TextureColorBufferParameters() { | 551 DrawingBuffer::TextureColorBufferParameters() { |
| 559 ColorBufferParameters parameters; | 552 ColorBufferParameters parameters; |
| 560 parameters.target = GL_TEXTURE_2D; | 553 parameters.target = GL_TEXTURE_2D; |
| 561 if (want_alpha_channel_) { | 554 if (want_alpha_channel_) { |
| 562 parameters.internal_color_format = GL_RGBA; | 555 parameters.allocate_alpha_channel = true(); |
| 563 parameters.creation_internal_color_format = GL_RGBA; | |
| 564 parameters.color_format = GL_RGBA; | |
| 565 } else if (ContextProvider() | 556 } else if (ContextProvider() |
| 566 ->GetCapabilities() | 557 ->GetCapabilities() |
| 567 .emulate_rgb_buffer_with_rgba) { | 558 .emulate_rgb_buffer_with_rgba) { |
| 568 parameters.internal_color_format = GL_RGBA; | 559 parameters.allocate_alpha_channel = true(); |
| 569 parameters.creation_internal_color_format = GL_RGBA; | |
| 570 parameters.color_format = GL_RGBA; | |
| 571 } else { | 560 } else { |
| 572 GLenum format = | 561 parameters.allocate_alpha_channel = |
| 573 DefaultBufferRequiresAlphaChannelToBePreserved() ? GL_RGBA : GL_RGB; | 562 DefaultBufferRequiresAlphaChannelToBePreserved(); |
| 574 parameters.creation_internal_color_format = format; | |
| 575 parameters.internal_color_format = format; | |
| 576 parameters.color_format = format; | |
| 577 } | 563 } |
| 578 return parameters; | 564 return parameters; |
| 579 } | 565 } |
| 580 | 566 |
| 581 PassRefPtr<DrawingBuffer::ColorBuffer> | 567 PassRefPtr<DrawingBuffer::ColorBuffer> |
| 582 DrawingBuffer::CreateOrRecycleColorBuffer() { | 568 DrawingBuffer::CreateOrRecycleColorBuffer() { |
| 583 DCHECK(state_restorer_); | 569 DCHECK(state_restorer_); |
| 584 if (!recycled_color_buffer_queue_.IsEmpty()) { | 570 if (!recycled_color_buffer_queue_.IsEmpty()) { |
| 585 RefPtr<ColorBuffer> recycled = recycled_color_buffer_queue_.TakeLast(); | 571 RefPtr<ColorBuffer> recycled = recycled_color_buffer_queue_.TakeLast(); |
| 586 if (recycled->receive_sync_token.HasData()) | 572 if (recycled->receive_sync_token.HasData()) |
| (...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1149 | 1135 |
| 1150 // Select the Parameters for the texture object. Allocate the backing | 1136 // Select the Parameters for the texture object. Allocate the backing |
| 1151 // GpuMemoryBuffer and GLImage, if one is going to be used. | 1137 // GpuMemoryBuffer and GLImage, if one is going to be used. |
| 1152 ColorBufferParameters parameters; | 1138 ColorBufferParameters parameters; |
| 1153 GLuint image_id = 0; | 1139 GLuint image_id = 0; |
| 1154 std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; | 1140 std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; |
| 1155 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = | 1141 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = |
| 1156 Platform::Current()->GetGpuMemoryBufferManager(); | 1142 Platform::Current()->GetGpuMemoryBufferManager(); |
| 1157 if (ShouldUseChromiumImage() && gpu_memory_buffer_manager) { | 1143 if (ShouldUseChromiumImage() && gpu_memory_buffer_manager) { |
| 1158 parameters = GpuMemoryBufferColorBufferParameters(); | 1144 parameters = GpuMemoryBufferColorBufferParameters(); |
| 1159 gfx::BufferFormat buffer_format = gpu::DefaultBufferFormatForImageFormat( | 1145 gfx::BufferFormat buffer_format; |
| 1160 parameters.creation_internal_color_format); | 1146 GLenum gl_format = GL_NONE; |
| 1147 if (parameters.allocate_alpha_channel) { | |
| 1148 buffer_format = gfx::BufferFormat::gfx::BufferFormat::RGBA_8888; | |
| 1149 gl_format = GL_RGBA; | |
| 1150 } else { | |
| 1151 buffer_format = gfx::BufferFormat::gfx::BufferFormat::BGRX_8888; | |
| 1152 gl_format = GL_RGB; | |
| 1153 } | |
| 1161 gpu_memory_buffer = gpu_memory_buffer_manager->CreateGpuMemoryBuffer( | 1154 gpu_memory_buffer = gpu_memory_buffer_manager->CreateGpuMemoryBuffer( |
| 1162 gfx::Size(size), buffer_format, gfx::BufferUsage::SCANOUT, | 1155 gfx::Size(size), buffer_format, gfx::BufferUsage::SCANOUT, |
| 1163 gpu::kNullSurfaceHandle); | 1156 gpu::kNullSurfaceHandle); |
| 1164 if (gpu_memory_buffer) { | 1157 if (gpu_memory_buffer) { |
| 1165 if (RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) | 1158 if (RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) |
| 1166 gpu_memory_buffer->SetColorSpaceForScanout(color_space_); | 1159 gpu_memory_buffer->SetColorSpaceForScanout(color_space_); |
| 1167 image_id = gl_->CreateImageCHROMIUM( | 1160 image_id = |
| 1168 gpu_memory_buffer->AsClientBuffer(), size.Width(), size.Height(), | 1161 gl_->CreateImageCHROMIUM(gpu_memory_buffer->AsClientBuffer(), |
| 1169 parameters.creation_internal_color_format); | 1162 size.Width(), size.Height(), gl_format); |
| 1170 if (!image_id) | 1163 if (!image_id) |
| 1171 gpu_memory_buffer.reset(); | 1164 gpu_memory_buffer.reset(); |
| 1172 } | 1165 } |
| 1173 } else { | 1166 } |
|
ccameron
2017/04/19 06:09:03
This line here is the only logic change -- if we f
| |
| 1167 if (!image_id) | |
| 1174 parameters = TextureColorBufferParameters(); | 1168 parameters = TextureColorBufferParameters(); |
| 1175 } | |
| 1176 | 1169 |
| 1177 // Allocate the texture for this object. | 1170 // Allocate the texture for this object. |
| 1178 GLuint texture_id = 0; | 1171 GLuint texture_id = 0; |
| 1179 { | 1172 { |
| 1180 gl_->GenTextures(1, &texture_id); | 1173 gl_->GenTextures(1, &texture_id); |
| 1181 gl_->BindTexture(parameters.target, texture_id); | 1174 gl_->BindTexture(parameters.target, texture_id); |
| 1182 gl_->TexParameteri(parameters.target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | 1175 gl_->TexParameteri(parameters.target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
| 1183 gl_->TexParameteri(parameters.target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 1176 gl_->TexParameteri(parameters.target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
| 1184 gl_->TexParameteri(parameters.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 1177 gl_->TexParameteri(parameters.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 1185 gl_->TexParameteri(parameters.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 1178 gl_->TexParameteri(parameters.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 1186 } | 1179 } |
| 1187 | 1180 |
| 1188 // If this is GpuMemoryBuffer-backed, then bind the texture to the | 1181 // If this is GpuMemoryBuffer-backed, then bind the texture to the |
| 1189 // GpuMemoryBuffer's GLImage. Otherwise, allocate ordinary texture storage. | 1182 // GpuMemoryBuffer's GLImage. Otherwise, allocate ordinary texture storage. |
| 1190 if (image_id) { | 1183 if (image_id) { |
| 1191 gl_->BindTexImage2DCHROMIUM(parameters.target, image_id); | 1184 gl_->BindTexImage2DCHROMIUM(parameters.target, image_id); |
| 1192 } else { | 1185 } else { |
| 1193 if (storage_texture_supported_) { | 1186 if (storage_texture_supported_) { |
| 1194 GLenum internal_storage_format = GL_NONE; | 1187 GLenum internal_storage_format = GL_NONE; |
| 1195 if (parameters.creation_internal_color_format == GL_RGB) { | 1188 if (parameters.allocate_alpha_channel) |
| 1189 internal_storage_format = GL_RGBA8; | |
| 1190 else | |
| 1196 internal_storage_format = GL_RGB8; | 1191 internal_storage_format = GL_RGB8; |
| 1197 } else if (parameters.creation_internal_color_format == GL_RGBA) { | |
| 1198 internal_storage_format = GL_RGBA8; | |
| 1199 } else { | |
| 1200 NOTREACHED(); | |
| 1201 } | |
| 1202 gl_->TexStorage2DEXT(GL_TEXTURE_2D, 1, internal_storage_format, | 1192 gl_->TexStorage2DEXT(GL_TEXTURE_2D, 1, internal_storage_format, |
| 1203 size.Width(), size.Height()); | 1193 size.Width(), size.Height()); |
| 1204 } else { | 1194 } else { |
| 1205 gl_->TexImage2D(parameters.target, 0, | 1195 GLenum gl_format = GL_NONE; |
| 1206 parameters.creation_internal_color_format, size.Width(), | 1196 if (parameters.allocate_alpha_channel) |
| 1207 size.Height(), 0, parameters.color_format, | 1197 gl_format = GL_RGBA; |
| 1208 GL_UNSIGNED_BYTE, 0); | 1198 else |
| 1199 gl_format = GL_RGB; | |
| 1200 gl_->TexImage2D(parameters.target, 0, gl_format, size.Width(), | |
| 1201 size.Height(), 0, gl_format, GL_UNSIGNED_BYTE, 0); | |
| 1209 } | 1202 } |
| 1210 } | 1203 } |
| 1211 | 1204 |
| 1212 // Clear the alpha channel if this is RGB emulated. | 1205 // Clear the alpha channel if this is RGB emulated. |
| 1213 if (image_id && !want_alpha_channel_ && | 1206 if (image_id && !want_alpha_channel_ && |
| 1214 ContextProvider()->GetCapabilities().chromium_image_rgb_emulation) { | 1207 ContextProvider()->GetCapabilities().chromium_image_rgb_emulation) { |
| 1215 GLuint fbo = 0; | 1208 GLuint fbo = 0; |
| 1216 | 1209 |
| 1217 state_restorer_->SetClearStateDirty(); | 1210 state_restorer_->SetClearStateDirty(); |
| 1218 gl_->GenFramebuffers(1, &fbo); | 1211 gl_->GenFramebuffers(1, &fbo); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1303 if (pixel_unpack_buffer_binding_dirty_) | 1296 if (pixel_unpack_buffer_binding_dirty_) |
| 1304 client->DrawingBufferClientRestorePixelUnpackBufferBinding(); | 1297 client->DrawingBufferClientRestorePixelUnpackBufferBinding(); |
| 1305 } | 1298 } |
| 1306 | 1299 |
| 1307 bool DrawingBuffer::ShouldUseChromiumImage() { | 1300 bool DrawingBuffer::ShouldUseChromiumImage() { |
| 1308 return RuntimeEnabledFeatures::webGLImageChromiumEnabled() && | 1301 return RuntimeEnabledFeatures::webGLImageChromiumEnabled() && |
| 1309 chromium_image_usage_ == kAllowChromiumImage; | 1302 chromium_image_usage_ == kAllowChromiumImage; |
| 1310 } | 1303 } |
| 1311 | 1304 |
| 1312 } // namespace blink | 1305 } // namespace blink |
| OLD | NEW |