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 9527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9538 switch (pname) { | 9538 switch (pname) { |
9539 case GL_PACK_ALIGNMENT: | 9539 case GL_PACK_ALIGNMENT: |
9540 case GL_UNPACK_ALIGNMENT: | 9540 case GL_UNPACK_ALIGNMENT: |
9541 if (!validators_->pixel_store_alignment.IsValid(param)) { | 9541 if (!validators_->pixel_store_alignment.IsValid(param)) { |
9542 LOCAL_SET_GL_ERROR( | 9542 LOCAL_SET_GL_ERROR( |
9543 GL_INVALID_VALUE, "glPixelStorei", "invalid param"); | 9543 GL_INVALID_VALUE, "glPixelStorei", "invalid param"); |
9544 return error::kNoError; | 9544 return error::kNoError; |
9545 } | 9545 } |
9546 break; | 9546 break; |
9547 case GL_PACK_ROW_LENGTH: | 9547 case GL_PACK_ROW_LENGTH: |
9548 case GL_PACK_SKIP_PIXELS: | |
9549 case GL_PACK_SKIP_ROWS: | |
9550 case GL_UNPACK_ROW_LENGTH: | 9548 case GL_UNPACK_ROW_LENGTH: |
9551 case GL_UNPACK_IMAGE_HEIGHT: | 9549 case GL_UNPACK_IMAGE_HEIGHT: |
9552 case GL_UNPACK_SKIP_PIXELS: | |
9553 case GL_UNPACK_SKIP_ROWS: | |
9554 case GL_UNPACK_SKIP_IMAGES: | |
9555 if (param < 0) { | 9550 if (param < 0) { |
9556 LOCAL_SET_GL_ERROR( | 9551 LOCAL_SET_GL_ERROR( |
9557 GL_INVALID_VALUE, "glPixelStorei", "invalid param"); | 9552 GL_INVALID_VALUE, "glPixelStorei", "invalid param"); |
9558 return error::kNoError; | 9553 return error::kNoError; |
9559 } | 9554 } |
9555 break; | |
9556 case GL_PACK_SKIP_PIXELS: | |
9557 case GL_PACK_SKIP_ROWS: | |
9558 case GL_UNPACK_SKIP_PIXELS: | |
9559 case GL_UNPACK_SKIP_ROWS: | |
9560 case GL_UNPACK_SKIP_IMAGES: | |
9561 // All SKIP parameters are handled on the client side and should never | |
9562 // be passed to the service side. | |
9563 NOTREACHED(); | |
piman
2016/03/08 01:56:50
nit: no NOTREACHED() since this can be reached by
Zhenyao Mo
2016/03/09 18:41:05
Done.
| |
9564 return error::kInvalidArguments; | |
9560 default: | 9565 default: |
9561 break; | 9566 break; |
9562 } | 9567 } |
9563 // For pack skip parameters, we don't apply them and handle them in command | |
9564 // buffer. | |
9565 // For alignment parameters, we always apply them. | 9568 // For alignment parameters, we always apply them. |
9566 // For other parameters, we don't apply them if no buffer is bound at | 9569 // For other parameters, we don't apply them if no buffer is bound at |
9567 // PIXEL_PACK or PIXEL_UNPACK. We will handle pack and unpack according to | 9570 // PIXEL_PACK or PIXEL_UNPACK. We will handle pack and unpack according to |
9568 // the user specified parameters on the client side. | 9571 // the user specified parameters on the client side. |
9569 switch (pname) { | 9572 switch (pname) { |
9570 case GL_PACK_ROW_LENGTH: | 9573 case GL_PACK_ROW_LENGTH: |
9571 if (state_.bound_pixel_pack_buffer.get()) | 9574 if (state_.bound_pixel_pack_buffer.get()) |
9572 glPixelStorei(pname, param); | 9575 glPixelStorei(pname, param); |
9573 break; | 9576 break; |
9574 case GL_PACK_SKIP_PIXELS: | |
9575 case GL_PACK_SKIP_ROWS: | |
9576 break; | |
9577 case GL_UNPACK_ROW_LENGTH: | 9577 case GL_UNPACK_ROW_LENGTH: |
9578 case GL_UNPACK_IMAGE_HEIGHT: | 9578 case GL_UNPACK_IMAGE_HEIGHT: |
9579 case GL_UNPACK_SKIP_PIXELS: | |
9580 case GL_UNPACK_SKIP_ROWS: | |
9581 case GL_UNPACK_SKIP_IMAGES: | |
9582 if (state_.bound_pixel_unpack_buffer.get()) | 9579 if (state_.bound_pixel_unpack_buffer.get()) |
9583 glPixelStorei(pname, param); | 9580 glPixelStorei(pname, param); |
9584 break; | 9581 break; |
9585 default: | 9582 default: |
9586 glPixelStorei(pname, param); | 9583 glPixelStorei(pname, param); |
9587 break; | 9584 break; |
9588 } | 9585 } |
9589 switch (pname) { | 9586 switch (pname) { |
9590 case GL_PACK_ALIGNMENT: | 9587 case GL_PACK_ALIGNMENT: |
9591 state_.pack_alignment = param; | 9588 state_.pack_alignment = param; |
9592 break; | 9589 break; |
9593 case GL_PACK_ROW_LENGTH: | 9590 case GL_PACK_ROW_LENGTH: |
9594 state_.pack_row_length = param; | 9591 state_.pack_row_length = param; |
9595 break; | 9592 break; |
9596 case GL_PACK_SKIP_PIXELS: | |
9597 state_.pack_skip_pixels = param; | |
9598 break; | |
9599 case GL_PACK_SKIP_ROWS: | |
9600 state_.pack_skip_rows = param; | |
9601 break; | |
9602 case GL_UNPACK_ALIGNMENT: | 9593 case GL_UNPACK_ALIGNMENT: |
9603 state_.unpack_alignment = param; | 9594 state_.unpack_alignment = param; |
9604 break; | 9595 break; |
9605 case GL_UNPACK_ROW_LENGTH: | 9596 case GL_UNPACK_ROW_LENGTH: |
9606 state_.unpack_row_length = param; | 9597 state_.unpack_row_length = param; |
9607 break; | 9598 break; |
9608 case GL_UNPACK_IMAGE_HEIGHT: | 9599 case GL_UNPACK_IMAGE_HEIGHT: |
9609 state_.unpack_image_height = param; | 9600 state_.unpack_image_height = param; |
9610 break; | 9601 break; |
9611 case GL_UNPACK_SKIP_PIXELS: | |
9612 state_.unpack_skip_pixels = param; | |
9613 break; | |
9614 case GL_UNPACK_SKIP_ROWS: | |
9615 state_.unpack_skip_rows = param; | |
9616 break; | |
9617 case GL_UNPACK_SKIP_IMAGES: | |
9618 state_.unpack_skip_images = param; | |
9619 break; | |
9620 default: | 9602 default: |
9621 // Validation should have prevented us from getting here. | 9603 // Validation should have prevented us from getting here. |
9622 NOTREACHED(); | 9604 NOTREACHED(); |
9623 break; | 9605 break; |
9624 } | 9606 } |
9625 return error::kNoError; | 9607 return error::kNoError; |
9626 } | 9608 } |
9627 | 9609 |
9628 error::Error GLES2DecoderImpl::HandlePostSubBufferCHROMIUM( | 9610 error::Error GLES2DecoderImpl::HandlePostSubBufferCHROMIUM( |
9629 uint32_t immediate_data_size, | 9611 uint32_t immediate_data_size, |
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10259 int width, | 10241 int width, |
10260 int height, | 10242 int height, |
10261 int depth) { | 10243 int depth) { |
10262 DCHECK(target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY); | 10244 DCHECK(target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY); |
10263 DCHECK(feature_info_->IsES3Enabled()); | 10245 DCHECK(feature_info_->IsES3Enabled()); |
10264 if (width == 0 || height == 0 || depth == 0) | 10246 if (width == 0 || height == 0 || depth == 0) |
10265 return true; | 10247 return true; |
10266 | 10248 |
10267 uint32_t size; | 10249 uint32_t size; |
10268 uint32_t padded_row_size; | 10250 uint32_t padded_row_size; |
10251 uint32_t padding; | |
10269 // Here we use unpack buffer to upload zeros into the texture, one layer | 10252 // Here we use unpack buffer to upload zeros into the texture, one layer |
10270 // at a time. We haven't applied unpack parameters to GL except alignment. | 10253 // at a time. |
10271 if (!GLES2Util::ComputeImageDataSizes( | 10254 // We only take into consideration UNPACK_ALIGNMENT, and clear other unpack |
10272 width, height, depth, format, type, state_.unpack_alignment, &size, | 10255 // parameters if necessary before TexSubImage3D calls. |
10273 nullptr, &padded_row_size)) { | 10256 PixelStoreParams params; |
10257 params.alignment = state_.unpack_alignment; | |
10258 if (!GLES2Util::ComputeImageDataSizesES3(width, height, depth, | |
10259 format, type, | |
10260 params, | |
10261 &size, | |
10262 nullptr, | |
10263 &padded_row_size, | |
10264 nullptr, | |
10265 &padding)) { | |
10274 return false; | 10266 return false; |
10275 } | 10267 } |
10276 const uint32_t kMaxZeroSize = 1024 * 1024 * 2; | 10268 const uint32_t kMaxZeroSize = 1024 * 1024 * 2; |
10277 uint32_t buffer_size; | 10269 uint32_t buffer_size; |
10278 std::vector<TexSubCoord3D> subs; | 10270 std::vector<TexSubCoord3D> subs; |
10279 if (size < kMaxZeroSize) { | 10271 if (size < kMaxZeroSize) { |
10280 // Case 1: one TexSubImage3D call clears the entire 3D texture. | 10272 // Case 1: one TexSubImage3D call clears the entire 3D texture. |
10281 buffer_size = size; | 10273 buffer_size = size; |
10282 subs.push_back(TexSubCoord3D(0, 0, 0, width, height, depth)); | 10274 subs.push_back(TexSubCoord3D(0, 0, 0, width, height, depth)); |
10283 } else { | 10275 } else { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10325 } | 10317 } |
10326 } | 10318 } |
10327 } | 10319 } |
10328 | 10320 |
10329 TRACE_EVENT1("gpu", "GLES2DecoderImpl::ClearLevel3D", "size", size); | 10321 TRACE_EVENT1("gpu", "GLES2DecoderImpl::ClearLevel3D", "size", size); |
10330 | 10322 |
10331 GLuint buffer_id = 0; | 10323 GLuint buffer_id = 0; |
10332 glGenBuffersARB(1, &buffer_id); | 10324 glGenBuffersARB(1, &buffer_id); |
10333 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer_id); | 10325 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer_id); |
10334 { | 10326 { |
10327 // Include padding as some drivers incorrectly requires padding for the | |
10328 // last row. | |
10329 buffer_size += padding; | |
10330 // Buffer size needs to be a multiple of type bytes. | |
10331 size_t type_bytes = GLES2Util::GetGLTypeSizeForTextures(type); | |
10332 size_t residual = buffer_size % type_bytes; | |
10333 if (residual != 0) { | |
10334 buffer_size += type_bytes - residual; | |
10335 } | |
10336 DCHECK(buffer_size % type_bytes == 0); | |
10335 scoped_ptr<char[]> zero(new char[buffer_size]); | 10337 scoped_ptr<char[]> zero(new char[buffer_size]); |
10336 memset(zero.get(), 0, buffer_size); | 10338 memset(zero.get(), 0, buffer_size); |
10337 // TODO(zmo): Consider glMapBufferRange instead. | 10339 // TODO(zmo): Consider glMapBufferRange instead. |
10338 glBufferData( | 10340 glBufferData( |
10339 GL_PIXEL_UNPACK_BUFFER, buffer_size, zero.get(), GL_STATIC_DRAW); | 10341 GL_PIXEL_UNPACK_BUFFER, buffer_size, zero.get(), GL_STATIC_DRAW); |
10340 } | 10342 } |
10341 | 10343 |
10344 Buffer* bound_buffer = buffer_manager()->GetBufferInfoForTarget( | |
10345 &state_, GL_PIXEL_UNPACK_BUFFER); | |
10346 if (bound_buffer) { | |
10347 // If an unpack buffer is bound, we need to clear unpack parameters | |
10348 // because they have been applied to the driver. | |
10349 if (state_.unpack_row_length > 0) | |
10350 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); | |
10351 if (state_.unpack_image_height > 0) | |
10352 glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0); | |
10353 DCHECK_EQ(0, state_.unpack_skip_pixels); | |
10354 DCHECK_EQ(0, state_.unpack_skip_rows); | |
10355 DCHECK_EQ(0, state_.unpack_skip_images); | |
10356 } | |
10357 | |
10342 glBindTexture(texture->target(), texture->service_id()); | 10358 glBindTexture(texture->target(), texture->service_id()); |
10343 | 10359 |
10344 for (size_t ii = 0; ii < subs.size(); ++ii) { | 10360 for (size_t ii = 0; ii < subs.size(); ++ii) { |
10345 glTexSubImage3D(target, level, subs[ii].xoffset, subs[ii].yoffset, | 10361 glTexSubImage3D(target, level, subs[ii].xoffset, subs[ii].yoffset, |
10346 subs[ii].zoffset, subs[ii].width, subs[ii].height, | 10362 subs[ii].zoffset, subs[ii].width, subs[ii].height, |
10347 subs[ii].depth, format, type, nullptr); | 10363 subs[ii].depth, format, type, nullptr); |
10348 } | 10364 } |
10349 | 10365 |
10350 Buffer* bound_buffer = buffer_manager()->GetBufferInfoForTarget( | 10366 if (bound_buffer) { |
10351 &state_, GL_PIXEL_UNPACK_BUFFER); | 10367 if (state_.unpack_row_length > 0) |
10368 glPixelStorei(GL_UNPACK_ROW_LENGTH, state_.unpack_row_length); | |
10369 if (state_.unpack_image_height > 0) | |
10370 glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, state_.unpack_image_height); | |
10371 } | |
10372 | |
10352 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, | 10373 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, |
10353 bound_buffer ? bound_buffer->service_id() : 0); | 10374 bound_buffer ? bound_buffer->service_id() : 0); |
10354 glDeleteBuffersARB(1, &buffer_id); | 10375 glDeleteBuffersARB(1, &buffer_id); |
10355 | 10376 |
10356 TextureRef* bound_texture = | 10377 TextureRef* bound_texture = |
10357 texture_manager()->GetTextureInfoForTarget(&state_, texture->target()); | 10378 texture_manager()->GetTextureInfoForTarget(&state_, texture->target()); |
10358 glBindTexture(texture->target(), | 10379 glBindTexture(texture->target(), |
10359 bound_texture ? bound_texture->service_id() : 0); | 10380 bound_texture ? bound_texture->service_id() : 0); |
10360 return true; | 10381 return true; |
10361 } | 10382 } |
(...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11222 GLenum target = static_cast<GLenum>(c.target); | 11243 GLenum target = static_cast<GLenum>(c.target); |
11223 GLint level = static_cast<GLint>(c.level); | 11244 GLint level = static_cast<GLint>(c.level); |
11224 GLint internal_format = static_cast<GLint>(c.internalformat); | 11245 GLint internal_format = static_cast<GLint>(c.internalformat); |
11225 GLsizei width = static_cast<GLsizei>(c.width); | 11246 GLsizei width = static_cast<GLsizei>(c.width); |
11226 GLsizei height = static_cast<GLsizei>(c.height); | 11247 GLsizei height = static_cast<GLsizei>(c.height); |
11227 GLint border = static_cast<GLint>(c.border); | 11248 GLint border = static_cast<GLint>(c.border); |
11228 GLenum format = static_cast<GLenum>(c.format); | 11249 GLenum format = static_cast<GLenum>(c.format); |
11229 GLenum type = static_cast<GLenum>(c.type); | 11250 GLenum type = static_cast<GLenum>(c.type); |
11230 uint32_t pixels_shm_id = static_cast<uint32_t>(c.pixels_shm_id); | 11251 uint32_t pixels_shm_id = static_cast<uint32_t>(c.pixels_shm_id); |
11231 uint32_t pixels_shm_offset = static_cast<uint32_t>(c.pixels_shm_offset); | 11252 uint32_t pixels_shm_offset = static_cast<uint32_t>(c.pixels_shm_offset); |
11232 uint32_t pixels_size; | 11253 |
11233 if (!GLES2Util::ComputeImageDataSizes( | 11254 if (width < 0 || height < 0) { |
11234 width, height, 1, format, type, state_.unpack_alignment, &pixels_size, | 11255 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexImage2D", "dimensions < 0"); |
11235 NULL, NULL)) { | 11256 return error::kNoError; |
11257 } | |
11258 uint32_t pixels_size = 0; | |
11259 uint32_t skip_size = 0; | |
11260 bool no_pixels = false; | |
11261 PixelStoreParams params; | |
11262 if (state_.bound_pixel_unpack_buffer.get()) { | |
11263 DCHECK_EQ(0u, pixels_shm_id); | |
piman
2016/03/08 01:56:50
Is this DCHECK valid? We can't trust the client. W
Zhenyao Mo
2016/03/09 18:41:05
Done.
| |
11264 params = state_.GetUnpackParams(ContextState::k2D); | |
11265 } else { | |
11266 if (pixels_shm_id) { | |
11267 // When reading from client buffer, the command buffer client side took | |
11268 // the responsibility to take the pixels from the client buffer and | |
11269 // unpack them according to the full ES3 pack parameters as source, all | |
11270 // parameters for 0 (except for alignment) as destination mem for the | |
11271 // service side. | |
11272 params.alignment = state_.unpack_alignment; | |
11273 } else { | |
11274 DCHECK_EQ(0u, pixels_shm_offset); | |
piman
2016/03/08 01:56:50
Same here.
Zhenyao Mo
2016/03/09 18:41:05
Done.
| |
11275 no_pixels = true; | |
11276 } | |
11277 } | |
11278 if (!no_pixels && | |
11279 !GLES2Util::ComputeImageDataSizesES3(width, height, 1, | |
11280 format, type, | |
11281 params, | |
11282 &pixels_size, | |
11283 nullptr, | |
11284 nullptr, | |
11285 &skip_size, | |
11286 nullptr)) { | |
11236 return error::kOutOfBounds; | 11287 return error::kOutOfBounds; |
11237 } | 11288 } |
11238 const void* pixels = NULL; | 11289 DCHECK_EQ(0u, skip_size); |
11239 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { | 11290 |
11291 const void* pixels = nullptr; | |
11292 if (pixels_shm_id) { | |
11240 pixels = GetSharedMemoryAs<const void*>( | 11293 pixels = GetSharedMemoryAs<const void*>( |
11241 pixels_shm_id, pixels_shm_offset, pixels_size); | 11294 pixels_shm_id, pixels_shm_offset, pixels_size); |
11242 if (!pixels) { | 11295 if (!pixels) { |
11243 return error::kOutOfBounds; | 11296 return error::kOutOfBounds; |
11244 } | 11297 } |
11298 } else { | |
11299 pixels = reinterpret_cast<const void*>(pixels_shm_offset); | |
11245 } | 11300 } |
11246 | 11301 |
11247 // For testing only. Allows us to stress the ability to respond to OOM errors. | 11302 // For testing only. Allows us to stress the ability to respond to OOM errors. |
11248 if (workarounds().simulate_out_of_memory_on_large_textures && | 11303 if (workarounds().simulate_out_of_memory_on_large_textures && |
11249 (width * height >= 4096 * 4096)) { | 11304 (width * height >= 4096 * 4096)) { |
11250 LOCAL_SET_GL_ERROR( | 11305 LOCAL_SET_GL_ERROR( |
11251 GL_OUT_OF_MEMORY, | 11306 GL_OUT_OF_MEMORY, |
11252 "glTexImage2D", "synthetic out of memory"); | 11307 "glTexImage2D", "synthetic out of memory"); |
11253 return error::kNoError; | 11308 return error::kNoError; |
11254 } | 11309 } |
(...skipping 25 matching lines...) Expand all Loading... | |
11280 GLint level = static_cast<GLint>(c.level); | 11335 GLint level = static_cast<GLint>(c.level); |
11281 GLint internal_format = static_cast<GLint>(c.internalformat); | 11336 GLint internal_format = static_cast<GLint>(c.internalformat); |
11282 GLsizei width = static_cast<GLsizei>(c.width); | 11337 GLsizei width = static_cast<GLsizei>(c.width); |
11283 GLsizei height = static_cast<GLsizei>(c.height); | 11338 GLsizei height = static_cast<GLsizei>(c.height); |
11284 GLsizei depth = static_cast<GLsizei>(c.depth); | 11339 GLsizei depth = static_cast<GLsizei>(c.depth); |
11285 GLint border = static_cast<GLint>(c.border); | 11340 GLint border = static_cast<GLint>(c.border); |
11286 GLenum format = static_cast<GLenum>(c.format); | 11341 GLenum format = static_cast<GLenum>(c.format); |
11287 GLenum type = static_cast<GLenum>(c.type); | 11342 GLenum type = static_cast<GLenum>(c.type); |
11288 uint32_t pixels_shm_id = static_cast<uint32_t>(c.pixels_shm_id); | 11343 uint32_t pixels_shm_id = static_cast<uint32_t>(c.pixels_shm_id); |
11289 uint32_t pixels_shm_offset = static_cast<uint32_t>(c.pixels_shm_offset); | 11344 uint32_t pixels_shm_offset = static_cast<uint32_t>(c.pixels_shm_offset); |
11290 uint32_t pixels_size; | 11345 |
11291 if (!GLES2Util::ComputeImageDataSizes( | 11346 if (width < 0 || height < 0 || depth < 0) { |
11292 width, height, depth, format, type, state_.unpack_alignment, &pixels_size, | 11347 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexImage3D", "dimensions < 0"); |
11293 NULL, NULL)) { | 11348 return error::kNoError; |
11349 } | |
11350 | |
11351 uint32_t pixels_size = 0; | |
11352 uint32_t skip_size = 0; | |
11353 bool no_pixels = false; | |
11354 PixelStoreParams params; | |
11355 if (state_.bound_pixel_unpack_buffer.get()) { | |
11356 DCHECK_EQ(0u, pixels_shm_id); | |
piman
2016/03/08 01:56:50
Same as above.
Zhenyao Mo
2016/03/09 18:41:05
Done.
| |
11357 params = state_.GetUnpackParams(ContextState::k3D); | |
11358 } else { | |
11359 if (pixels_shm_id) { | |
11360 // When reading from client buffer, the command buffer client side took | |
11361 // the responsibility to take the pixels from the client buffer and | |
11362 // unpack them according to the full ES3 pack parameters as source, all | |
11363 // parameters for 0 (except for alignment) as destination mem for the | |
11364 // service side. | |
11365 params.alignment = state_.unpack_alignment; | |
11366 } else { | |
11367 DCHECK_EQ(0u, pixels_shm_offset); | |
piman
2016/03/08 01:56:50
And here.
Zhenyao Mo
2016/03/09 18:41:05
Done.
| |
11368 no_pixels = true; | |
11369 } | |
11370 } | |
11371 if (!no_pixels && | |
11372 !GLES2Util::ComputeImageDataSizesES3(width, height, depth, | |
11373 format, type, | |
11374 params, | |
11375 &pixels_size, | |
11376 nullptr, | |
11377 nullptr, | |
11378 &skip_size, | |
11379 nullptr)) { | |
11294 return error::kOutOfBounds; | 11380 return error::kOutOfBounds; |
11295 } | 11381 } |
11296 const void* pixels = NULL; | 11382 DCHECK_EQ(0u, skip_size); |
11297 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { | 11383 |
11384 const void* pixels = nullptr; | |
11385 if (pixels_shm_id) { | |
11298 pixels = GetSharedMemoryAs<const void*>( | 11386 pixels = GetSharedMemoryAs<const void*>( |
11299 pixels_shm_id, pixels_shm_offset, pixels_size); | 11387 pixels_shm_id, pixels_shm_offset, pixels_size); |
11300 if (!pixels) { | 11388 if (!pixels) { |
11301 return error::kOutOfBounds; | 11389 return error::kOutOfBounds; |
11302 } | 11390 } |
11391 } else { | |
11392 pixels = reinterpret_cast<const void*>(pixels_shm_offset); | |
11303 } | 11393 } |
11304 | 11394 |
11305 // For testing only. Allows us to stress the ability to respond to OOM errors. | 11395 // For testing only. Allows us to stress the ability to respond to OOM errors. |
11306 if (workarounds().simulate_out_of_memory_on_large_textures && | 11396 if (workarounds().simulate_out_of_memory_on_large_textures && |
11307 (width * height * depth >= 4096 * 4096)) { | 11397 (width * height * depth >= 4096 * 4096)) { |
11308 LOCAL_SET_GL_ERROR( | 11398 LOCAL_SET_GL_ERROR( |
11309 GL_OUT_OF_MEMORY, | 11399 GL_OUT_OF_MEMORY, |
11310 "glTexImage3D", "synthetic out of memory"); | 11400 "glTexImage3D", "synthetic out of memory"); |
11311 return error::kNoError; | 11401 return error::kNoError; |
11312 } | 11402 } |
11313 | 11403 |
11314 TextureManager::DoTexImageArguments args = { | 11404 TextureManager::DoTexImageArguments args = { |
11315 target, level, internal_format, width, height, depth, border, format, type, | 11405 target, level, internal_format, width, height, depth, border, format, type, |
11316 pixels, pixels_size, TextureManager::DoTexImageArguments::kTexImage3D }; | 11406 pixels, pixels_size, TextureManager::DoTexImageArguments::kTexImage3D }; |
11317 texture_manager()->ValidateAndDoTexImage( | 11407 texture_manager()->ValidateAndDoTexImage( |
11318 &texture_state_, &state_, &framebuffer_state_, "glTexImage3D", args); | 11408 &texture_state_, &state_, &framebuffer_state_, "glTexImage3D", args); |
11319 | 11409 |
11320 // This may be a slow command. Exit command processing to allow for | 11410 // This may be a slow command. Exit command processing to allow for |
11321 // context preemption and GPU watchdog checks. | 11411 // context preemption and GPU watchdog checks. |
11322 ExitCommandProcessingEarly(); | 11412 ExitCommandProcessingEarly(); |
11323 return error::kNoError; | 11413 return error::kNoError; |
11324 } | 11414 } |
11325 | 11415 |
11326 void GLES2DecoderImpl::DoCompressedTexSubImage2D( | 11416 void GLES2DecoderImpl::DoCompressedTexSubImage2D( |
11327 GLenum target, | 11417 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, |
11328 GLint level, | 11418 GLsizei height, GLenum format, GLsizei image_size, const void * data) { |
11329 GLint xoffset, | |
11330 GLint yoffset, | |
11331 GLsizei width, | |
11332 GLsizei height, | |
11333 GLenum format, | |
11334 GLsizei image_size, | |
11335 const void * data) { | |
11336 TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget( | 11419 TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget( |
11337 &state_, target); | 11420 &state_, target); |
11338 if (!texture_ref) { | 11421 if (!texture_ref) { |
11339 LOCAL_SET_GL_ERROR( | 11422 LOCAL_SET_GL_ERROR( |
11340 GL_INVALID_OPERATION, | 11423 GL_INVALID_OPERATION, |
11341 "glCompressedTexSubImage2D", "unknown texture for target"); | 11424 "glCompressedTexSubImage2D", "unknown texture for target"); |
11342 return; | 11425 return; |
11343 } | 11426 } |
11344 Texture* texture = texture_ref->texture(); | 11427 Texture* texture = texture_ref->texture(); |
11345 GLenum type = 0; | 11428 GLenum type = 0; |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11672 return error::kNoError; | 11755 return error::kNoError; |
11673 | 11756 |
11674 GLenum target = static_cast<GLenum>(c.target); | 11757 GLenum target = static_cast<GLenum>(c.target); |
11675 GLint level = static_cast<GLint>(c.level); | 11758 GLint level = static_cast<GLint>(c.level); |
11676 GLint xoffset = static_cast<GLint>(c.xoffset); | 11759 GLint xoffset = static_cast<GLint>(c.xoffset); |
11677 GLint yoffset = static_cast<GLint>(c.yoffset); | 11760 GLint yoffset = static_cast<GLint>(c.yoffset); |
11678 GLsizei width = static_cast<GLsizei>(c.width); | 11761 GLsizei width = static_cast<GLsizei>(c.width); |
11679 GLsizei height = static_cast<GLsizei>(c.height); | 11762 GLsizei height = static_cast<GLsizei>(c.height); |
11680 GLenum format = static_cast<GLenum>(c.format); | 11763 GLenum format = static_cast<GLenum>(c.format); |
11681 GLenum type = static_cast<GLenum>(c.type); | 11764 GLenum type = static_cast<GLenum>(c.type); |
11682 uint32_t data_size; | 11765 uint32_t pixels_shm_id = static_cast<uint32_t>(c.pixels_shm_id); |
11683 if (!GLES2Util::ComputeImageDataSizes( | 11766 uint32_t pixels_shm_offset = static_cast<uint32_t>(c.pixels_shm_offset); |
11684 width, height, 1, format, type, state_.unpack_alignment, &data_size, | 11767 |
11685 NULL, NULL)) { | 11768 if (width < 0 || height < 0) { |
11769 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexSubImage2D", "dimensions < 0"); | |
11770 return error::kNoError; | |
11771 } | |
11772 PixelStoreParams params; | |
11773 if (state_.bound_pixel_unpack_buffer.get()) { | |
11774 params = state_.GetUnpackParams(ContextState::k2D); | |
11775 } else { | |
11776 // When reading from client buffer, the command buffer client side took | |
11777 // the responsibility to take the pixels from the client buffer and | |
11778 // unpack them according to the full ES3 pack parameters as source, all | |
11779 // parameters for 0 (except for alignment) as destination mem for the | |
11780 // service side. | |
11781 params.alignment = state_.unpack_alignment; | |
11782 } | |
11783 uint32_t pixels_size; | |
11784 uint32_t skip_size; | |
11785 if (!GLES2Util::ComputeImageDataSizesES3(width, height, 1, | |
11786 format, type, | |
11787 params, | |
11788 &pixels_size, | |
11789 nullptr, | |
11790 nullptr, | |
11791 &skip_size, | |
11792 nullptr)) { | |
11686 return error::kOutOfBounds; | 11793 return error::kOutOfBounds; |
11687 } | 11794 } |
11795 DCHECK_EQ(0u, skip_size); | |
11688 | 11796 |
11689 const void* pixels = GetSharedMemoryAs<const void*>( | 11797 const void* pixels; |
11690 c.pixels_shm_id, c.pixels_shm_offset, data_size); | 11798 if (state_.bound_pixel_unpack_buffer.get()) { |
11691 if (!pixels) | 11799 if (pixels_shm_id != 0) |
11692 return error::kOutOfBounds; | 11800 return error::kInvalidArguments; |
11801 pixels = reinterpret_cast<const void*>(pixels_shm_offset); | |
11802 } else { | |
11803 if (pixels_size > 0) { | |
11804 if (pixels_shm_id == 0) | |
11805 return error::kInvalidArguments; | |
11806 pixels = GetSharedMemoryAs<const void*>( | |
11807 pixels_shm_id, pixels_shm_offset, pixels_size); | |
11808 if (!pixels) | |
11809 return error::kOutOfBounds; | |
11810 } else { | |
11811 pixels = nullptr; | |
11812 } | |
11813 } | |
11693 | 11814 |
11694 TextureManager::DoTexSubImageArguments args = { | 11815 TextureManager::DoTexSubImageArguments args = { |
11695 target, level, xoffset, yoffset, 0, width, height, 1, | 11816 target, level, xoffset, yoffset, 0, width, height, 1, |
11696 format, type, pixels, data_size, | 11817 format, type, pixels, pixels_size, |
11697 TextureManager::DoTexSubImageArguments::kTexSubImage2D}; | 11818 TextureManager::DoTexSubImageArguments::kTexSubImage2D}; |
11698 texture_manager()->ValidateAndDoTexSubImage(this, &texture_state_, &state_, | 11819 texture_manager()->ValidateAndDoTexSubImage(this, &texture_state_, &state_, |
11699 &framebuffer_state_, | 11820 &framebuffer_state_, |
11700 "glTexSubImage2D", args); | 11821 "glTexSubImage2D", args); |
11701 | 11822 |
11702 // This may be a slow command. Exit command processing to allow for | 11823 // This may be a slow command. Exit command processing to allow for |
11703 // context preemption and GPU watchdog checks. | 11824 // context preemption and GPU watchdog checks. |
11704 ExitCommandProcessingEarly(); | 11825 ExitCommandProcessingEarly(); |
11705 return error::kNoError; | 11826 return error::kNoError; |
11706 } | 11827 } |
(...skipping 14 matching lines...) Expand all Loading... | |
11721 GLenum target = static_cast<GLenum>(c.target); | 11842 GLenum target = static_cast<GLenum>(c.target); |
11722 GLint level = static_cast<GLint>(c.level); | 11843 GLint level = static_cast<GLint>(c.level); |
11723 GLint xoffset = static_cast<GLint>(c.xoffset); | 11844 GLint xoffset = static_cast<GLint>(c.xoffset); |
11724 GLint yoffset = static_cast<GLint>(c.yoffset); | 11845 GLint yoffset = static_cast<GLint>(c.yoffset); |
11725 GLint zoffset = static_cast<GLint>(c.zoffset); | 11846 GLint zoffset = static_cast<GLint>(c.zoffset); |
11726 GLsizei width = static_cast<GLsizei>(c.width); | 11847 GLsizei width = static_cast<GLsizei>(c.width); |
11727 GLsizei height = static_cast<GLsizei>(c.height); | 11848 GLsizei height = static_cast<GLsizei>(c.height); |
11728 GLsizei depth = static_cast<GLsizei>(c.depth); | 11849 GLsizei depth = static_cast<GLsizei>(c.depth); |
11729 GLenum format = static_cast<GLenum>(c.format); | 11850 GLenum format = static_cast<GLenum>(c.format); |
11730 GLenum type = static_cast<GLenum>(c.type); | 11851 GLenum type = static_cast<GLenum>(c.type); |
11731 uint32_t data_size; | 11852 uint32_t pixels_shm_id = static_cast<uint32_t>(c.pixels_shm_id); |
11732 if (!GLES2Util::ComputeImageDataSizes( | 11853 uint32_t pixels_shm_offset = static_cast<uint32_t>(c.pixels_shm_offset); |
11733 width, height, depth, format, type, state_.unpack_alignment, &data_size, | 11854 |
11734 NULL, NULL)) { | 11855 if (width < 0 || height < 0 || depth < 0) { |
11856 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexSubImage3D", "dimensions < 0"); | |
11857 return error::kNoError; | |
11858 } | |
11859 PixelStoreParams params; | |
11860 if (state_.bound_pixel_unpack_buffer.get()) { | |
11861 params = state_.GetUnpackParams(ContextState::k3D); | |
11862 } else { | |
11863 // When reading from client buffer, the command buffer client side took | |
11864 // the responsibility to take the pixels from the client buffer and | |
11865 // unpack them according to the full ES3 pack parameters as source, all | |
11866 // parameters for 0 (except for alignment) as destination mem for the | |
11867 // service side. | |
11868 params.alignment = state_.unpack_alignment; | |
11869 } | |
11870 uint32_t pixels_size; | |
11871 uint32_t skip_size; | |
11872 if (!GLES2Util::ComputeImageDataSizesES3(width, height, depth, | |
11873 format, type, | |
11874 params, | |
11875 &pixels_size, | |
11876 nullptr, | |
11877 nullptr, | |
11878 &skip_size, | |
11879 nullptr)) { | |
11735 return error::kOutOfBounds; | 11880 return error::kOutOfBounds; |
11736 } | 11881 } |
11882 DCHECK_EQ(0u, skip_size); | |
11737 | 11883 |
11738 const void* pixels = GetSharedMemoryAs<const void*>( | 11884 const void* pixels; |
11739 c.pixels_shm_id, c.pixels_shm_offset, data_size); | 11885 if (state_.bound_pixel_unpack_buffer.get()) { |
11740 if (!pixels) | 11886 if (pixels_shm_id != 0) |
11741 return error::kOutOfBounds; | 11887 return error::kInvalidArguments; |
11888 pixels = reinterpret_cast<const void*>(pixels_shm_offset); | |
11889 } else { | |
11890 if (pixels_size > 0) { | |
11891 if (pixels_shm_id == 0) | |
11892 return error::kInvalidArguments; | |
11893 pixels = GetSharedMemoryAs<const void*>( | |
11894 pixels_shm_id, pixels_shm_offset, pixels_size); | |
11895 if (!pixels) | |
11896 return error::kOutOfBounds; | |
11897 } else { | |
11898 pixels = nullptr; | |
11899 } | |
11900 } | |
11742 | 11901 |
11743 TextureManager::DoTexSubImageArguments args = { | 11902 TextureManager::DoTexSubImageArguments args = { |
11744 target, level, xoffset, yoffset, zoffset, width, height, depth, | 11903 target, level, xoffset, yoffset, zoffset, width, height, depth, |
11745 format, type, pixels, data_size, | 11904 format, type, pixels, pixels_size, |
11746 TextureManager::DoTexSubImageArguments::kTexSubImage3D}; | 11905 TextureManager::DoTexSubImageArguments::kTexSubImage3D}; |
11747 texture_manager()->ValidateAndDoTexSubImage(this, &texture_state_, &state_, | 11906 texture_manager()->ValidateAndDoTexSubImage(this, &texture_state_, &state_, |
11748 &framebuffer_state_, | 11907 &framebuffer_state_, |
11749 "glTexSubImage3D", args); | 11908 "glTexSubImage3D", args); |
11750 | 11909 |
11751 // This may be a slow command. Exit command processing to allow for | 11910 // This may be a slow command. Exit command processing to allow for |
11752 // context preemption and GPU watchdog checks. | 11911 // context preemption and GPU watchdog checks. |
11753 ExitCommandProcessingEarly(); | 11912 ExitCommandProcessingEarly(); |
11754 return error::kNoError; | 11913 return error::kNoError; |
11755 } | 11914 } |
(...skipping 4194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
15950 } | 16109 } |
15951 | 16110 |
15952 // Include the auto-generated part of this file. We split this because it means | 16111 // Include the auto-generated part of this file. We split this because it means |
15953 // we can easily edit the non-auto generated parts right here in this file | 16112 // we can easily edit the non-auto generated parts right here in this file |
15954 // instead of having to edit some template or the code generator. | 16113 // instead of having to edit some template or the code generator. |
15955 #include "base/macros.h" | 16114 #include "base/macros.h" |
15956 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 16115 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
15957 | 16116 |
15958 } // namespace gles2 | 16117 } // namespace gles2 |
15959 } // namespace gpu | 16118 } // namespace gpu |
OLD | NEW |