Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 6 | 6 |
| 7 #include <limits.h> | 7 #include <limits.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 #include <stdio.h> | 10 #include <stdio.h> |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 57 #include "gpu/command_buffer/service/program_manager.h" | 57 #include "gpu/command_buffer/service/program_manager.h" |
| 58 #include "gpu/command_buffer/service/query_manager.h" | 58 #include "gpu/command_buffer/service/query_manager.h" |
| 59 #include "gpu/command_buffer/service/renderbuffer_manager.h" | 59 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
| 60 #include "gpu/command_buffer/service/sampler_manager.h" | 60 #include "gpu/command_buffer/service/sampler_manager.h" |
| 61 #include "gpu/command_buffer/service/shader_manager.h" | 61 #include "gpu/command_buffer/service/shader_manager.h" |
| 62 #include "gpu/command_buffer/service/shader_translator.h" | 62 #include "gpu/command_buffer/service/shader_translator.h" |
| 63 #include "gpu/command_buffer/service/texture_manager.h" | 63 #include "gpu/command_buffer/service/texture_manager.h" |
| 64 #include "gpu/command_buffer/service/transform_feedback_manager.h" | 64 #include "gpu/command_buffer/service/transform_feedback_manager.h" |
| 65 #include "gpu/command_buffer/service/vertex_array_manager.h" | 65 #include "gpu/command_buffer/service/vertex_array_manager.h" |
| 66 #include "gpu/command_buffer/service/vertex_attrib_manager.h" | 66 #include "gpu/command_buffer/service/vertex_attrib_manager.h" |
| 67 #include "third_party/angle/src/image_util/loadimage.h" | |
| 67 #include "third_party/smhasher/src/City.h" | 68 #include "third_party/smhasher/src/City.h" |
| 68 #include "ui/gfx/buffer_types.h" | 69 #include "ui/gfx/buffer_types.h" |
| 69 #include "ui/gfx/geometry/point.h" | 70 #include "ui/gfx/geometry/point.h" |
| 70 #include "ui/gfx/geometry/rect.h" | 71 #include "ui/gfx/geometry/rect.h" |
| 71 #include "ui/gfx/geometry/rect_conversions.h" | 72 #include "ui/gfx/geometry/rect_conversions.h" |
| 72 #include "ui/gfx/geometry/size.h" | 73 #include "ui/gfx/geometry/size.h" |
| 73 #include "ui/gfx/gpu_memory_buffer.h" | 74 #include "ui/gfx/gpu_memory_buffer.h" |
| 74 #include "ui/gfx/overlay_transform.h" | 75 #include "ui/gfx/overlay_transform.h" |
| 75 #include "ui/gfx/transform.h" | 76 #include "ui/gfx/transform.h" |
| 76 #include "ui/gl/ca_renderer_layer_params.h" | 77 #include "ui/gl/ca_renderer_layer_params.h" |
| (...skipping 11367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11444 {8, 5}, | 11445 {8, 5}, |
| 11445 {8, 6}, | 11446 {8, 6}, |
| 11446 {8, 8}, | 11447 {8, 8}, |
| 11447 {10, 5}, | 11448 {10, 5}, |
| 11448 {10, 6}, | 11449 {10, 6}, |
| 11449 {10, 8}, | 11450 {10, 8}, |
| 11450 {10, 10}, | 11451 {10, 10}, |
| 11451 {12, 10}, | 11452 {12, 10}, |
| 11452 {12, 12}}; | 11453 {12, 12}}; |
| 11453 | 11454 |
| 11455 bool CheckETCFormatSupport(const FeatureInfo& featureInfo) { | |
| 11456 const gl::GLVersionInfo& versionInfo = featureInfo.gl_version_info(); | |
| 11457 return versionInfo.IsAtLeastGL(4, 3) || versionInfo.IsAtLeastGLES(3, 0) || | |
| 11458 featureInfo.feature_flags().arb_es3_compatability; | |
| 11459 } | |
| 11460 | |
| 11461 using CompressedFormatSupportCheck = bool (*)(const FeatureInfo&); | |
| 11462 using CompressedFormatDecompressionFunction = void (*)(size_t width, | |
| 11463 size_t height, | |
| 11464 size_t depth, | |
| 11465 const uint8_t* input, | |
| 11466 size_t inputRowPitch, | |
| 11467 size_t inputDepthPitch, | |
| 11468 uint8_t* output, | |
| 11469 size_t outputRowPitch, | |
| 11470 size_t outputDepthPitch); | |
| 11471 | |
| 11472 struct CompressedFormatInfo { | |
| 11473 GLenum format; | |
| 11474 uint32_t blockSize; | |
|
piman
2016/07/06 21:20:59
nit: use chromium style here and below (e.g. block
Geoff Lang
2016/07/08 18:49:16
Done.
| |
| 11475 uint32_t bytesPerBlock; | |
| 11476 CompressedFormatSupportCheck supportCheck; | |
| 11477 CompressedFormatDecompressionFunction decompressionFunction; | |
| 11478 GLenum decompressedInternalFormat; | |
| 11479 GLenum decompressedFormat; | |
| 11480 GLenum decompressedType; | |
| 11481 }; | |
| 11482 | |
| 11483 const CompressedFormatInfo kCompressedFormatInfoArray[]{ | |
|
Zhenyao Mo
2016/07/06 19:45:39
nit: a space between [] and {
Geoff Lang
2016/07/08 18:49:16
Done.
| |
| 11484 { | |
| 11485 GL_COMPRESSED_R11_EAC, 4, 8, CheckETCFormatSupport, | |
| 11486 angle::LoadEACR11ToR8, GL_R8, GL_RED, GL_UNSIGNED_BYTE, | |
| 11487 }, | |
| 11488 { | |
| 11489 GL_COMPRESSED_SIGNED_R11_EAC, 4, 8, CheckETCFormatSupport, | |
| 11490 angle::LoadEACR11SToR8, GL_R8_SNORM, GL_RED, GL_BYTE, | |
| 11491 }, | |
| 11492 { | |
| 11493 GL_COMPRESSED_RG11_EAC, 4, 16, CheckETCFormatSupport, | |
| 11494 angle::LoadEACRG11ToRG8, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, | |
| 11495 }, | |
| 11496 { | |
| 11497 GL_COMPRESSED_SIGNED_RG11_EAC, 4, 16, CheckETCFormatSupport, | |
| 11498 angle::LoadEACRG11SToRG8, GL_RG8_SNORM, GL_RG, GL_BYTE, | |
| 11499 }, | |
| 11500 { | |
| 11501 GL_COMPRESSED_RGB8_ETC2, 4, 8, CheckETCFormatSupport, | |
| 11502 angle::LoadETC2RGB8ToRGBA8, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, | |
| 11503 }, | |
| 11504 { | |
| 11505 GL_COMPRESSED_SRGB8_ETC2, 4, 8, CheckETCFormatSupport, | |
| 11506 angle::LoadETC2SRGB8ToRGBA8, GL_SRGB8_ALPHA8, GL_SRGB_ALPHA, | |
| 11507 GL_UNSIGNED_BYTE, | |
| 11508 }, | |
| 11509 { | |
| 11510 GL_COMPRESSED_RGBA8_ETC2_EAC, 4, 16, CheckETCFormatSupport, | |
| 11511 angle::LoadETC2RGBA8ToRGBA8, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, | |
| 11512 }, | |
| 11513 { | |
| 11514 GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 4, 8, | |
| 11515 CheckETCFormatSupport, angle::LoadETC2RGB8A1ToRGBA8, GL_RGBA8, GL_RGBA, | |
| 11516 GL_UNSIGNED_BYTE, | |
| 11517 }, | |
| 11518 { | |
| 11519 GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 4, 16, CheckETCFormatSupport, | |
| 11520 angle::LoadETC2SRGBA8ToSRGBA8, GL_SRGB8_ALPHA8, GL_SRGB_ALPHA, | |
| 11521 GL_UNSIGNED_BYTE, | |
| 11522 }, | |
| 11523 { | |
| 11524 GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 4, 8, | |
| 11525 CheckETCFormatSupport, angle::LoadETC2SRGB8A1ToRGBA8, GL_SRGB8_ALPHA8, | |
| 11526 GL_SRGB_ALPHA, GL_UNSIGNED_BYTE, | |
| 11527 }, | |
| 11528 }; | |
| 11529 | |
| 11530 const CompressedFormatInfo* GetCompressedFormatInfo(GLenum format) { | |
| 11531 for (size_t i = 0; i < arraysize(kCompressedFormatInfoArray); i++) { | |
| 11532 if (kCompressedFormatInfoArray[i].format == format) { | |
| 11533 return &kCompressedFormatInfoArray[i]; | |
| 11534 } | |
| 11535 } | |
| 11536 return nullptr; | |
| 11537 } | |
| 11538 | |
| 11539 uint32_t GetCompressedFormatRowPitch(const CompressedFormatInfo& info, | |
| 11540 uint32_t width) { | |
| 11541 uint32_t num_blocks_wide = (width + info.blockSize - 1) / info.blockSize; | |
| 11542 return num_blocks_wide * info.bytesPerBlock; | |
| 11543 } | |
| 11544 | |
| 11545 uint32_t GetCompressedFormatDepthPitch(const CompressedFormatInfo& info, | |
| 11546 uint32_t width, | |
| 11547 uint32_t height) { | |
| 11548 uint32_t num_blocks_high = ((height + info.blockSize - 1) / info.blockSize); | |
| 11549 return num_blocks_high * GetCompressedFormatRowPitch(info, width); | |
| 11550 } | |
| 11551 | |
| 11552 std::unique_ptr<uint8_t[]> DecompressTextureData( | |
| 11553 const CompressedFormatInfo& info, | |
| 11554 uint32_t width, | |
| 11555 uint32_t height, | |
| 11556 uint32_t depth, | |
| 11557 const void* data) { | |
| 11558 uint32_t output_pixel_size = GLES2Util::ComputeImageGroupSize( | |
| 11559 info.decompressedFormat, info.decompressedType); | |
| 11560 std::unique_ptr<uint8_t[]> decompressed_data( | |
| 11561 new uint8_t[output_pixel_size * width * height]); | |
| 11562 | |
| 11563 info.decompressionFunction(width, height, 1, | |
| 11564 reinterpret_cast<const uint8_t*>(data), | |
| 11565 GetCompressedFormatRowPitch(info, width), | |
| 11566 GetCompressedFormatDepthPitch(info, width, height), | |
| 11567 decompressed_data.get(), output_pixel_size * width, | |
| 11568 output_pixel_size * width * height); | |
| 11569 | |
| 11570 return decompressed_data; | |
| 11571 } | |
| 11572 | |
| 11573 void PushDecompressedTextureUnpackState() { | |
| 11574 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); | |
| 11575 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); | |
| 11576 glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); | |
| 11577 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); | |
| 11578 glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0); | |
| 11579 glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0); | |
|
Zhenyao Mo
2016/07/06 19:45:39
No need for all the SKIP params as they are always
Geoff Lang
2016/07/08 18:49:16
Ah, thanks for pointing that out. I kept the Push
| |
| 11580 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); | |
| 11581 } | |
| 11582 | |
| 11583 void PopDecompressedTextureUnpackState(const ContextState& state) { | |
| 11584 glPixelStorei(GL_UNPACK_ALIGNMENT, state.unpack_alignment); | |
| 11585 glPixelStorei(GL_UNPACK_ROW_LENGTH, state.unpack_row_length); | |
| 11586 glPixelStorei(GL_UNPACK_SKIP_ROWS, state.unpack_skip_rows); | |
| 11587 glPixelStorei(GL_UNPACK_SKIP_PIXELS, state.unpack_skip_images); | |
| 11588 glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, state.unpack_image_height); | |
| 11589 glPixelStorei(GL_UNPACK_SKIP_IMAGES, state.unpack_skip_images); | |
| 11590 if (state.bound_pixel_unpack_buffer) { | |
| 11591 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, | |
| 11592 state.bound_array_buffer->service_id()); | |
| 11593 } | |
| 11594 } | |
| 11595 | |
| 11454 bool IsValidDXTSize(GLint level, GLsizei size) { | 11596 bool IsValidDXTSize(GLint level, GLsizei size) { |
| 11455 // TODO(zmo): Linux NVIDIA driver does allow size of 1 and 2 on level 0. | 11597 // TODO(zmo): Linux NVIDIA driver does allow size of 1 and 2 on level 0. |
| 11456 // However, the WebGL conformance test and blink side code forbid it. | 11598 // However, the WebGL conformance test and blink side code forbid it. |
| 11457 // For now, let's be on the cautious side. If all drivers behaves the same | 11599 // For now, let's be on the cautious side. If all drivers behaves the same |
| 11458 // as Linux NVIDIA, then we can remove this limitation. | 11600 // as Linux NVIDIA, then we can remove this limitation. |
| 11459 return (level && size == 1) || | 11601 return (level && size == 1) || |
| 11460 (level && size == 2) || | 11602 (level && size == 2) || |
| 11461 !(size % kS3TCBlockWidth); | 11603 !(size % kS3TCBlockWidth); |
| 11462 } | 11604 } |
| 11463 | 11605 |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11872 if (texture->IsAttachedToFramebuffer()) { | 12014 if (texture->IsAttachedToFramebuffer()) { |
| 11873 framebuffer_state_.clear_state_dirty = true; | 12015 framebuffer_state_.clear_state_dirty = true; |
| 11874 } | 12016 } |
| 11875 | 12017 |
| 11876 std::unique_ptr<int8_t[]> zero; | 12018 std::unique_ptr<int8_t[]> zero; |
| 11877 if (!data) { | 12019 if (!data) { |
| 11878 zero.reset(new int8_t[image_size]); | 12020 zero.reset(new int8_t[image_size]); |
| 11879 memset(zero.get(), 0, image_size); | 12021 memset(zero.get(), 0, image_size); |
| 11880 data = zero.get(); | 12022 data = zero.get(); |
| 11881 } | 12023 } |
| 12024 | |
| 11882 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage2D"); | 12025 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage2D"); |
| 11883 glCompressedTexImage2D( | 12026 |
| 11884 target, level, internal_format, width, height, border, image_size, data); | 12027 const CompressedFormatInfo* format_info = |
| 12028 GetCompressedFormatInfo(internal_format); | |
| 12029 if (format_info != nullptr && !format_info->supportCheck(*feature_info_)) { | |
| 12030 std::unique_ptr<uint8_t[]> decompressed_data = | |
| 12031 DecompressTextureData(*format_info, width, height, 1, data); | |
|
piman
2016/07/06 21:20:59
What happens if there's a PIXEL_UNPACK_BUFFER boun
Geoff Lang
2016/07/08 18:49:16
Yea, I noticed that too. PBOs aren't handled at a
| |
| 12032 PushDecompressedTextureUnpackState(); | |
| 12033 glTexImage2D(target, level, format_info->decompressedInternalFormat, width, | |
| 12034 height, border, format_info->decompressedFormat, | |
| 12035 format_info->decompressedType, decompressed_data.get()); | |
| 12036 PopDecompressedTextureUnpackState(state_); | |
| 12037 } else { | |
| 12038 glCompressedTexImage2D(target, level, internal_format, width, height, | |
| 12039 border, image_size, data); | |
| 12040 } | |
| 11885 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage2D"); | 12041 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage2D"); |
| 11886 if (error == GL_NO_ERROR) { | 12042 if (error == GL_NO_ERROR) { |
| 11887 texture_manager()->SetLevelInfo(texture_ref, target, level, internal_format, | 12043 texture_manager()->SetLevelInfo(texture_ref, target, level, internal_format, |
| 11888 width, height, 1, border, 0, 0, | 12044 width, height, 1, border, 0, 0, |
| 11889 gfx::Rect(width, height)); | 12045 gfx::Rect(width, height)); |
| 11890 } | 12046 } |
| 11891 | 12047 |
| 11892 // This may be a slow command. Exit command processing to allow for | 12048 // This may be a slow command. Exit command processing to allow for |
| 11893 // context preemption and GPU watchdog checks. | 12049 // context preemption and GPU watchdog checks. |
| 11894 ExitCommandProcessingEarly(); | 12050 ExitCommandProcessingEarly(); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11945 framebuffer_state_.clear_state_dirty = true; | 12101 framebuffer_state_.clear_state_dirty = true; |
| 11946 } | 12102 } |
| 11947 | 12103 |
| 11948 std::unique_ptr<int8_t[]> zero; | 12104 std::unique_ptr<int8_t[]> zero; |
| 11949 if (!data) { | 12105 if (!data) { |
| 11950 zero.reset(new int8_t[image_size]); | 12106 zero.reset(new int8_t[image_size]); |
| 11951 memset(zero.get(), 0, image_size); | 12107 memset(zero.get(), 0, image_size); |
| 11952 data = zero.get(); | 12108 data = zero.get(); |
| 11953 } | 12109 } |
| 11954 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage3D"); | 12110 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage3D"); |
| 11955 glCompressedTexImage3D(target, level, internal_format, width, height, depth, | 12111 const CompressedFormatInfo* format_info = |
| 11956 border, image_size, data); | 12112 GetCompressedFormatInfo(internal_format); |
| 12113 if (format_info != nullptr && !format_info->supportCheck(*feature_info_)) { | |
| 12114 std::unique_ptr<uint8_t[]> decompressed_data = | |
| 12115 DecompressTextureData(*format_info, width, height, depth, data); | |
| 12116 PushDecompressedTextureUnpackState(); | |
| 12117 glTexImage3D(target, level, format_info->decompressedInternalFormat, width, | |
| 12118 height, depth, border, format_info->decompressedFormat, | |
| 12119 format_info->decompressedType, decompressed_data.get()); | |
| 12120 PopDecompressedTextureUnpackState(state_); | |
| 12121 } else { | |
| 12122 glCompressedTexImage3D(target, level, internal_format, width, height, depth, | |
| 12123 border, image_size, data); | |
| 12124 } | |
| 11957 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage3D"); | 12125 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage3D"); |
| 11958 if (error == GL_NO_ERROR) { | 12126 if (error == GL_NO_ERROR) { |
| 11959 texture_manager()->SetLevelInfo(texture_ref, target, level, internal_format, | 12127 texture_manager()->SetLevelInfo(texture_ref, target, level, internal_format, |
| 11960 width, height, depth, border, 0, 0, | 12128 width, height, depth, border, 0, 0, |
| 11961 gfx::Rect(width, height)); | 12129 gfx::Rect(width, height)); |
| 11962 } | 12130 } |
| 11963 | 12131 |
| 11964 // This may be a slow command. Exit command processing to allow for | 12132 // This may be a slow command. Exit command processing to allow for |
| 11965 // context preemption and GPU watchdog checks. | 12133 // context preemption and GPU watchdog checks. |
| 11966 ExitCommandProcessingEarly(); | 12134 ExitCommandProcessingEarly(); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12011 target, level, xoffset, yoffset, | 12179 target, level, xoffset, yoffset, |
| 12012 zoffset, width, height, depth, | 12180 zoffset, width, height, depth, |
| 12013 format, texture)) { | 12181 format, texture)) { |
| 12014 return; | 12182 return; |
| 12015 } | 12183 } |
| 12016 | 12184 |
| 12017 // Note: There is no need to deal with texture cleared tracking here | 12185 // Note: There is no need to deal with texture cleared tracking here |
| 12018 // because the validation above means you can only get here if the level | 12186 // because the validation above means you can only get here if the level |
| 12019 // is already a matching compressed format and in that case | 12187 // is already a matching compressed format and in that case |
| 12020 // CompressedTexImage3D already cleared the texture. | 12188 // CompressedTexImage3D already cleared the texture. |
| 12021 glCompressedTexSubImage3D( | 12189 |
| 12022 target, level, xoffset, yoffset, zoffset, width, height, depth, format, | 12190 const CompressedFormatInfo* format_info = |
| 12023 image_size, data); | 12191 GetCompressedFormatInfo(internal_format); |
| 12192 if (format_info != nullptr && !format_info->supportCheck(*feature_info_)) { | |
| 12193 std::unique_ptr<uint8_t[]> decompressed_data = | |
| 12194 DecompressTextureData(*format_info, width, height, depth, data); | |
| 12195 PushDecompressedTextureUnpackState(); | |
| 12196 glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, | |
| 12197 depth, format_info->decompressedFormat, | |
| 12198 format_info->decompressedType, decompressed_data.get()); | |
| 12199 PopDecompressedTextureUnpackState(state_); | |
| 12200 } else { | |
| 12201 glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, | |
| 12202 height, depth, format, image_size, data); | |
| 12203 } | |
| 12024 | 12204 |
| 12025 // This may be a slow command. Exit command processing to allow for | 12205 // This may be a slow command. Exit command processing to allow for |
| 12026 // context preemption and GPU watchdog checks. | 12206 // context preemption and GPU watchdog checks. |
| 12027 ExitCommandProcessingEarly(); | 12207 ExitCommandProcessingEarly(); |
| 12028 } | 12208 } |
| 12029 | 12209 |
| 12030 error::Error GLES2DecoderImpl::HandleTexImage2D(uint32_t immediate_data_size, | 12210 error::Error GLES2DecoderImpl::HandleTexImage2D(uint32_t immediate_data_size, |
| 12031 const void* cmd_data) { | 12211 const void* cmd_data) { |
| 12032 const gles2::cmds::TexImage2D& c = | 12212 const gles2::cmds::TexImage2D& c = |
| 12033 *static_cast<const gles2::cmds::TexImage2D*>(cmd_data); | 12213 *static_cast<const gles2::cmds::TexImage2D*>(cmd_data); |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12262 // We can skip the clear if we're uploading the entire level. | 12442 // We can skip the clear if we're uploading the entire level. |
| 12263 if (xoffset == 0 && yoffset == 0 && | 12443 if (xoffset == 0 && yoffset == 0 && |
| 12264 width == level_width && height == level_height) { | 12444 width == level_width && height == level_height) { |
| 12265 texture_manager()->SetLevelCleared(texture_ref, target, level, true); | 12445 texture_manager()->SetLevelCleared(texture_ref, target, level, true); |
| 12266 } else { | 12446 } else { |
| 12267 texture_manager()->ClearTextureLevel(this, texture_ref, target, level); | 12447 texture_manager()->ClearTextureLevel(this, texture_ref, target, level); |
| 12268 } | 12448 } |
| 12269 DCHECK(texture->IsLevelCleared(target, level)); | 12449 DCHECK(texture->IsLevelCleared(target, level)); |
| 12270 } | 12450 } |
| 12271 | 12451 |
| 12272 glCompressedTexSubImage2D( | 12452 const CompressedFormatInfo* format_info = |
| 12273 target, level, xoffset, yoffset, width, height, format, image_size, data); | 12453 GetCompressedFormatInfo(internal_format); |
| 12454 if (format_info != nullptr && !format_info->supportCheck(*feature_info_)) { | |
| 12455 std::unique_ptr<uint8_t[]> decompressed_data = | |
| 12456 DecompressTextureData(*format_info, width, height, 1, data); | |
| 12457 PushDecompressedTextureUnpackState(); | |
| 12458 glTexSubImage2D(target, level, xoffset, yoffset, width, height, | |
| 12459 format_info->decompressedFormat, | |
| 12460 format_info->decompressedType, decompressed_data.get()); | |
| 12461 PopDecompressedTextureUnpackState(state_); | |
| 12462 } else { | |
| 12463 glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, | |
| 12464 format, image_size, data); | |
| 12465 } | |
| 12274 | 12466 |
| 12275 // This may be a slow command. Exit command processing to allow for | 12467 // This may be a slow command. Exit command processing to allow for |
| 12276 // context preemption and GPU watchdog checks. | 12468 // context preemption and GPU watchdog checks. |
| 12277 ExitCommandProcessingEarly(); | 12469 ExitCommandProcessingEarly(); |
| 12278 } | 12470 } |
| 12279 | 12471 |
| 12280 static void Clip( | 12472 static void Clip( |
| 12281 GLint start, GLint range, GLint sourceRange, | 12473 GLint start, GLint range, GLint sourceRange, |
| 12282 GLint* out_start, GLint* out_range) { | 12474 GLint* out_start, GLint* out_range) { |
| 12283 DCHECK(out_start); | 12475 DCHECK(out_start); |
| (...skipping 2772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15056 if (target == GL_TEXTURE_3D) | 15248 if (target == GL_TEXTURE_3D) |
| 15057 level_depth = std::max(1, level_depth >> 1); | 15249 level_depth = std::max(1, level_depth >> 1); |
| 15058 } | 15250 } |
| 15059 if (!estimated_size.IsValid() || | 15251 if (!estimated_size.IsValid() || |
| 15060 !EnsureGPUMemoryAvailable(estimated_size.ValueOrDefault(0))) { | 15252 !EnsureGPUMemoryAvailable(estimated_size.ValueOrDefault(0))) { |
| 15061 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, function_name, "out of memory"); | 15253 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, function_name, "out of memory"); |
| 15062 return; | 15254 return; |
| 15063 } | 15255 } |
| 15064 } | 15256 } |
| 15065 | 15257 |
| 15258 GLenum compatability_iternal_format = internal_format; | |
|
piman
2016/07/06 21:20:59
nit: 2 typos: compatability_iternal_format -> comp
Geoff Lang
2016/07/08 18:49:16
Done.
| |
| 15259 const CompressedFormatInfo* format_info = | |
| 15260 GetCompressedFormatInfo(internal_format); | |
| 15261 if (format_info != nullptr && !format_info->supportCheck(*feature_info_)) { | |
| 15262 compatability_iternal_format = format_info->decompressedInternalFormat; | |
| 15263 } | |
| 15264 | |
| 15066 // TODO(zmo): We might need to emulate TexStorage using TexImage or | 15265 // TODO(zmo): We might need to emulate TexStorage using TexImage or |
| 15067 // CompressedTexImage on Mac OSX where we expose ES3 APIs when the underlying | 15266 // CompressedTexImage on Mac OSX where we expose ES3 APIs when the underlying |
| 15068 // driver is lower than 4.2 and ARB_texture_storage extension doesn't exist. | 15267 // driver is lower than 4.2 and ARB_texture_storage extension doesn't exist. |
| 15069 if (dimension == ContextState::k2D) { | 15268 if (dimension == ContextState::k2D) { |
| 15070 glTexStorage2DEXT(target, levels, internal_format, width, height); | 15269 glTexStorage2DEXT(target, levels, compatability_iternal_format, width, |
| 15270 height); | |
| 15071 } else { | 15271 } else { |
| 15072 glTexStorage3D(target, levels, internal_format, width, height, depth); | 15272 glTexStorage3D(target, levels, compatability_iternal_format, width, height, |
| 15273 depth); | |
| 15073 } | 15274 } |
| 15074 | 15275 |
| 15075 { | 15276 { |
| 15076 GLsizei level_width = width; | 15277 GLsizei level_width = width; |
| 15077 GLsizei level_height = height; | 15278 GLsizei level_height = height; |
| 15078 GLsizei level_depth = depth; | 15279 GLsizei level_depth = depth; |
| 15079 GLenum adjusted_format = | 15280 GLenum adjusted_format = |
| 15080 feature_info_->IsES3Enabled() ? internal_format : format; | 15281 feature_info_->IsES3Enabled() ? internal_format : format; |
| 15081 for (int ii = 0; ii < levels; ++ii) { | 15282 for (int ii = 0; ii < levels; ++ii) { |
| 15082 if (target == GL_TEXTURE_CUBE_MAP) { | 15283 if (target == GL_TEXTURE_CUBE_MAP) { |
| (...skipping 1988 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 17071 } | 17272 } |
| 17072 | 17273 |
| 17073 // Include the auto-generated part of this file. We split this because it means | 17274 // Include the auto-generated part of this file. We split this because it means |
| 17074 // we can easily edit the non-auto generated parts right here in this file | 17275 // we can easily edit the non-auto generated parts right here in this file |
| 17075 // instead of having to edit some template or the code generator. | 17276 // instead of having to edit some template or the code generator. |
| 17076 #include "base/macros.h" | 17277 #include "base/macros.h" |
| 17077 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 17278 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 17078 | 17279 |
| 17079 } // namespace gles2 | 17280 } // namespace gles2 |
| 17080 } // namespace gpu | 17281 } // namespace gpu |
| OLD | NEW |