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

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

Issue 2095493002: Improve sync object related command handling. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Improve sync object related command handling. Created 4 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 <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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/build_gles2_cmd_buffer.py ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698