Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 1154053002: gpu: Use a rectangle to keep track of the cleared area of each texture level. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix GLES2DecoderImpl::DoCopyTexImage2D Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <cmath> 10 #include <cmath>
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 } 184 }
185 185
186 struct Vec4f { 186 struct Vec4f {
187 explicit Vec4f(const Vec4& data) { 187 explicit Vec4f(const Vec4& data) {
188 data.GetValues(v); 188 data.GetValues(v);
189 } 189 }
190 190
191 GLfloat v[4]; 191 GLfloat v[4];
192 }; 192 };
193 193
194 // Returns the union of |rect1| and |rect2| if one of the rectangles is empty,
195 // contains the other rectangle or shares an edge with the other rectangle.
196 bool CombineAdjacentRects(const gfx::Rect& rect1,
197 const gfx::Rect& rect2,
198 gfx::Rect* result) {
199 // Return |rect2| if |rect1| is empty or |rect2| contains |rect1|.
200 if (rect1.IsEmpty() || rect2.Contains(rect1)) {
201 *result = rect2;
202 return true;
203 }
204
205 // Return |rect1| if |rect2| is empty or |rect1| contains |rect2|.
206 if (rect2.IsEmpty() || rect1.Contains(rect2)) {
207 *result = rect1;
208 return true;
209 }
210
211 // Return the union of |rect1| and |rect2| if they share an edge.
212 if (rect1.SharesEdgeWith(rect2)) {
213 *result = gfx::UnionRects(rect1, rect2);
214 return true;
215 }
216
217 // Return false if it's not possible to combine |rect1| and |rect2|.
218 return false;
219 }
220
194 } // namespace 221 } // namespace
195 222
196 class GLES2DecoderImpl; 223 class GLES2DecoderImpl;
197 224
198 // Local versions of the SET_GL_ERROR macros 225 // Local versions of the SET_GL_ERROR macros
199 #define LOCAL_SET_GL_ERROR(error, function_name, msg) \ 226 #define LOCAL_SET_GL_ERROR(error, function_name, msg) \
200 ERRORSTATE_SET_GL_ERROR(state_.GetErrorState(), error, function_name, msg) 227 ERRORSTATE_SET_GL_ERROR(state_.GetErrorState(), error, function_name, msg)
201 #define LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, value, label) \ 228 #define LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, value, label) \
202 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(state_.GetErrorState(), \ 229 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(state_.GetErrorState(), \
203 function_name, value, label) 230 function_name, value, label)
(...skipping 1059 matching lines...) Expand 10 before | Expand all | Expand 10 after
1263 bool ClearUnclearedTextures(); 1290 bool ClearUnclearedTextures();
1264 1291
1265 // Clears any uncleared attachments attached to the given frame buffer. 1292 // Clears any uncleared attachments attached to the given frame buffer.
1266 // Returns false if there was a generated GL error. 1293 // Returns false if there was a generated GL error.
1267 void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer); 1294 void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer);
1268 1295
1269 // overridden from GLES2Decoder 1296 // overridden from GLES2Decoder
1270 bool ClearLevel(Texture* texture, 1297 bool ClearLevel(Texture* texture,
1271 unsigned target, 1298 unsigned target,
1272 int level, 1299 int level,
1273 unsigned internal_format,
1274 unsigned format, 1300 unsigned format,
1275 unsigned type, 1301 unsigned type,
1302 int xoffset,
1303 int yoffset,
1276 int width, 1304 int width,
1277 int height, 1305 int height) override;
1278 bool is_texture_immutable) override;
1279 1306
1280 // Restore all GL state that affects clearing. 1307 // Restore all GL state that affects clearing.
1281 void RestoreClearState(); 1308 void RestoreClearState();
1282 1309
1283 // Remembers the state of some capabilities. 1310 // Remembers the state of some capabilities.
1284 // Returns: true if glEnable/glDisable should actually be called. 1311 // Returns: true if glEnable/glDisable should actually be called.
1285 bool SetCapabilityState(GLenum cap, bool enabled); 1312 bool SetCapabilityState(GLenum cap, bool enabled);
1286 1313
1287 // Check that the currently bound framebuffers are valid. 1314 // Check that the currently bound framebuffers are valid.
1288 // Generates GL error if not. 1315 // Generates GL error if not.
(...skipping 2254 matching lines...) Expand 10 before | Expand all | Expand 10 after
3543 3570
3544 GLenum completeness = framebuffer->IsPossiblyComplete(); 3571 GLenum completeness = framebuffer->IsPossiblyComplete();
3545 if (completeness != GL_FRAMEBUFFER_COMPLETE) { 3572 if (completeness != GL_FRAMEBUFFER_COMPLETE) {
3546 LOCAL_SET_GL_ERROR( 3573 LOCAL_SET_GL_ERROR(
3547 GL_INVALID_FRAMEBUFFER_OPERATION, func_name, "framebuffer incomplete"); 3574 GL_INVALID_FRAMEBUFFER_OPERATION, func_name, "framebuffer incomplete");
3548 return false; 3575 return false;
3549 } 3576 }
3550 3577
3551 // Are all the attachments cleared? 3578 // Are all the attachments cleared?
3552 if (renderbuffer_manager()->HaveUnclearedRenderbuffers() || 3579 if (renderbuffer_manager()->HaveUnclearedRenderbuffers() ||
3553 texture_manager()->HaveUnclearedMips()) { 3580 texture_manager()->HaveUnsafeTextures()) {
3554 if (!framebuffer->IsCleared()) { 3581 if (!framebuffer->IsCleared()) {
3555 // Can we clear them? 3582 // Can we clear them?
3556 if (framebuffer->GetStatus(texture_manager(), target) != 3583 if (framebuffer->GetStatus(texture_manager(), target) !=
3557 GL_FRAMEBUFFER_COMPLETE) { 3584 GL_FRAMEBUFFER_COMPLETE) {
3558 LOCAL_SET_GL_ERROR( 3585 LOCAL_SET_GL_ERROR(
3559 GL_INVALID_FRAMEBUFFER_OPERATION, func_name, 3586 GL_INVALID_FRAMEBUFFER_OPERATION, func_name,
3560 "framebuffer incomplete (clear)"); 3587 "framebuffer incomplete (clear)");
3561 return false; 3588 return false;
3562 } 3589 }
3563 ClearUnclearedAttachments(target, framebuffer); 3590 ClearUnclearedAttachments(target, framebuffer);
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
3678 return back_buffer_color_format_; 3705 return back_buffer_color_format_;
3679 } 3706 }
3680 } 3707 }
3681 3708
3682 void GLES2DecoderImpl::UpdateParentTextureInfo() { 3709 void GLES2DecoderImpl::UpdateParentTextureInfo() {
3683 if (!offscreen_saved_color_texture_info_.get()) 3710 if (!offscreen_saved_color_texture_info_.get())
3684 return; 3711 return;
3685 GLenum target = offscreen_saved_color_texture_info_->texture()->target(); 3712 GLenum target = offscreen_saved_color_texture_info_->texture()->target();
3686 glBindTexture(target, offscreen_saved_color_texture_info_->service_id()); 3713 glBindTexture(target, offscreen_saved_color_texture_info_->service_id());
3687 texture_manager()->SetLevelInfo( 3714 texture_manager()->SetLevelInfo(
3688 offscreen_saved_color_texture_info_.get(), 3715 offscreen_saved_color_texture_info_.get(), GL_TEXTURE_2D,
3689 GL_TEXTURE_2D,
3690 0, // level 3716 0, // level
3691 GL_RGBA, 3717 GL_RGBA, offscreen_size_.width(), offscreen_size_.height(),
3692 offscreen_size_.width(),
3693 offscreen_size_.height(),
3694 1, // depth 3718 1, // depth
3695 0, // border 3719 0, // border
3696 GL_RGBA, 3720 GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(offscreen_size_));
3697 GL_UNSIGNED_BYTE,
3698 true);
3699 texture_manager()->SetParameteri( 3721 texture_manager()->SetParameteri(
3700 "UpdateParentTextureInfo", 3722 "UpdateParentTextureInfo",
3701 GetErrorState(), 3723 GetErrorState(),
3702 offscreen_saved_color_texture_info_.get(), 3724 offscreen_saved_color_texture_info_.get(),
3703 GL_TEXTURE_MAG_FILTER, 3725 GL_TEXTURE_MAG_FILTER,
3704 GL_LINEAR); 3726 GL_LINEAR);
3705 texture_manager()->SetParameteri( 3727 texture_manager()->SetParameteri(
3706 "UpdateParentTextureInfo", 3728 "UpdateParentTextureInfo",
3707 GetErrorState(), 3729 GetErrorState(),
3708 offscreen_saved_color_texture_info_.get(), 3730 offscreen_saved_color_texture_info_.get(),
(...skipping 5149 matching lines...) Expand 10 before | Expand all | Expand 10 after
8858 return error::kNoError; 8880 return error::kNoError;
8859 } 8881 }
8860 8882
8861 void GLES2DecoderImpl::DoBufferSubData( 8883 void GLES2DecoderImpl::DoBufferSubData(
8862 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { 8884 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) {
8863 // Just delegate it. Some validation is actually done before this. 8885 // Just delegate it. Some validation is actually done before this.
8864 buffer_manager()->ValidateAndDoBufferSubData( 8886 buffer_manager()->ValidateAndDoBufferSubData(
8865 &state_, target, offset, size, data); 8887 &state_, target, offset, size, data);
8866 } 8888 }
8867 8889
8868 bool GLES2DecoderImpl::ClearLevel( 8890 bool GLES2DecoderImpl::ClearLevel(Texture* texture,
8869 Texture* texture, 8891 unsigned target,
8870 unsigned target, 8892 int level,
8871 int level, 8893 unsigned format,
8872 unsigned internal_format, 8894 unsigned type,
8873 unsigned format, 8895 int xoffset,
8874 unsigned type, 8896 int yoffset,
8875 int width, 8897 int width,
8876 int height, 8898 int height) {
8877 bool is_texture_immutable) {
8878 uint32 channels = GLES2Util::GetChannelsForFormat(format); 8899 uint32 channels = GLES2Util::GetChannelsForFormat(format);
8879 if (feature_info_->feature_flags().angle_depth_texture && 8900 if (feature_info_->feature_flags().angle_depth_texture &&
8880 (channels & GLES2Util::kDepth) != 0) { 8901 (channels & GLES2Util::kDepth) != 0 && xoffset == 0 && yoffset == 0) {
8881 // It's a depth format and ANGLE doesn't allow texImage2D or texSubImage2D 8902 // It's a depth format and ANGLE doesn't allow texImage2D or texSubImage2D
8882 // on depth formats. 8903 // on depth formats.
piman 2015/06/05 19:55:49 It sounds like this is still true in the xoffset !
reveman 2015/06/05 20:39:43 Yes, I was trying to avoid that but we have to han
8883 GLuint fb = 0; 8904 GLuint fb = 0;
8884 glGenFramebuffersEXT(1, &fb); 8905 glGenFramebuffersEXT(1, &fb);
8885 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb); 8906 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb);
8886 8907
8887 bool have_stencil = (channels & GLES2Util::kStencil) != 0; 8908 bool have_stencil = (channels & GLES2Util::kStencil) != 0;
8888 GLenum attachment = have_stencil ? GL_DEPTH_STENCIL_ATTACHMENT : 8909 GLenum attachment = have_stencil ? GL_DEPTH_STENCIL_ATTACHMENT :
8889 GL_DEPTH_ATTACHMENT; 8910 GL_DEPTH_ATTACHMENT;
8890 8911
8891 glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, attachment, target, 8912 glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, attachment, target,
8892 texture->service_id(), level); 8913 texture->service_id(), level);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
8943 } 8964 }
8944 } else { 8965 } else {
8945 tile_height = height; 8966 tile_height = height;
8946 } 8967 }
8947 8968
8948 // Assumes the size has already been checked. 8969 // Assumes the size has already been checked.
8949 scoped_ptr<char[]> zero(new char[size]); 8970 scoped_ptr<char[]> zero(new char[size]);
8950 memset(zero.get(), 0, size); 8971 memset(zero.get(), 0, size);
8951 glBindTexture(texture->target(), texture->service_id()); 8972 glBindTexture(texture->target(), texture->service_id());
8952 8973
8953 bool has_images = texture->HasImages();
8954 GLint y = 0; 8974 GLint y = 0;
8955 while (y < height) { 8975 while (y < height) {
8956 GLint h = y + tile_height > height ? height - y : tile_height; 8976 GLint h = y + tile_height > height ? height - y : tile_height;
8957 if (is_texture_immutable || h != height || has_images) { 8977 glTexSubImage2D(target, level, xoffset, yoffset + y, width, h, format, type,
8958 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); 8978 zero.get());
8959 } else {
8960 glTexImage2D(
8961 target, level, internal_format, width, h, 0, format, type,
8962 zero.get());
8963 }
8964 y += tile_height; 8979 y += tile_height;
8965 } 8980 }
8966 TextureRef* bound_texture = 8981 TextureRef* bound_texture =
8967 texture_manager()->GetTextureInfoForTarget(&state_, texture->target()); 8982 texture_manager()->GetTextureInfoForTarget(&state_, texture->target());
8968 glBindTexture(texture->target(), 8983 glBindTexture(texture->target(),
8969 bound_texture ? bound_texture->service_id() : 0); 8984 bound_texture ? bound_texture->service_id() : 0);
8970 return true; 8985 return true;
8971 } 8986 }
8972 8987
8973 namespace { 8988 namespace {
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
9314 if (!data) { 9329 if (!data) {
9315 zero.reset(new int8[image_size]); 9330 zero.reset(new int8[image_size]);
9316 memset(zero.get(), 0, image_size); 9331 memset(zero.get(), 0, image_size);
9317 data = zero.get(); 9332 data = zero.get();
9318 } 9333 }
9319 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage2D"); 9334 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage2D");
9320 glCompressedTexImage2D( 9335 glCompressedTexImage2D(
9321 target, level, internal_format, width, height, border, image_size, data); 9336 target, level, internal_format, width, height, border, image_size, data);
9322 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage2D"); 9337 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage2D");
9323 if (error == GL_NO_ERROR) { 9338 if (error == GL_NO_ERROR) {
9324 texture_manager()->SetLevelInfo( 9339 texture_manager()->SetLevelInfo(texture_ref, target, level, internal_format,
9325 texture_ref, target, level, internal_format, 9340 width, height, 1, border, 0, 0,
9326 width, height, 1, border, 0, 0, true); 9341 gfx::Rect(width, height));
9327 } 9342 }
9328 9343
9329 // This may be a slow command. Exit command processing to allow for 9344 // This may be a slow command. Exit command processing to allow for
9330 // context preemption and GPU watchdog checks. 9345 // context preemption and GPU watchdog checks.
9331 ExitCommandProcessingEarly(); 9346 ExitCommandProcessingEarly();
9332 return error::kNoError; 9347 return error::kNoError;
9333 } 9348 }
9334 9349
9335 error::Error GLES2DecoderImpl::HandleCompressedTexImage2D( 9350 error::Error GLES2DecoderImpl::HandleCompressedTexImage2D(
9336 uint32 immediate_data_size, 9351 uint32 immediate_data_size,
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
9501 if (!data) { 9516 if (!data) {
9502 zero.reset(new int8[image_size]); 9517 zero.reset(new int8[image_size]);
9503 memset(zero.get(), 0, image_size); 9518 memset(zero.get(), 0, image_size);
9504 data = zero.get(); 9519 data = zero.get();
9505 } 9520 }
9506 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage3D"); 9521 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage3D");
9507 glCompressedTexImage3D(target, level, internal_format, width, height, depth, 9522 glCompressedTexImage3D(target, level, internal_format, width, height, depth,
9508 border, image_size, data); 9523 border, image_size, data);
9509 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage3D"); 9524 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage3D");
9510 if (error == GL_NO_ERROR) { 9525 if (error == GL_NO_ERROR) {
9511 texture_manager()->SetLevelInfo( 9526 texture_manager()->SetLevelInfo(texture_ref, target, level, internal_format,
9512 texture_ref, target, level, internal_format, 9527 width, height, depth, border, 0, 0,
9513 width, height, depth, border, 0, 0, true); 9528 gfx::Rect(width, height));
9514 } 9529 }
9515 9530
9516 // This may be a slow command. Exit command processing to allow for 9531 // This may be a slow command. Exit command processing to allow for
9517 // context preemption and GPU watchdog checks. 9532 // context preemption and GPU watchdog checks.
9518 ExitCommandProcessingEarly(); 9533 ExitCommandProcessingEarly();
9519 return error::kNoError; 9534 return error::kNoError;
9520 } 9535 }
9521 9536
9522 error::Error GLES2DecoderImpl::HandleCompressedTexImage3D( 9537 error::Error GLES2DecoderImpl::HandleCompressedTexImage3D(
9523 uint32 immediate_data_size, const void* cmd_data) { 9538 uint32 immediate_data_size, const void* cmd_data) {
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
9967 GLint copyY = 0; 9982 GLint copyY = 0;
9968 GLint copyWidth = 0; 9983 GLint copyWidth = 0;
9969 GLint copyHeight = 0; 9984 GLint copyHeight = 0;
9970 Clip(x, width, size.width(), &copyX, &copyWidth); 9985 Clip(x, width, size.width(), &copyX, &copyWidth);
9971 Clip(y, height, size.height(), &copyY, &copyHeight); 9986 Clip(y, height, size.height(), &copyY, &copyHeight);
9972 9987
9973 if (copyX != x || 9988 if (copyX != x ||
9974 copyY != y || 9989 copyY != y ||
9975 copyWidth != width || 9990 copyWidth != width ||
9976 copyHeight != height) { 9991 copyHeight != height) {
9977 // some part was clipped so clear the texture. 9992 // some part was clipped so clear the rect.
9978 if (!ClearLevel(texture, target, level, internal_format, internal_format, 9993 uint32 pixels_size = 0;
9979 GL_UNSIGNED_BYTE, width, height, texture->IsImmutable())) { 9994 if (!GLES2Util::ComputeImageDataSizes(
9995 width, height, 1, internal_format, GL_UNSIGNED_BYTE,
9996 state_.unpack_alignment, &pixels_size, NULL, NULL)) {
9980 LOCAL_SET_GL_ERROR( 9997 LOCAL_SET_GL_ERROR(
9981 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); 9998 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big");
9982 return; 9999 return;
9983 } 10000 }
10001 scoped_ptr<char[]> zero(new char[pixels_size]);
10002 memset(zero.get(), 0, pixels_size);
10003 ScopedModifyPixels modify(texture_ref);
10004 glTexImage2D(target, level, internal_format, width, height, border,
10005 internal_format, GL_UNSIGNED_BYTE, zero.get());
reveman 2015/06/05 19:38:37 I changed this code to be more consistent with DoC
piman 2015/06/05 19:55:50 That's a nice catch, thanks!
9984 if (copyHeight > 0 && copyWidth > 0) { 10006 if (copyHeight > 0 && copyWidth > 0) {
9985 GLint dx = copyX - x; 10007 GLint dx = copyX - x;
9986 GLint dy = copyY - y; 10008 GLint dy = copyY - y;
9987 GLint destX = dx; 10009 GLint destX = dx;
9988 GLint destY = dy; 10010 GLint destY = dy;
9989 ScopedModifyPixels modify(texture_ref); 10011 ScopedModifyPixels modify(texture_ref);
piman 2015/06/05 19:55:50 Can ScopedModifyPixels be nested? Maybe just remov
reveman 2015/06/05 20:39:43 Done.
9990 glCopyTexSubImage2D(target, level, 10012 glCopyTexSubImage2D(target, level,
9991 destX, destY, copyX, copyY, 10013 destX, destY, copyX, copyY,
9992 copyWidth, copyHeight); 10014 copyWidth, copyHeight);
9993 } 10015 }
9994 } else { 10016 } else {
9995 ScopedModifyPixels modify(texture_ref); 10017 ScopedModifyPixels modify(texture_ref);
9996 glCopyTexImage2D(target, level, internal_format, 10018 glCopyTexImage2D(target, level, internal_format,
9997 copyX, copyY, copyWidth, copyHeight, border); 10019 copyX, copyY, copyWidth, copyHeight, border);
9998 } 10020 }
9999 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTexImage2D"); 10021 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTexImage2D");
10000 if (error == GL_NO_ERROR) { 10022 if (error == GL_NO_ERROR) {
10001 texture_manager()->SetLevelInfo( 10023 texture_manager()->SetLevelInfo(texture_ref, target, level, internal_format,
10002 texture_ref, target, level, internal_format, width, height, 1, 10024 width, height, 1, border, internal_format,
10003 border, internal_format, GL_UNSIGNED_BYTE, true); 10025 GL_UNSIGNED_BYTE, gfx::Rect(width, height));
10004 } 10026 }
10005 10027
10006 // This may be a slow command. Exit command processing to allow for 10028 // This may be a slow command. Exit command processing to allow for
10007 // context preemption and GPU watchdog checks. 10029 // context preemption and GPU watchdog checks.
10008 ExitCommandProcessingEarly(); 10030 ExitCommandProcessingEarly();
10009 } 10031 }
10010 10032
10011 void GLES2DecoderImpl::DoCopyTexSubImage2D( 10033 void GLES2DecoderImpl::DoCopyTexSubImage2D(
10012 GLenum target, 10034 GLenum target,
10013 GLint level, 10035 GLint level,
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
10081 gfx::Size size = GetBoundReadFrameBufferSize(); 10103 gfx::Size size = GetBoundReadFrameBufferSize();
10082 GLint copyX = 0; 10104 GLint copyX = 0;
10083 GLint copyY = 0; 10105 GLint copyY = 0;
10084 GLint copyWidth = 0; 10106 GLint copyWidth = 0;
10085 GLint copyHeight = 0; 10107 GLint copyHeight = 0;
10086 Clip(x, width, size.width(), &copyX, &copyWidth); 10108 Clip(x, width, size.width(), &copyX, &copyWidth);
10087 Clip(y, height, size.height(), &copyY, &copyHeight); 10109 Clip(y, height, size.height(), &copyY, &copyHeight);
10088 10110
10089 if (xoffset != 0 || yoffset != 0 || width != size.width() || 10111 if (xoffset != 0 || yoffset != 0 || width != size.width() ||
10090 height != size.height()) { 10112 height != size.height()) {
10091 if (!texture_manager()->ClearTextureLevel(this, texture_ref, target, 10113 gfx::Rect cleared_rect;
10092 level)) { 10114 if (CombineAdjacentRects(texture->GetLevelClearedRect(target, level),
10093 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopyTexSubImage2D", 10115 gfx::Rect(xoffset, yoffset, width, height),
10094 "dimensions too big"); 10116 &cleared_rect)) {
10095 return; 10117 DCHECK_GE(cleared_rect.size().GetArea(),
10118 texture->GetLevelClearedRect(target, level).size().GetArea());
10119 texture_manager()->SetLevelClearedRect(texture_ref, target, level,
10120 cleared_rect);
10121 } else {
10122 // Otherwise clear part of texture level that is not already cleared.
10123 if (!texture_manager()->ClearTextureLevel(this, texture_ref, target,
10124 level)) {
10125 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopyTexSubImage2D",
10126 "dimensions too big");
10127 return;
10128 }
10096 } 10129 }
10097 } else { 10130 } else {
10098 // Write all pixels in below. 10131 // Write all pixels in below.
10099 texture_manager()->SetLevelCleared(texture_ref, target, level, true); 10132 texture_manager()->SetLevelCleared(texture_ref, target, level, true);
10100 } 10133 }
10101 10134
10102 if (copyX != x || 10135 if (copyX != x ||
10103 copyY != y || 10136 copyY != y ||
10104 copyWidth != width || 10137 copyWidth != width ||
10105 copyHeight != height) { 10138 copyHeight != height) {
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
10230 TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget( 10263 TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
10231 &state_, target); 10264 &state_, target);
10232 Texture* texture = texture_ref->texture(); 10265 Texture* texture = texture_ref->texture();
10233 GLsizei tex_width = 0; 10266 GLsizei tex_width = 0;
10234 GLsizei tex_height = 0; 10267 GLsizei tex_height = 0;
10235 bool ok = texture->GetLevelSize( 10268 bool ok = texture->GetLevelSize(
10236 target, level, &tex_width, &tex_height, nullptr); 10269 target, level, &tex_width, &tex_height, nullptr);
10237 DCHECK(ok); 10270 DCHECK(ok);
10238 if (xoffset != 0 || yoffset != 0 || 10271 if (xoffset != 0 || yoffset != 0 ||
10239 width != tex_width || height != tex_height) { 10272 width != tex_width || height != tex_height) {
10240 if (!texture_manager()->ClearTextureLevel(this, texture_ref, 10273 gfx::Rect cleared_rect;
10241 target, level)) { 10274 if (CombineAdjacentRects(texture->GetLevelClearedRect(target, level),
10242 LOCAL_SET_GL_ERROR( 10275 gfx::Rect(xoffset, yoffset, width, height),
10243 GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); 10276 &cleared_rect)) {
10244 return error::kNoError; 10277 DCHECK_GE(cleared_rect.size().GetArea(),
10278 texture->GetLevelClearedRect(target, level).size().GetArea());
10279 texture_manager()->SetLevelClearedRect(texture_ref, target, level,
10280 cleared_rect);
10281 } else {
10282 // Otherwise clear part of texture level that is not already cleared.
10283 if (!texture_manager()->ClearTextureLevel(this, texture_ref, target,
10284 level)) {
10285 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glTexSubImage2D",
10286 "dimensions too big");
10287 return error::kNoError;
10288 }
10245 } 10289 }
10246 ScopedTextureUploadTimer timer(&texture_state_); 10290 ScopedTextureUploadTimer timer(&texture_state_);
10247 glTexSubImage2D( 10291 glTexSubImage2D(
10248 target, level, xoffset, yoffset, width, height, format, type, data); 10292 target, level, xoffset, yoffset, width, height, format, type, data);
10249 return error::kNoError; 10293 return error::kNoError;
10250 } 10294 }
10251 10295
10252 if (!texture_state_.texsubimage_faster_than_teximage && 10296 if (!texture_state_.texsubimage_faster_than_teximage &&
10253 !texture->IsImmutable() && 10297 !texture->IsImmutable() &&
10254 !texture->HasImages()) { 10298 !texture->HasImages()) {
(...skipping 1495 matching lines...) Expand 10 before | Expand all | Expand 10 after
11750 plane); 11794 plane);
11751 11795
11752 if (err != kCGLNoError) { 11796 if (err != kCGLNoError) {
11753 LOCAL_SET_GL_ERROR( 11797 LOCAL_SET_GL_ERROR(
11754 GL_INVALID_OPERATION, 11798 GL_INVALID_OPERATION,
11755 "glTexImageIOSurface2DCHROMIUM", "error in CGLTexImageIOSurface2D"); 11799 "glTexImageIOSurface2DCHROMIUM", "error in CGLTexImageIOSurface2D");
11756 return; 11800 return;
11757 } 11801 }
11758 11802
11759 texture_manager()->SetLevelInfo( 11803 texture_manager()->SetLevelInfo(
11760 texture_ref, target, 0, GL_RGBA, width, height, 1, 0, 11804 texture_ref, target, 0, GL_RGBA, width, height, 1, 0, GL_BGRA,
11761 GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, true); 11805 GL_UNSIGNED_INT_8_8_8_8_REV, gfx::Rect(width, height));
11762 11806
11763 #else 11807 #else
11764 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, 11808 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
11765 "glTexImageIOSurface2DCHROMIUM", "not supported."); 11809 "glTexImageIOSurface2DCHROMIUM", "not supported.");
11766 #endif 11810 #endif
11767 } 11811 }
11768 11812
11769 static GLenum ExtractFormatFromStorageFormat(GLenum internalformat) { 11813 static GLenum ExtractFormatFromStorageFormat(GLenum internalformat) {
11770 switch (internalformat) { 11814 switch (internalformat) {
11771 case GL_RGB565: 11815 case GL_RGB565:
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
11974 glTexImage2D(GL_TEXTURE_2D, 0, internal_format, source_width, source_height, 12018 glTexImage2D(GL_TEXTURE_2D, 0, internal_format, source_width, source_height,
11975 0, internal_format, dest_type, NULL); 12019 0, internal_format, dest_type, NULL);
11976 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM"); 12020 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM");
11977 if (error != GL_NO_ERROR) { 12021 if (error != GL_NO_ERROR) {
11978 RestoreCurrentTextureBindings(&state_, GL_TEXTURE_2D); 12022 RestoreCurrentTextureBindings(&state_, GL_TEXTURE_2D);
11979 return; 12023 return;
11980 } 12024 }
11981 12025
11982 texture_manager()->SetLevelInfo( 12026 texture_manager()->SetLevelInfo(
11983 dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width, 12027 dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width,
11984 source_height, 1, 0, internal_format, dest_type, true); 12028 source_height, 1, 0, internal_format, dest_type,
12029 gfx::Rect(source_width, source_height));
11985 } else { 12030 } else {
11986 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, 12031 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0,
11987 true); 12032 true);
11988 } 12033 }
11989 12034
11990 ScopedModifyPixels modify(dest_texture_ref); 12035 ScopedModifyPixels modify(dest_texture_ref);
11991 12036
11992 // Try using GLImage::CopyTexSubImage when possible. 12037 // Try using GLImage::CopyTexSubImage when possible.
11993 bool unpack_premultiply_alpha_change = 12038 bool unpack_premultiply_alpha_change =
11994 unpack_premultiply_alpha_ ^ unpack_unpremultiply_alpha_; 12039 unpack_premultiply_alpha_ ^ unpack_unpremultiply_alpha_;
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
12120 return; 12165 return;
12121 } 12166 }
12122 12167
12123 int dest_width = 0; 12168 int dest_width = 0;
12124 int dest_height = 0; 12169 int dest_height = 0;
12125 bool ok = dest_texture->GetLevelSize( 12170 bool ok = dest_texture->GetLevelSize(
12126 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr); 12171 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr);
12127 DCHECK(ok); 12172 DCHECK(ok);
12128 if (xoffset != 0 || yoffset != 0 || width != dest_width || 12173 if (xoffset != 0 || yoffset != 0 || width != dest_width ||
12129 height != dest_height) { 12174 height != dest_height) {
12130 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target, 12175 gfx::Rect cleared_rect;
12131 0)) { 12176 if (CombineAdjacentRects(dest_texture->GetLevelClearedRect(target, 0),
12132 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM", 12177 gfx::Rect(xoffset, yoffset, width, height),
12133 "destination texture dimensions too big"); 12178 &cleared_rect)) {
12134 return; 12179 DCHECK_GE(cleared_rect.size().GetArea(),
12180 dest_texture->GetLevelClearedRect(target, 0).size().GetArea());
12181 texture_manager()->SetLevelClearedRect(dest_texture_ref, target, 0,
12182 cleared_rect);
12183 } else {
12184 // Otherwise clear part of texture level that is not already cleared.
12185 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target,
12186 0)) {
12187 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM",
12188 "destination texture dimensions too big");
12189 return;
12190 }
12135 } 12191 }
12136 } else { 12192 } else {
12137 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, 12193 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0,
12138 true); 12194 true);
12139 } 12195 }
12140 12196
12141 ScopedModifyPixels modify(dest_texture_ref); 12197 ScopedModifyPixels modify(dest_texture_ref);
12142 12198
12143 // Try using GLImage::CopyTexSubImage when possible. 12199 // Try using GLImage::CopyTexSubImage when possible.
12144 bool unpack_premultiply_alpha_change = 12200 bool unpack_premultiply_alpha_change =
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
12270 } 12326 }
12271 } 12327 }
12272 12328
12273 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glTexStorage2DEXT"); 12329 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glTexStorage2DEXT");
12274 glTexStorage2DEXT(target, levels, internal_format, width, height); 12330 glTexStorage2DEXT(target, levels, internal_format, width, height);
12275 GLenum error = LOCAL_PEEK_GL_ERROR("glTexStorage2DEXT"); 12331 GLenum error = LOCAL_PEEK_GL_ERROR("glTexStorage2DEXT");
12276 if (error == GL_NO_ERROR) { 12332 if (error == GL_NO_ERROR) {
12277 GLsizei level_width = width; 12333 GLsizei level_width = width;
12278 GLsizei level_height = height; 12334 GLsizei level_height = height;
12279 for (int ii = 0; ii < levels; ++ii) { 12335 for (int ii = 0; ii < levels; ++ii) {
12280 texture_manager()->SetLevelInfo( 12336 texture_manager()->SetLevelInfo(texture_ref, target, ii, format,
12281 texture_ref, target, ii, format, 12337 level_width, level_height, 1, 0, format,
12282 level_width, level_height, 1, 0, format, type, false); 12338 type, gfx::Rect());
12283 level_width = std::max(1, level_width >> 1); 12339 level_width = std::max(1, level_width >> 1);
12284 level_height = std::max(1, level_height >> 1); 12340 level_height = std::max(1, level_height >> 1);
12285 } 12341 }
12286 texture->SetImmutable(true); 12342 texture->SetImmutable(true);
12287 } 12343 }
12288 } 12344 }
12289 12345
12290 error::Error GLES2DecoderImpl::HandleGenMailboxCHROMIUM( 12346 error::Error GLES2DecoderImpl::HandleGenMailboxCHROMIUM(
12291 uint32 immediate_data_size, 12347 uint32 immediate_data_size,
12292 const void* cmd_data) { 12348 const void* cmd_data) {
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
12622 if (!gl_image->BindTexImage(target)) { 12678 if (!gl_image->BindTexImage(target)) {
12623 LOCAL_SET_GL_ERROR( 12679 LOCAL_SET_GL_ERROR(
12624 GL_INVALID_OPERATION, 12680 GL_INVALID_OPERATION,
12625 "glBindTexImage2DCHROMIUM", "fail to bind image with the given ID"); 12681 "glBindTexImage2DCHROMIUM", "fail to bind image with the given ID");
12626 return; 12682 return;
12627 } 12683 }
12628 } 12684 }
12629 12685
12630 gfx::Size size = gl_image->GetSize(); 12686 gfx::Size size = gl_image->GetSize();
12631 texture_manager()->SetLevelInfo( 12687 texture_manager()->SetLevelInfo(
12632 texture_ref, target, 0, gl_image->GetInternalFormat(), 12688 texture_ref, target, 0, gl_image->GetInternalFormat(), size.width(),
12633 size.width(), size.height(), 1, 0, 12689 size.height(), 1, 0, gl_image->GetInternalFormat(), GL_UNSIGNED_BYTE,
12634 gl_image->GetInternalFormat(), GL_UNSIGNED_BYTE, true); 12690 gfx::Rect(size));
12635 texture_manager()->SetLevelImage(texture_ref, target, 0, gl_image); 12691 texture_manager()->SetLevelImage(texture_ref, target, 0, gl_image);
12636 } 12692 }
12637 12693
12638 void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM( 12694 void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM(
12639 GLenum target, GLint image_id) { 12695 GLenum target, GLint image_id) {
12640 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM"); 12696 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM");
12641 12697
12642 // Default target might be conceptually valid, but disallow it to avoid 12698 // Default target might be conceptually valid, but disallow it to avoid
12643 // accidents. 12699 // accidents.
12644 TextureRef* texture_ref = 12700 TextureRef* texture_ref =
(...skipping 18 matching lines...) Expand all
12663 return; 12719 return;
12664 12720
12665 { 12721 {
12666 ScopedGLErrorSuppressor suppressor( 12722 ScopedGLErrorSuppressor suppressor(
12667 "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM", GetErrorState()); 12723 "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM", GetErrorState());
12668 gl_image->ReleaseTexImage(target); 12724 gl_image->ReleaseTexImage(target);
12669 } 12725 }
12670 12726
12671 texture_manager()->SetLevelInfo( 12727 texture_manager()->SetLevelInfo(
12672 texture_ref, target, 0, gl_image->GetInternalFormat(), 0, 0, 1, 0, 12728 texture_ref, target, 0, gl_image->GetInternalFormat(), 0, 0, 1, 0,
12673 gl_image->GetInternalFormat(), GL_UNSIGNED_BYTE, false); 12729 gl_image->GetInternalFormat(), GL_UNSIGNED_BYTE, gfx::Rect());
12674 } 12730 }
12675 12731
12676 error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM( 12732 error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM(
12677 uint32 immediate_data_size, 12733 uint32 immediate_data_size,
12678 const void* cmd_data) { 12734 const void* cmd_data) {
12679 const gles2::cmds::TraceBeginCHROMIUM& c = 12735 const gles2::cmds::TraceBeginCHROMIUM& c =
12680 *static_cast<const gles2::cmds::TraceBeginCHROMIUM*>(cmd_data); 12736 *static_cast<const gles2::cmds::TraceBeginCHROMIUM*>(cmd_data);
12681 Bucket* category_bucket = GetBucket(c.category_bucket_id); 12737 Bucket* category_bucket = GetBucket(c.category_bucket_id);
12682 Bucket* name_bucket = GetBucket(c.name_bucket_id); 12738 Bucket* name_bucket = GetBucket(c.name_bucket_id);
12683 if (!category_bucket || category_bucket->size() == 0 || 12739 if (!category_bucket || category_bucket->size() == 0 ||
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after
13310 } 13366 }
13311 } 13367 }
13312 13368
13313 // Include the auto-generated part of this file. We split this because it means 13369 // Include the auto-generated part of this file. We split this because it means
13314 // we can easily edit the non-auto generated parts right here in this file 13370 // we can easily edit the non-auto generated parts right here in this file
13315 // instead of having to edit some template or the code generator. 13371 // instead of having to edit some template or the code generator.
13316 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 13372 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
13317 13373
13318 } // namespace gles2 13374 } // namespace gles2
13319 } // namespace gpu 13375 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_mock.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698