Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 6 | 6 |
| 7 #include <limits.h> | 7 #include <limits.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 #include <stdio.h> | 10 #include <stdio.h> |
| (...skipping 1617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1628 void DoRenderbufferStorageMultisampleCHROMIUM( | 1628 void DoRenderbufferStorageMultisampleCHROMIUM( |
| 1629 GLenum target, GLsizei samples, GLenum internalformat, | 1629 GLenum target, GLsizei samples, GLenum internalformat, |
| 1630 GLsizei width, GLsizei height); | 1630 GLsizei width, GLsizei height); |
| 1631 | 1631 |
| 1632 // Handler for glRenderbufferStorageMultisampleEXT | 1632 // Handler for glRenderbufferStorageMultisampleEXT |
| 1633 // (multisampled_render_to_texture). | 1633 // (multisampled_render_to_texture). |
| 1634 void DoRenderbufferStorageMultisampleEXT( | 1634 void DoRenderbufferStorageMultisampleEXT( |
| 1635 GLenum target, GLsizei samples, GLenum internalformat, | 1635 GLenum target, GLsizei samples, GLenum internalformat, |
| 1636 GLsizei width, GLsizei height); | 1636 GLsizei width, GLsizei height); |
| 1637 | 1637 |
| 1638 // Wrapper for glFenceSync. | |
| 1639 GLsync DoFenceSync(GLenum condition, GLbitfield flags); | |
| 1640 | |
| 1638 // Common validation for multisample extensions. | 1641 // Common validation for multisample extensions. |
| 1639 bool ValidateRenderbufferStorageMultisample(GLsizei samples, | 1642 bool ValidateRenderbufferStorageMultisample(GLsizei samples, |
| 1640 GLenum internalformat, | 1643 GLenum internalformat, |
| 1641 GLsizei width, | 1644 GLsizei width, |
| 1642 GLsizei height); | 1645 GLsizei height); |
| 1643 | 1646 |
| 1644 // Verifies that the currently bound multisample renderbuffer is valid | 1647 // Verifies that the currently bound multisample renderbuffer is valid |
| 1645 // Very slow! Only done on platforms with driver bugs that return invalid | 1648 // Very slow! Only done on platforms with driver bugs that return invalid |
| 1646 // buffers under memory pressure | 1649 // buffers under memory pressure |
| 1647 bool VerifyMultisampleRenderbufferIntegrity( | 1650 bool VerifyMultisampleRenderbufferIntegrity( |
| (...skipping 2161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3809 RemoveTransformFeedback(client_ids[ii]); | 3812 RemoveTransformFeedback(client_ids[ii]); |
| 3810 } | 3813 } |
| 3811 } | 3814 } |
| 3812 } | 3815 } |
| 3813 | 3816 |
| 3814 void GLES2DecoderImpl::DeleteSyncHelper(GLuint sync) { | 3817 void GLES2DecoderImpl::DeleteSyncHelper(GLuint sync) { |
| 3815 GLsync service_id = 0; | 3818 GLsync service_id = 0; |
| 3816 if (group_->GetSyncServiceId(sync, &service_id)) { | 3819 if (group_->GetSyncServiceId(sync, &service_id)) { |
| 3817 glDeleteSync(service_id); | 3820 glDeleteSync(service_id); |
| 3818 group_->RemoveSyncId(sync); | 3821 group_->RemoveSyncId(sync); |
| 3819 } else { | 3822 } else if (sync != 0) { |
| 3820 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glDeleteSync", "unknown sync"); | 3823 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glDeleteSync", "unknown sync"); |
| 3821 } | 3824 } |
| 3822 } | 3825 } |
| 3823 | 3826 |
| 3824 bool GLES2DecoderImpl::MakeCurrent() { | 3827 bool GLES2DecoderImpl::MakeCurrent() { |
| 3825 DCHECK(surface_); | 3828 DCHECK(surface_); |
| 3826 if (!context_.get()) | 3829 if (!context_.get()) |
| 3827 return false; | 3830 return false; |
| 3828 | 3831 |
| 3829 if (WasContextLost()) { | 3832 if (WasContextLost()) { |
| (...skipping 11526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15356 if (!program) { | 15359 if (!program) { |
| 15357 return error::kNoError; | 15360 return error::kNoError; |
| 15358 } | 15361 } |
| 15359 GLuint service_id = program->service_id(); | 15362 GLuint service_id = program->service_id(); |
| 15360 glUniformBlockBinding(service_id, index, binding); | 15363 glUniformBlockBinding(service_id, index, binding); |
| 15361 return error::kNoError; | 15364 return error::kNoError; |
| 15362 } | 15365 } |
| 15363 | 15366 |
| 15364 error::Error GLES2DecoderImpl::HandleClientWaitSync( | 15367 error::Error GLES2DecoderImpl::HandleClientWaitSync( |
| 15365 uint32_t immediate_data_size, const void* cmd_data) { | 15368 uint32_t immediate_data_size, const void* cmd_data) { |
| 15369 const char* function_name = "glClientWaitSync"; | |
| 15366 if (!unsafe_es3_apis_enabled()) | 15370 if (!unsafe_es3_apis_enabled()) |
| 15367 return error::kUnknownCommand; | 15371 return error::kUnknownCommand; |
| 15368 const gles2::cmds::ClientWaitSync& c = | 15372 const gles2::cmds::ClientWaitSync& c = |
| 15369 *static_cast<const gles2::cmds::ClientWaitSync*>(cmd_data); | 15373 *static_cast<const gles2::cmds::ClientWaitSync*>(cmd_data); |
| 15370 const GLuint sync = static_cast<GLuint>(c.sync); | 15374 const GLuint sync = static_cast<GLuint>(c.sync); |
| 15371 const GLbitfield flags = static_cast<GLbitfield>(c.flags); | 15375 const GLbitfield flags = static_cast<GLbitfield>(c.flags); |
| 15372 const GLuint64 timeout = c.timeout(); | 15376 const GLuint64 timeout = c.timeout(); |
| 15373 typedef cmds::ClientWaitSync::Result Result; | 15377 typedef cmds::ClientWaitSync::Result Result; |
| 15374 Result* result_dst = GetSharedMemoryAs<Result*>( | 15378 Result* result_dst = GetSharedMemoryAs<Result*>( |
| 15375 c.result_shm_id, c.result_shm_offset, sizeof(*result_dst)); | 15379 c.result_shm_id, c.result_shm_offset, sizeof(*result_dst)); |
| 15376 if (!result_dst) { | 15380 if (!result_dst) { |
| 15377 return error::kOutOfBounds; | 15381 return error::kOutOfBounds; |
| 15378 } | 15382 } |
| 15379 if (*result_dst != GL_WAIT_FAILED) { | 15383 if (*result_dst != GL_WAIT_FAILED) { |
| 15380 return error::kInvalidArguments; | 15384 return error::kInvalidArguments; |
| 15381 } | 15385 } |
| 15382 GLsync service_sync = 0; | 15386 GLsync service_sync = 0; |
| 15383 if (!group_->GetSyncServiceId(sync, &service_sync)) { | 15387 if (!group_->GetSyncServiceId(sync, &service_sync)) { |
| 15384 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "ClientWaitSync", "invalid sync"); | 15388 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "invalid sync"); |
| 15385 return error::kNoError; | 15389 return error::kNoError; |
| 15386 } | 15390 } |
| 15387 *result_dst = glClientWaitSync(service_sync, flags, timeout); | 15391 // Only allow |flags| to be GL_SYNC_FLUSH_COMMANDS_BIT to avoid infinite wait. |
| 15392 if (flags != GL_SYNC_FLUSH_COMMANDS_BIT) { | |
|
piman
2016/06/23 00:58:32
Oh, what I was thinking is, add GL_SYNC_FLUSH_COMM
Zhenyao Mo
2016/06/23 01:07:46
Sounds good. Done.
| |
| 15393 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "invalid flags"); | |
| 15394 return error::kNoError; | |
| 15395 } | |
| 15396 // TODO(zmo): Should we put a limit on |timeout|? | |
| 15397 GLenum status = glClientWaitSync(service_sync, flags, timeout); | |
| 15398 switch (status) { | |
| 15399 case GL_ALREADY_SIGNALED: | |
| 15400 case GL_TIMEOUT_EXPIRED: | |
| 15401 case GL_CONDITION_SATISFIED: | |
| 15402 break; | |
| 15403 case GL_WAIT_FAILED: | |
| 15404 // Avoid leaking GL errors when using virtual contexts. | |
| 15405 LOCAL_PEEK_GL_ERROR(function_name); | |
| 15406 break; | |
| 15407 default: | |
| 15408 NOTREACHED(); | |
| 15409 break; | |
| 15410 } | |
| 15411 *result_dst = status; | |
| 15388 return error::kNoError; | 15412 return error::kNoError; |
| 15389 } | 15413 } |
| 15390 | 15414 |
| 15391 error::Error GLES2DecoderImpl::HandleWaitSync( | 15415 error::Error GLES2DecoderImpl::HandleWaitSync( |
| 15392 uint32_t immediate_data_size, const void* cmd_data) { | 15416 uint32_t immediate_data_size, const void* cmd_data) { |
| 15417 const char* function_name = "glWaitSync"; | |
| 15393 if (!unsafe_es3_apis_enabled()) | 15418 if (!unsafe_es3_apis_enabled()) |
| 15394 return error::kUnknownCommand; | 15419 return error::kUnknownCommand; |
| 15395 const gles2::cmds::WaitSync& c = | 15420 const gles2::cmds::WaitSync& c = |
| 15396 *static_cast<const gles2::cmds::WaitSync*>(cmd_data); | 15421 *static_cast<const gles2::cmds::WaitSync*>(cmd_data); |
| 15397 const GLuint sync = static_cast<GLuint>(c.sync); | 15422 const GLuint sync = static_cast<GLuint>(c.sync); |
| 15398 const GLbitfield flags = static_cast<GLbitfield>(c.flags); | 15423 const GLbitfield flags = static_cast<GLbitfield>(c.flags); |
| 15399 const GLuint64 timeout = c.timeout(); | 15424 const GLuint64 timeout = c.timeout(); |
| 15400 GLsync service_sync = 0; | 15425 GLsync service_sync = 0; |
| 15401 if (!group_->GetSyncServiceId(sync, &service_sync)) { | 15426 if (!group_->GetSyncServiceId(sync, &service_sync)) { |
| 15402 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "WaitSync", "invalid sync"); | 15427 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "invalid sync"); |
| 15428 return error::kNoError; | |
| 15429 } | |
| 15430 if (flags != 0) { | |
| 15431 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "invalid flags"); | |
| 15432 return error::kNoError; | |
| 15433 } | |
| 15434 if (timeout != GL_TIMEOUT_IGNORED) { | |
| 15435 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "invalid timeout"); | |
| 15403 return error::kNoError; | 15436 return error::kNoError; |
| 15404 } | 15437 } |
| 15405 glWaitSync(service_sync, flags, timeout); | 15438 glWaitSync(service_sync, flags, timeout); |
| 15406 return error::kNoError; | 15439 return error::kNoError; |
| 15407 } | 15440 } |
| 15408 | 15441 |
| 15442 GLsync GLES2DecoderImpl::DoFenceSync(GLenum condition, GLbitfield flags) { | |
| 15443 const char* function_name = "glFenceSync"; | |
| 15444 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE) { | |
| 15445 LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, function_name, "invalid condition"); | |
| 15446 return 0; | |
| 15447 } | |
| 15448 if (flags != 0) { | |
| 15449 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "invalid flags"); | |
| 15450 return 0; | |
| 15451 } | |
| 15452 return glFenceSync(condition, flags); | |
| 15453 } | |
| 15454 | |
| 15409 error::Error GLES2DecoderImpl::HandleGetInternalformativ( | 15455 error::Error GLES2DecoderImpl::HandleGetInternalformativ( |
| 15410 uint32_t immediate_data_size, const void* cmd_data) { | 15456 uint32_t immediate_data_size, const void* cmd_data) { |
| 15411 if (!unsafe_es3_apis_enabled()) | 15457 if (!unsafe_es3_apis_enabled()) |
| 15412 return error::kUnknownCommand; | 15458 return error::kUnknownCommand; |
| 15413 const gles2::cmds::GetInternalformativ& c = | 15459 const gles2::cmds::GetInternalformativ& c = |
| 15414 *static_cast<const gles2::cmds::GetInternalformativ*>(cmd_data); | 15460 *static_cast<const gles2::cmds::GetInternalformativ*>(cmd_data); |
| 15415 GLenum target = static_cast<GLenum>(c.target); | 15461 GLenum target = static_cast<GLenum>(c.target); |
| 15416 GLenum format = static_cast<GLenum>(c.format); | 15462 GLenum format = static_cast<GLenum>(c.format); |
| 15417 GLenum pname = static_cast<GLenum>(c.pname); | 15463 GLenum pname = static_cast<GLenum>(c.pname); |
| 15418 if (!validators_->render_buffer_target.IsValid(target)) { | 15464 if (!validators_->render_buffer_target.IsValid(target)) { |
| (...skipping 1369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16788 } | 16834 } |
| 16789 | 16835 |
| 16790 // Include the auto-generated part of this file. We split this because it means | 16836 // Include the auto-generated part of this file. We split this because it means |
| 16791 // we can easily edit the non-auto generated parts right here in this file | 16837 // we can easily edit the non-auto generated parts right here in this file |
| 16792 // instead of having to edit some template or the code generator. | 16838 // instead of having to edit some template or the code generator. |
| 16793 #include "base/macros.h" | 16839 #include "base/macros.h" |
| 16794 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 16840 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 16795 | 16841 |
| 16796 } // namespace gles2 | 16842 } // namespace gles2 |
| 16797 } // namespace gpu | 16843 } // namespace gpu |
| OLD | NEW |