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 <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <list> | 10 #include <list> |
(...skipping 1173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1184 GLenum buffer_mode); | 1184 GLenum buffer_mode); |
1185 | 1185 |
1186 // Clear any textures used by the current program. | 1186 // Clear any textures used by the current program. |
1187 bool ClearUnclearedTextures(); | 1187 bool ClearUnclearedTextures(); |
1188 | 1188 |
1189 // Clears any uncleared attachments attached to the given frame buffer. | 1189 // Clears any uncleared attachments attached to the given frame buffer. |
1190 // Returns false if there was a generated GL error. | 1190 // Returns false if there was a generated GL error. |
1191 void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer); | 1191 void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer); |
1192 | 1192 |
1193 // overridden from GLES2Decoder | 1193 // overridden from GLES2Decoder |
1194 bool ClearLevel(unsigned service_id, | 1194 bool ClearLevel(Texture* texture, |
1195 unsigned bind_target, | |
1196 unsigned target, | 1195 unsigned target, |
1197 int level, | 1196 int level, |
1198 unsigned internal_format, | 1197 unsigned internal_format, |
1199 unsigned format, | 1198 unsigned format, |
1200 unsigned type, | 1199 unsigned type, |
1201 int width, | 1200 int width, |
1202 int height, | 1201 int height, |
1203 bool is_texture_immutable) override; | 1202 bool is_texture_immutable) override; |
1204 | 1203 |
1205 // Restore all GL state that affects clearing. | 1204 // Restore all GL state that affects clearing. |
(...skipping 7197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8403 } | 8402 } |
8404 | 8403 |
8405 void GLES2DecoderImpl::DoBufferSubData( | 8404 void GLES2DecoderImpl::DoBufferSubData( |
8406 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { | 8405 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { |
8407 // Just delegate it. Some validation is actually done before this. | 8406 // Just delegate it. Some validation is actually done before this. |
8408 buffer_manager()->ValidateAndDoBufferSubData( | 8407 buffer_manager()->ValidateAndDoBufferSubData( |
8409 &state_, target, offset, size, data); | 8408 &state_, target, offset, size, data); |
8410 } | 8409 } |
8411 | 8410 |
8412 bool GLES2DecoderImpl::ClearLevel( | 8411 bool GLES2DecoderImpl::ClearLevel( |
8413 unsigned service_id, | 8412 Texture* texture, |
8414 unsigned bind_target, | |
8415 unsigned target, | 8413 unsigned target, |
8416 int level, | 8414 int level, |
8417 unsigned internal_format, | 8415 unsigned internal_format, |
8418 unsigned format, | 8416 unsigned format, |
8419 unsigned type, | 8417 unsigned type, |
8420 int width, | 8418 int width, |
8421 int height, | 8419 int height, |
8422 bool is_texture_immutable) { | 8420 bool is_texture_immutable) { |
8423 uint32 channels = GLES2Util::GetChannelsForFormat(format); | 8421 uint32 channels = GLES2Util::GetChannelsForFormat(format); |
8424 if (feature_info_->feature_flags().angle_depth_texture && | 8422 if (feature_info_->feature_flags().angle_depth_texture && |
8425 (channels & GLES2Util::kDepth) != 0) { | 8423 (channels & GLES2Util::kDepth) != 0) { |
8426 // It's a depth format and ANGLE doesn't allow texImage2D or texSubImage2D | 8424 // It's a depth format and ANGLE doesn't allow texImage2D or texSubImage2D |
8427 // on depth formats. | 8425 // on depth formats. |
8428 GLuint fb = 0; | 8426 GLuint fb = 0; |
8429 glGenFramebuffersEXT(1, &fb); | 8427 glGenFramebuffersEXT(1, &fb); |
8430 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb); | 8428 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb); |
8431 | 8429 |
8432 bool have_stencil = (channels & GLES2Util::kStencil) != 0; | 8430 bool have_stencil = (channels & GLES2Util::kStencil) != 0; |
8433 GLenum attachment = have_stencil ? GL_DEPTH_STENCIL_ATTACHMENT : | 8431 GLenum attachment = have_stencil ? GL_DEPTH_STENCIL_ATTACHMENT : |
8434 GL_DEPTH_ATTACHMENT; | 8432 GL_DEPTH_ATTACHMENT; |
8435 | 8433 |
8436 glFramebufferTexture2DEXT( | 8434 glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, attachment, target, |
8437 GL_DRAW_FRAMEBUFFER_EXT, attachment, target, service_id, level); | 8435 texture->service_id(), level); |
8438 // ANGLE promises a depth only attachment ok. | 8436 // ANGLE promises a depth only attachment ok. |
8439 if (glCheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT) != | 8437 if (glCheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT) != |
8440 GL_FRAMEBUFFER_COMPLETE) { | 8438 GL_FRAMEBUFFER_COMPLETE) { |
8441 return false; | 8439 return false; |
8442 } | 8440 } |
8443 glClearStencil(0); | 8441 glClearStencil(0); |
8444 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask); | 8442 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask); |
8445 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask); | 8443 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask); |
8446 glClearDepth(1.0f); | 8444 glClearDepth(1.0f); |
8447 state_.SetDeviceDepthMask(GL_TRUE); | 8445 state_.SetDeviceDepthMask(GL_TRUE); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8486 NULL, NULL)) { | 8484 NULL, NULL)) { |
8487 return false; | 8485 return false; |
8488 } | 8486 } |
8489 } else { | 8487 } else { |
8490 tile_height = height; | 8488 tile_height = height; |
8491 } | 8489 } |
8492 | 8490 |
8493 // Assumes the size has already been checked. | 8491 // Assumes the size has already been checked. |
8494 scoped_ptr<char[]> zero(new char[size]); | 8492 scoped_ptr<char[]> zero(new char[size]); |
8495 memset(zero.get(), 0, size); | 8493 memset(zero.get(), 0, size); |
8496 glBindTexture(bind_target, service_id); | 8494 glBindTexture(texture->target(), texture->service_id()); |
8497 | 8495 |
| 8496 bool has_images = texture->HasImages(); |
8498 GLint y = 0; | 8497 GLint y = 0; |
8499 while (y < height) { | 8498 while (y < height) { |
8500 GLint h = y + tile_height > height ? height - y : tile_height; | 8499 GLint h = y + tile_height > height ? height - y : tile_height; |
8501 if (is_texture_immutable || h != height) { | 8500 if (is_texture_immutable || h != height || has_images) { |
8502 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); | 8501 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); |
8503 } else { | 8502 } else { |
8504 glTexImage2D( | 8503 glTexImage2D( |
8505 target, level, internal_format, width, h, 0, format, type, | 8504 target, level, internal_format, width, h, 0, format, type, |
8506 zero.get()); | 8505 zero.get()); |
8507 } | 8506 } |
8508 y += tile_height; | 8507 y += tile_height; |
8509 } | 8508 } |
8510 TextureRef* texture = texture_manager()->GetTextureInfoForTarget( | 8509 TextureRef* bound_texture = |
8511 &state_, bind_target); | 8510 texture_manager()->GetTextureInfoForTarget(&state_, texture->target()); |
8512 glBindTexture(bind_target, texture ? texture->service_id() : 0); | 8511 glBindTexture(texture->target(), |
| 8512 bound_texture ? bound_texture->service_id() : 0); |
8513 return true; | 8513 return true; |
8514 } | 8514 } |
8515 | 8515 |
8516 namespace { | 8516 namespace { |
8517 | 8517 |
8518 const int kS3TCBlockWidth = 4; | 8518 const int kS3TCBlockWidth = 4; |
8519 const int kS3TCBlockHeight = 4; | 8519 const int kS3TCBlockHeight = 4; |
8520 const int kS3TCDXT1BlockSize = 8; | 8520 const int kS3TCDXT1BlockSize = 8; |
8521 const int kS3TCDXT3AndDXT5BlockSize = 16; | 8521 const int kS3TCDXT3AndDXT5BlockSize = 16; |
8522 | 8522 |
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9163 GLint copyWidth = 0; | 9163 GLint copyWidth = 0; |
9164 GLint copyHeight = 0; | 9164 GLint copyHeight = 0; |
9165 Clip(x, width, size.width(), ©X, ©Width); | 9165 Clip(x, width, size.width(), ©X, ©Width); |
9166 Clip(y, height, size.height(), ©Y, ©Height); | 9166 Clip(y, height, size.height(), ©Y, ©Height); |
9167 | 9167 |
9168 if (copyX != x || | 9168 if (copyX != x || |
9169 copyY != y || | 9169 copyY != y || |
9170 copyWidth != width || | 9170 copyWidth != width || |
9171 copyHeight != height) { | 9171 copyHeight != height) { |
9172 // some part was clipped so clear the texture. | 9172 // some part was clipped so clear the texture. |
9173 if (!ClearLevel( | 9173 if (!ClearLevel(texture, target, level, internal_format, internal_format, |
9174 texture->service_id(), texture->target(), | 9174 GL_UNSIGNED_BYTE, width, height, texture->IsImmutable())) { |
9175 target, level, internal_format, internal_format, GL_UNSIGNED_BYTE, | |
9176 width, height, texture->IsImmutable())) { | |
9177 LOCAL_SET_GL_ERROR( | 9175 LOCAL_SET_GL_ERROR( |
9178 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); | 9176 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); |
9179 return; | 9177 return; |
9180 } | 9178 } |
9181 if (copyHeight > 0 && copyWidth > 0) { | 9179 if (copyHeight > 0 && copyWidth > 0) { |
9182 GLint dx = copyX - x; | 9180 GLint dx = copyX - x; |
9183 GLint dy = copyY - y; | 9181 GLint dy = copyY - y; |
9184 GLint destX = dx; | 9182 GLint destX = dx; |
9185 GLint destY = dy; | 9183 GLint destY = dy; |
9186 ScopedModifyPixels modify(texture_ref); | 9184 ScopedModifyPixels modify(texture_ref); |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9439 GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); | 9437 GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); |
9440 return error::kNoError; | 9438 return error::kNoError; |
9441 } | 9439 } |
9442 ScopedTextureUploadTimer timer(&texture_state_); | 9440 ScopedTextureUploadTimer timer(&texture_state_); |
9443 glTexSubImage2D( | 9441 glTexSubImage2D( |
9444 target, level, xoffset, yoffset, width, height, format, type, data); | 9442 target, level, xoffset, yoffset, width, height, format, type, data); |
9445 return error::kNoError; | 9443 return error::kNoError; |
9446 } | 9444 } |
9447 | 9445 |
9448 if (!texture_state_.texsubimage2d_faster_than_teximage2d && | 9446 if (!texture_state_.texsubimage2d_faster_than_teximage2d && |
9449 !texture->IsImmutable()) { | 9447 !texture->IsImmutable() && |
| 9448 !texture->HasImages()) { |
9450 ScopedTextureUploadTimer timer(&texture_state_); | 9449 ScopedTextureUploadTimer timer(&texture_state_); |
9451 GLenum internal_format; | 9450 GLenum internal_format; |
9452 GLenum tex_type; | 9451 GLenum tex_type; |
9453 texture->GetLevelType(target, level, &tex_type, &internal_format); | 9452 texture->GetLevelType(target, level, &tex_type, &internal_format); |
9454 // NOTE: In OpenGL ES 2.0 border is always zero. If that changes we'll need | 9453 // NOTE: In OpenGL ES 2.0 border is always zero. If that changes we'll need |
9455 // to look it up. | 9454 // to look it up. |
9456 glTexImage2D( | 9455 glTexImage2D( |
9457 target, level, internal_format, width, height, 0, format, type, data); | 9456 target, level, internal_format, width, height, 0, format, type, data); |
9458 } else { | 9457 } else { |
9459 ScopedTextureUploadTimer timer(&texture_state_); | 9458 ScopedTextureUploadTimer timer(&texture_state_); |
(...skipping 2666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12126 } | 12125 } |
12127 } | 12126 } |
12128 | 12127 |
12129 // Include the auto-generated part of this file. We split this because it means | 12128 // Include the auto-generated part of this file. We split this because it means |
12130 // we can easily edit the non-auto generated parts right here in this file | 12129 // we can easily edit the non-auto generated parts right here in this file |
12131 // instead of having to edit some template or the code generator. | 12130 // instead of having to edit some template or the code generator. |
12132 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 12131 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
12133 | 12132 |
12134 } // namespace gles2 | 12133 } // namespace gles2 |
12135 } // namespace gpu | 12134 } // namespace gpu |
OLD | NEW |