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

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 if ((flags & ~GL_SYNC_FLUSH_COMMANDS_BIT) != 0) {
15392 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "invalid flags");
15393 return error::kNoError;
15394 }
piman 2016/06/23 00:09:34 Should we force GL_SYNC_FLUSH_COMMANDS_BIT? Otherw
Zhenyao Mo 2016/06/23 00:22:33 I thought about this, but didn't do it because I a
15395 GLenum status = glClientWaitSync(service_sync, flags, timeout);
15396 switch (status) {
15397 case GL_ALREADY_SIGNALED:
15398 case GL_TIMEOUT_EXPIRED:
15399 case GL_CONDITION_SATISFIED:
15400 break;
15401 case GL_WAIT_FAILED:
15402 // Avoid leaking GL errors when using virtual contexts.
15403 LOCAL_PEEK_GL_ERROR(function_name);
15404 break;
15405 default:
15406 NOTREACHED();
15407 break;
15408 }
15409 *result_dst = status;
15388 return error::kNoError; 15410 return error::kNoError;
15389 } 15411 }
15390 15412
15391 error::Error GLES2DecoderImpl::HandleWaitSync( 15413 error::Error GLES2DecoderImpl::HandleWaitSync(
15392 uint32_t immediate_data_size, const void* cmd_data) { 15414 uint32_t immediate_data_size, const void* cmd_data) {
15415 const char* function_name = "glWaitSync";
15393 if (!unsafe_es3_apis_enabled()) 15416 if (!unsafe_es3_apis_enabled())
15394 return error::kUnknownCommand; 15417 return error::kUnknownCommand;
15395 const gles2::cmds::WaitSync& c = 15418 const gles2::cmds::WaitSync& c =
15396 *static_cast<const gles2::cmds::WaitSync*>(cmd_data); 15419 *static_cast<const gles2::cmds::WaitSync*>(cmd_data);
15397 const GLuint sync = static_cast<GLuint>(c.sync); 15420 const GLuint sync = static_cast<GLuint>(c.sync);
15398 const GLbitfield flags = static_cast<GLbitfield>(c.flags); 15421 const GLbitfield flags = static_cast<GLbitfield>(c.flags);
15399 const GLuint64 timeout = c.timeout(); 15422 const GLuint64 timeout = c.timeout();
15400 GLsync service_sync = 0; 15423 GLsync service_sync = 0;
15401 if (!group_->GetSyncServiceId(sync, &service_sync)) { 15424 if (!group_->GetSyncServiceId(sync, &service_sync)) {
15402 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "WaitSync", "invalid sync"); 15425 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "invalid sync");
15426 return error::kNoError;
15427 }
15428 if (flags != 0) {
15429 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "invalid flags");
15430 return error::kNoError;
15431 }
15432 if (timeout != GL_TIMEOUT_IGNORED) {
15433 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "invalid timeout");
15403 return error::kNoError; 15434 return error::kNoError;
15404 } 15435 }
15405 glWaitSync(service_sync, flags, timeout); 15436 glWaitSync(service_sync, flags, timeout);
15406 return error::kNoError; 15437 return error::kNoError;
15407 } 15438 }
15408 15439
15440 GLsync GLES2DecoderImpl::DoFenceSync(GLenum condition, GLbitfield flags) {
15441 const char* function_name = "glFenceSync";
15442 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE) {
15443 LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, function_name, "invalid condition");
15444 return 0;
15445 }
15446 if (flags != 0) {
15447 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "invalid flags");
15448 return 0;
15449 }
15450 return glFenceSync(condition, flags);
15451 }
15452
15409 error::Error GLES2DecoderImpl::HandleGetInternalformativ( 15453 error::Error GLES2DecoderImpl::HandleGetInternalformativ(
15410 uint32_t immediate_data_size, const void* cmd_data) { 15454 uint32_t immediate_data_size, const void* cmd_data) {
15411 if (!unsafe_es3_apis_enabled()) 15455 if (!unsafe_es3_apis_enabled())
15412 return error::kUnknownCommand; 15456 return error::kUnknownCommand;
15413 const gles2::cmds::GetInternalformativ& c = 15457 const gles2::cmds::GetInternalformativ& c =
15414 *static_cast<const gles2::cmds::GetInternalformativ*>(cmd_data); 15458 *static_cast<const gles2::cmds::GetInternalformativ*>(cmd_data);
15415 GLenum target = static_cast<GLenum>(c.target); 15459 GLenum target = static_cast<GLenum>(c.target);
15416 GLenum format = static_cast<GLenum>(c.format); 15460 GLenum format = static_cast<GLenum>(c.format);
15417 GLenum pname = static_cast<GLenum>(c.pname); 15461 GLenum pname = static_cast<GLenum>(c.pname);
15418 if (!validators_->render_buffer_target.IsValid(target)) { 15462 if (!validators_->render_buffer_target.IsValid(target)) {
(...skipping 1369 matching lines...) Expand 10 before | Expand all | Expand 10 after
16788 } 16832 }
16789 16833
16790 // Include the auto-generated part of this file. We split this because it means 16834 // 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 16835 // 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. 16836 // instead of having to edit some template or the code generator.
16793 #include "base/macros.h" 16837 #include "base/macros.h"
16794 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 16838 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
16795 16839
16796 } // namespace gles2 16840 } // namespace gles2
16797 } // namespace gpu 16841 } // 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