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

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