| 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 15260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15271 if (!result) { | 15271 if (!result) { |
| 15272 return error::kOutOfBounds; | 15272 return error::kOutOfBounds; |
| 15273 } | 15273 } |
| 15274 // Check that the client initialized the result. | 15274 // Check that the client initialized the result. |
| 15275 if (result->success != 0) { | 15275 if (result->success != 0) { |
| 15276 return error::kInvalidArguments; | 15276 return error::kInvalidArguments; |
| 15277 } | 15277 } |
| 15278 Program* program = GetProgramInfoNotShader( | 15278 Program* program = GetProgramInfoNotShader( |
| 15279 program_id, "glGetTransformFeedbackVarying"); | 15279 program_id, "glGetTransformFeedbackVarying"); |
| 15280 if (!program) { | 15280 if (!program) { |
| 15281 // An error is already set. |
| 15281 return error::kNoError; | 15282 return error::kNoError; |
| 15282 } | 15283 } |
| 15283 GLuint service_id = program->service_id(); | 15284 GLuint service_id = program->service_id(); |
| 15284 GLint link_status = GL_FALSE; | 15285 GLint link_status = GL_FALSE; |
| 15285 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status); | 15286 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status); |
| 15286 if (link_status != GL_TRUE) { | 15287 if (link_status != GL_TRUE) { |
| 15287 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, | 15288 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, |
| 15288 "glGetTransformFeedbackVarying", "program not linked"); | 15289 "glGetTransformFeedbackVarying", "program not linked"); |
| 15289 return error::kNoError; | 15290 return error::kNoError; |
| 15290 } | 15291 } |
| (...skipping 1916 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17207 | 17208 |
| 17208 GLenum status = glClientWaitSync(service_sync, flags, timeout); | 17209 GLenum status = glClientWaitSync(service_sync, flags, timeout); |
| 17209 switch (status) { | 17210 switch (status) { |
| 17210 case GL_ALREADY_SIGNALED: | 17211 case GL_ALREADY_SIGNALED: |
| 17211 case GL_TIMEOUT_EXPIRED: | 17212 case GL_TIMEOUT_EXPIRED: |
| 17212 case GL_CONDITION_SATISFIED: | 17213 case GL_CONDITION_SATISFIED: |
| 17213 break; | 17214 break; |
| 17214 case GL_WAIT_FAILED: | 17215 case GL_WAIT_FAILED: |
| 17215 // Avoid leaking GL errors when using virtual contexts. | 17216 // Avoid leaking GL errors when using virtual contexts. |
| 17216 LOCAL_PEEK_GL_ERROR(function_name); | 17217 LOCAL_PEEK_GL_ERROR(function_name); |
| 17217 break; | 17218 *result_dst = status; |
| 17219 // If validation is complete, this only happens if the context is lost. |
| 17220 return error::kLostContext; |
| 17218 default: | 17221 default: |
| 17219 NOTREACHED(); | 17222 NOTREACHED(); |
| 17220 break; | 17223 break; |
| 17221 } | 17224 } |
| 17222 *result_dst = status; | 17225 *result_dst = status; |
| 17223 return error::kNoError; | 17226 return error::kNoError; |
| 17224 } | 17227 } |
| 17225 | 17228 |
| 17226 error::Error GLES2DecoderImpl::HandleWaitSync(uint32_t immediate_data_size, | 17229 error::Error GLES2DecoderImpl::HandleWaitSync(uint32_t immediate_data_size, |
| 17227 const volatile void* cmd_data) { | 17230 const volatile void* cmd_data) { |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17382 } | 17385 } |
| 17383 if (*result != 0) { | 17386 if (*result != 0) { |
| 17384 *result = 0; | 17387 *result = 0; |
| 17385 return error::kInvalidArguments; | 17388 return error::kInvalidArguments; |
| 17386 } | 17389 } |
| 17387 if (!validators_->buffer_target.IsValid(target)) { | 17390 if (!validators_->buffer_target.IsValid(target)) { |
| 17388 LOCAL_SET_GL_ERROR_INVALID_ENUM(func_name, target, "target"); | 17391 LOCAL_SET_GL_ERROR_INVALID_ENUM(func_name, target, "target"); |
| 17389 return error::kNoError; | 17392 return error::kNoError; |
| 17390 } | 17393 } |
| 17391 if (size == 0) { | 17394 if (size == 0) { |
| 17392 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, "size is zero"); | 17395 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, "length is zero"); |
| 17393 return error::kNoError; | 17396 return error::kNoError; |
| 17394 } | 17397 } |
| 17395 Buffer* buffer = buffer_manager()->RequestBufferAccess( | 17398 Buffer* buffer = buffer_manager()->RequestBufferAccess( |
| 17396 &state_, target, offset, size, func_name); | 17399 &state_, target, offset, size, func_name); |
| 17397 if (!buffer) { | 17400 if (!buffer) { |
| 17401 // An error is already set. |
| 17398 return error::kNoError; | 17402 return error::kNoError; |
| 17399 } | 17403 } |
| 17400 if (state_.bound_transform_feedback->active() && | 17404 if (state_.bound_transform_feedback->active() && |
| 17401 !state_.bound_transform_feedback->paused()) { | 17405 !state_.bound_transform_feedback->paused()) { |
| 17402 size_t used_binding_count = | 17406 size_t used_binding_count = |
| 17403 state_.current_program->effective_transform_feedback_varyings().size(); | 17407 state_.current_program->effective_transform_feedback_varyings().size(); |
| 17404 if (state_.bound_transform_feedback->UsesBuffer( | 17408 if (state_.bound_transform_feedback->UsesBuffer( |
| 17405 used_binding_count, buffer)) { | 17409 used_binding_count, buffer)) { |
| 17406 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, | 17410 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, |
| 17407 "active transform feedback is using this buffer"); | 17411 "active transform feedback is using this buffer"); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 17418 GL_MAP_WRITE_BIT | | 17422 GL_MAP_WRITE_BIT | |
| 17419 GL_MAP_INVALIDATE_RANGE_BIT | | 17423 GL_MAP_INVALIDATE_RANGE_BIT | |
| 17420 GL_MAP_INVALIDATE_BUFFER_BIT | | 17424 GL_MAP_INVALIDATE_BUFFER_BIT | |
| 17421 GL_MAP_FLUSH_EXPLICIT_BIT | | 17425 GL_MAP_FLUSH_EXPLICIT_BIT | |
| 17422 GL_MAP_UNSYNCHRONIZED_BIT))) { | 17426 GL_MAP_UNSYNCHRONIZED_BIT))) { |
| 17423 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, "invalid access bits"); | 17427 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, "invalid access bits"); |
| 17424 return error::kNoError; | 17428 return error::kNoError; |
| 17425 } | 17429 } |
| 17426 if (!AnyBitsSet(access, GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) { | 17430 if (!AnyBitsSet(access, GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) { |
| 17427 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, | 17431 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, |
| 17428 "neither MAP_READ_BIT nore MAP_WRITE_BIT is set"); | 17432 "neither MAP_READ_BIT nor MAP_WRITE_BIT is set"); |
| 17429 return error::kNoError; | 17433 return error::kNoError; |
| 17430 } | 17434 } |
| 17431 if (AllBitsSet(access, GL_MAP_READ_BIT) && | 17435 if (AllBitsSet(access, GL_MAP_READ_BIT) && |
| 17432 AnyBitsSet(access, (GL_MAP_INVALIDATE_RANGE_BIT | | 17436 AnyBitsSet(access, (GL_MAP_INVALIDATE_RANGE_BIT | |
| 17433 GL_MAP_INVALIDATE_BUFFER_BIT | | 17437 GL_MAP_INVALIDATE_BUFFER_BIT | |
| 17434 GL_MAP_UNSYNCHRONIZED_BIT))) { | 17438 GL_MAP_UNSYNCHRONIZED_BIT))) { |
| 17435 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, | 17439 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, |
| 17436 "Incompatible access bits with MAP_READ_BIT"); | 17440 "incompatible access bits with MAP_READ_BIT"); |
| 17437 return error::kNoError; | 17441 return error::kNoError; |
| 17438 } | 17442 } |
| 17439 if (AllBitsSet(access, GL_MAP_FLUSH_EXPLICIT_BIT) && | 17443 if (AllBitsSet(access, GL_MAP_FLUSH_EXPLICIT_BIT) && |
| 17440 !AllBitsSet(access, GL_MAP_WRITE_BIT)) { | 17444 !AllBitsSet(access, GL_MAP_WRITE_BIT)) { |
| 17441 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, | 17445 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, |
| 17442 "MAP_FLUSH_EXPLICIT_BIT set without MAP_WRITE_BIT"); | 17446 "MAP_FLUSH_EXPLICIT_BIT set without MAP_WRITE_BIT"); |
| 17443 return error::kNoError; | 17447 return error::kNoError; |
| 17444 } | 17448 } |
| 17445 if (AllBitsSet(access, GL_MAP_INVALIDATE_BUFFER_BIT)) { | 17449 if (AllBitsSet(access, GL_MAP_INVALIDATE_BUFFER_BIT)) { |
| 17446 // To be on the safe side, always map GL_MAP_INVALIDATE_BUFFER_BIT to | 17450 // To be on the safe side, always map GL_MAP_INVALIDATE_BUFFER_BIT to |
| 17447 // GL_MAP_INVALIDATE_RANGE_BIT. | 17451 // GL_MAP_INVALIDATE_RANGE_BIT. |
| 17448 access = (access & ~GL_MAP_INVALIDATE_BUFFER_BIT); | 17452 access = (access & ~GL_MAP_INVALIDATE_BUFFER_BIT); |
| 17449 access = (access | GL_MAP_INVALIDATE_RANGE_BIT); | 17453 access = (access | GL_MAP_INVALIDATE_RANGE_BIT); |
| 17450 } | 17454 } |
| 17451 // Always filter out GL_MAP_UNSYNCHRONIZED_BIT to get rid of undefined | 17455 // Always filter out GL_MAP_UNSYNCHRONIZED_BIT to get rid of undefined |
| 17452 // behaviors. | 17456 // behaviors. |
| 17453 access = (access & ~GL_MAP_UNSYNCHRONIZED_BIT); | 17457 access = (access & ~GL_MAP_UNSYNCHRONIZED_BIT); |
| 17454 if (AllBitsSet(access, GL_MAP_WRITE_BIT) && | 17458 if (AllBitsSet(access, GL_MAP_WRITE_BIT) && |
| 17455 !AllBitsSet(access, GL_MAP_INVALIDATE_RANGE_BIT)) { | 17459 !AllBitsSet(access, GL_MAP_INVALIDATE_RANGE_BIT)) { |
| 17456 access = (access | GL_MAP_READ_BIT); | 17460 access = (access | GL_MAP_READ_BIT); |
| 17457 } | 17461 } |
| 17458 void* ptr = glMapBufferRange(target, offset, size, access); | 17462 void* ptr = glMapBufferRange(target, offset, size, access); |
| 17459 if (ptr == nullptr) { | 17463 if (ptr == nullptr) { |
| 17464 // This should mean GL_OUT_OF_MEMORY (or context loss). |
| 17465 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(func_name); |
| 17460 return error::kNoError; | 17466 return error::kNoError; |
| 17461 } | 17467 } |
| 17462 buffer->SetMappedRange(offset, size, access, ptr, | 17468 buffer->SetMappedRange(offset, size, access, ptr, |
| 17463 GetSharedMemoryBuffer(data_shm_id), | 17469 GetSharedMemoryBuffer(data_shm_id), |
| 17464 static_cast<unsigned int>(data_shm_offset)); | 17470 static_cast<unsigned int>(data_shm_offset)); |
| 17465 if ((access & GL_MAP_INVALIDATE_RANGE_BIT) == 0) { | 17471 if ((access & GL_MAP_INVALIDATE_RANGE_BIT) == 0) { |
| 17466 memcpy(mem, ptr, size); | 17472 memcpy(mem, ptr, size); |
| 17467 } | 17473 } |
| 17468 *result = 1; | 17474 *result = 1; |
| 17469 return error::kNoError; | 17475 return error::kNoError; |
| (...skipping 1290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18760 } | 18766 } |
| 18761 | 18767 |
| 18762 // Include the auto-generated part of this file. We split this because it means | 18768 // Include the auto-generated part of this file. We split this because it means |
| 18763 // we can easily edit the non-auto generated parts right here in this file | 18769 // we can easily edit the non-auto generated parts right here in this file |
| 18764 // instead of having to edit some template or the code generator. | 18770 // instead of having to edit some template or the code generator. |
| 18765 #include "base/macros.h" | 18771 #include "base/macros.h" |
| 18766 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 18772 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 18767 | 18773 |
| 18768 } // namespace gles2 | 18774 } // namespace gles2 |
| 18769 } // namespace gpu | 18775 } // namespace gpu |
| OLD | NEW |