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

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

Issue 558513003: command_buffer: Batch command processing to reduce handler overheads. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix a bad return in DoCommand(). Created 6 years, 3 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 <stdio.h> 7 #include <stdio.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <list> 10 #include <list>
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 public ErrorStateClient { 565 public ErrorStateClient {
566 public: 566 public:
567 explicit GLES2DecoderImpl(ContextGroup* group); 567 explicit GLES2DecoderImpl(ContextGroup* group);
568 virtual ~GLES2DecoderImpl(); 568 virtual ~GLES2DecoderImpl();
569 569
570 // Overridden from AsyncAPIInterface. 570 // Overridden from AsyncAPIInterface.
571 virtual Error DoCommand(unsigned int command, 571 virtual Error DoCommand(unsigned int command,
572 unsigned int arg_count, 572 unsigned int arg_count,
573 const void* args) OVERRIDE; 573 const void* args) OVERRIDE;
574 574
575 virtual error::Error DoCommands(unsigned int num_commands,
576 const void* buffer,
577 int num_entries,
578 int* entries_processed) OVERRIDE;
579
575 // Overridden from AsyncAPIInterface. 580 // Overridden from AsyncAPIInterface.
576 virtual const char* GetCommandName(unsigned int command_id) const OVERRIDE; 581 virtual const char* GetCommandName(unsigned int command_id) const OVERRIDE;
577 582
578 // Overridden from GLES2Decoder. 583 // Overridden from GLES2Decoder.
579 virtual bool Initialize(const scoped_refptr<gfx::GLSurface>& surface, 584 virtual bool Initialize(const scoped_refptr<gfx::GLSurface>& surface,
580 const scoped_refptr<gfx::GLContext>& context, 585 const scoped_refptr<gfx::GLContext>& context,
581 bool offscreen, 586 bool offscreen,
582 const gfx::Size& size, 587 const gfx::Size& size,
583 const DisallowedFeatures& disallowed_features, 588 const DisallowedFeatures& disallowed_features,
584 const std::vector<int32>& attribs) OVERRIDE; 589 const std::vector<int32>& attribs) OVERRIDE;
(...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after
1632 error::Error WillAccessBoundFramebufferForRead() { 1637 error::Error WillAccessBoundFramebufferForRead() {
1633 if (ShouldDeferReads()) 1638 if (ShouldDeferReads())
1634 return error::kDeferCommandUntilLater; 1639 return error::kDeferCommandUntilLater;
1635 if (!offscreen_target_frame_buffer_.get() && 1640 if (!offscreen_target_frame_buffer_.get() &&
1636 !framebuffer_state_.bound_read_framebuffer.get() && 1641 !framebuffer_state_.bound_read_framebuffer.get() &&
1637 !surface_->SetBackbufferAllocation(true)) 1642 !surface_->SetBackbufferAllocation(true))
1638 return error::kLostContext; 1643 return error::kLostContext;
1639 return error::kNoError; 1644 return error::kNoError;
1640 } 1645 }
1641 1646
1647 // Set remaining commands to process to 0 to force DoCommands to return
1648 // and allow context preemption and GPU watchdog checks in GpuScheduler().
1649 void ExitCommandProcessingEarly() { commands_to_process_ = 0; }
1650
1642 void ProcessPendingReadPixels(); 1651 void ProcessPendingReadPixels();
1643 void FinishReadPixels(const cmds::ReadPixels& c, GLuint buffer); 1652 void FinishReadPixels(const cmds::ReadPixels& c, GLuint buffer);
1644 1653
1645 // Generate a member function prototype for each command in an automated and 1654 // Generate a member function prototype for each command in an automated and
1646 // typesafe way. 1655 // typesafe way.
1647 #define GLES2_CMD_OP(name) \ 1656 #define GLES2_CMD_OP(name) \
1648 Error Handle##name(uint32 immediate_data_size, const void* data); 1657 Error Handle##name(uint32 immediate_data_size, const void* data);
1649 1658
1650 GLES2_COMMAND_LIST(GLES2_CMD_OP) 1659 GLES2_COMMAND_LIST(GLES2_CMD_OP)
1651 1660
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1753 scoped_refptr<ShaderTranslator> fragment_translator_; 1762 scoped_refptr<ShaderTranslator> fragment_translator_;
1754 1763
1755 DisallowedFeatures disallowed_features_; 1764 DisallowedFeatures disallowed_features_;
1756 1765
1757 // Cached from ContextGroup 1766 // Cached from ContextGroup
1758 const Validators* validators_; 1767 const Validators* validators_;
1759 scoped_refptr<FeatureInfo> feature_info_; 1768 scoped_refptr<FeatureInfo> feature_info_;
1760 1769
1761 int frame_number_; 1770 int frame_number_;
1762 1771
1772 // Number of commands remaining to be processed in DoCommands().
1773 int commands_to_process_;
1774
1763 bool has_robustness_extension_; 1775 bool has_robustness_extension_;
1764 GLenum reset_status_; 1776 GLenum reset_status_;
1765 bool reset_by_robustness_extension_; 1777 bool reset_by_robustness_extension_;
1766 bool supports_post_sub_buffer_; 1778 bool supports_post_sub_buffer_;
1767 1779
1768 // These flags are used to override the state of the shared feature_info_ 1780 // These flags are used to override the state of the shared feature_info_
1769 // member. Because the same FeatureInfo instance may be shared among many 1781 // member. Because the same FeatureInfo instance may be shared among many
1770 // contexts, the assumptions on the availablity of extensions in WebGL 1782 // contexts, the assumptions on the availablity of extensions in WebGL
1771 // contexts may be broken. These flags override the shared state to preserve 1783 // contexts may be broken. These flags override the shared state to preserve
1772 // WebGL semantics. 1784 // WebGL semantics.
(...skipping 1968 matching lines...) Expand 10 before | Expand all | Expand 10 after
3741 return error::kNoError; 3753 return error::kNoError;
3742 } 3754 }
3743 3755
3744 const char* GLES2DecoderImpl::GetCommandName(unsigned int command_id) const { 3756 const char* GLES2DecoderImpl::GetCommandName(unsigned int command_id) const {
3745 if (command_id > kStartPoint && command_id < kNumCommands) { 3757 if (command_id > kStartPoint && command_id < kNumCommands) {
3746 return gles2::GetCommandName(static_cast<CommandId>(command_id)); 3758 return gles2::GetCommandName(static_cast<CommandId>(command_id));
3747 } 3759 }
3748 return GetCommonCommandName(static_cast<cmd::CommandId>(command_id)); 3760 return GetCommonCommandName(static_cast<cmd::CommandId>(command_id));
3749 } 3761 }
3750 3762
3751 // Decode command with its arguments, and call the corresponding GL function. 3763 // Decode a command, and call the corresponding GL functions.
3752 // Note: args is a pointer to the command buffer. As such, it could be changed 3764 // NOTE: DoCommand() is slower than calling DoCommands() on larger batches
3753 // by a (malicious) client at any time, so if validation has to happen, it 3765 // of commands at once, and is now only used for tests that need to track
3754 // should operate on a copy of them. 3766 // individual commands.
3755 error::Error GLES2DecoderImpl::DoCommand( 3767 error::Error GLES2DecoderImpl::DoCommand(unsigned int command,
3756 unsigned int command, 3768 unsigned int arg_count,
3757 unsigned int arg_count, 3769 const void* cmd_data) {
3758 const void* cmd_data) { 3770 return DoCommands(1, cmd_data, arg_count + 1, 0);
3771 }
3772
3773 // Decode multiple commands, and call the corresponding GL functions.
3774 // NOTE: 'buffer' is a pointer to the command buffer. As such, it could be
3775 // changed by a (malicious) client at any time, so if validation has to happen,
3776 // it should operate on a copy of them.
3777 // NOTE: This is duplicating code from AsyncAPIInterface::DoCommands() in the
3778 // interest of performance in this critical execution loop.
3779 error::Error GLES2DecoderImpl::DoCommands(unsigned int num_commands,
3780 const void* buffer,
3781 int num_entries,
3782 int* entries_processed) {
3783 commands_to_process_ = num_commands;
3759 error::Error result = error::kNoError; 3784 error::Error result = error::kNoError;
3760 if (log_commands()) { 3785 const CommandBufferEntry* cmd_data =
3761 // TODO(notme): Change this to a LOG/VLOG that works in release. Tried 3786 static_cast<const CommandBufferEntry*>(buffer);
3762 // VLOG(1), no luck. 3787 int process_pos = 0;
3763 LOG(ERROR) << "[" << logger_.GetLogPrefix() << "]" << "cmd: " 3788
3764 << GetCommandName(command); 3789 while (process_pos < num_entries && result == error::kNoError &&
3790 commands_to_process_--) {
3791 CommandHeader header = cmd_data->value_header;
3792 if (header.size == 0) {
piman 2014/09/09 00:59:01 nit: It was already before, but it's easier to see
vmiura 2014/09/09 01:38:56 Done.
3793 DVLOG(1) << "Error: zero sized command in command buffer";
3794 if (entries_processed)
3795 *entries_processed = process_pos;
3796 return error::kInvalidSize;
3797 }
3798
3799 if (static_cast<int>(header.size) + process_pos > num_entries) {
3800 DVLOG(1) << "Error: get offset out of bounds";
3801 if (entries_processed)
3802 *entries_processed = process_pos;
3803 return error::kOutOfBounds;
3804 }
3805
3806 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cb_command"),
3807 GetCommandName(header.command));
3808
3809 {
piman 2014/09/09 00:59:01 nit: do you need this scope? I don't think you're
vmiura 2014/09/09 01:38:56 Done.
3810 const unsigned int command = header.command;
3811 const unsigned int arg_count = header.size - 1;
3812
3813 if (log_commands()) {
3814 // TODO(notme): Change this to a LOG/VLOG that works in release. Tried
3815 // VLOG(1), no luck.
3816 LOG(ERROR) << "[" << logger_.GetLogPrefix() << "]"
3817 << "cmd: " << GetCommandName(command);
3818 }
3819 unsigned int command_index = command - kStartPoint - 1;
3820 if (command_index < arraysize(command_info)) {
3821 const CommandInfo& info = command_info[command_index];
3822 unsigned int info_arg_count = static_cast<unsigned int>(info.arg_count);
3823 if ((info.arg_flags == cmd::kFixed && arg_count == info_arg_count) ||
3824 (info.arg_flags == cmd::kAtLeastN && arg_count >= info_arg_count)) {
3825 bool doing_gpu_trace = false;
3826 if (gpu_trace_commands_) {
3827 if (CMD_FLAG_GET_TRACE_LEVEL(info.cmd_flags) <= gpu_trace_level_) {
3828 doing_gpu_trace = true;
3829 gpu_tracer_->Begin(GetCommandName(command), kTraceDecoder);
3830 }
3831 }
3832
3833 uint32 immediate_data_size = (arg_count - info_arg_count) *
3834 sizeof(CommandBufferEntry); // NOLINT
3835
3836 result = (this->*info.cmd_handler)(immediate_data_size, cmd_data);
3837
3838 if (doing_gpu_trace)
3839 gpu_tracer_->End(kTraceDecoder);
3840
3841 if (debug()) {
3842 GLenum error;
3843 while ((error = glGetError()) != GL_NO_ERROR) {
3844 LOG(ERROR) << "[" << logger_.GetLogPrefix() << "] "
3845 << "GL ERROR: " << GLES2Util::GetStringEnum(error)
3846 << " : " << GetCommandName(command);
3847 LOCAL_SET_GL_ERROR(error, "DoCommand", "GL error from driver");
3848 }
3849 }
3850 } else {
3851 result = error::kInvalidArguments;
3852 }
3853 } else {
3854 result = DoCommonCommand(command, arg_count, cmd_data);
3855 }
3856 if (result == error::kNoError &&
3857 current_decoder_error_ != error::kNoError) {
3858 result = current_decoder_error_;
3859 current_decoder_error_ = error::kNoError;
3860 }
3861 }
3862
3863 if (result != error::kDeferCommandUntilLater) {
3864 process_pos += header.size;
3865 cmd_data += header.size;
3866 }
3765 } 3867 }
3766 unsigned int command_index = command - kStartPoint - 1;
3767 if (command_index < arraysize(command_info)) {
3768 const CommandInfo& info = command_info[command_index];
3769 unsigned int info_arg_count = static_cast<unsigned int>(info.arg_count);
3770 if ((info.arg_flags == cmd::kFixed && arg_count == info_arg_count) ||
3771 (info.arg_flags == cmd::kAtLeastN && arg_count >= info_arg_count)) {
3772 bool doing_gpu_trace = false;
3773 if (gpu_trace_commands_) {
3774 if (CMD_FLAG_GET_TRACE_LEVEL(info.cmd_flags) <= gpu_trace_level_) {
3775 doing_gpu_trace = true;
3776 gpu_tracer_->Begin(GetCommandName(command), kTraceDecoder);
3777 }
3778 }
3779 3868
3780 uint32 immediate_data_size = 3869 if (entries_processed)
3781 (arg_count - info_arg_count) * sizeof(CommandBufferEntry); // NOLINT 3870 *entries_processed = process_pos;
3782 3871
3783 result = (this->*info.cmd_handler)(immediate_data_size, cmd_data);
3784
3785 if (doing_gpu_trace)
3786 gpu_tracer_->End(kTraceDecoder);
3787
3788 if (debug()) {
3789 GLenum error;
3790 while ((error = glGetError()) != GL_NO_ERROR) {
3791 LOG(ERROR) << "[" << logger_.GetLogPrefix() << "] "
3792 << "GL ERROR: " << GLES2Util::GetStringEnum(error) << " : "
3793 << GetCommandName(command);
3794 LOCAL_SET_GL_ERROR(error, "DoCommand", "GL error from driver");
3795 }
3796 }
3797 } else {
3798 result = error::kInvalidArguments;
3799 }
3800 } else {
3801 result = DoCommonCommand(command, arg_count, cmd_data);
3802 }
3803 if (result == error::kNoError && current_decoder_error_ != error::kNoError) {
3804 result = current_decoder_error_;
3805 current_decoder_error_ = error::kNoError;
3806 }
3807 return result; 3872 return result;
3808 } 3873 }
3809 3874
3810 void GLES2DecoderImpl::RemoveBuffer(GLuint client_id) { 3875 void GLES2DecoderImpl::RemoveBuffer(GLuint client_id) {
3811 buffer_manager()->RemoveBuffer(client_id); 3876 buffer_manager()->RemoveBuffer(client_id);
3812 } 3877 }
3813 3878
3814 bool GLES2DecoderImpl::CreateProgramHelper(GLuint client_id) { 3879 bool GLES2DecoderImpl::CreateProgramHelper(GLuint client_id) {
3815 if (GetProgram(client_id)) { 3880 if (GetProgram(client_id)) {
3816 return false; 3881 return false;
(...skipping 1874 matching lines...) Expand 10 before | Expand all | Expand 10 after
5691 workarounds().count_all_in_varyings_packing ? 5756 workarounds().count_all_in_varyings_packing ?
5692 Program::kCountAll : Program::kCountOnlyStaticallyUsed, 5757 Program::kCountAll : Program::kCountOnlyStaticallyUsed,
5693 shader_cache_callback_)) { 5758 shader_cache_callback_)) {
5694 if (program == state_.current_program.get()) { 5759 if (program == state_.current_program.get()) {
5695 if (workarounds().use_current_program_after_successful_link) 5760 if (workarounds().use_current_program_after_successful_link)
5696 glUseProgram(program->service_id()); 5761 glUseProgram(program->service_id());
5697 if (workarounds().clear_uniforms_before_first_program_use) 5762 if (workarounds().clear_uniforms_before_first_program_use)
5698 program_manager()->ClearUniforms(program); 5763 program_manager()->ClearUniforms(program);
5699 } 5764 }
5700 } 5765 }
5766
5767 // LinkProgram can be very slow. Exit command processing to allow for
5768 // context preemption and GPU watchdog checks.
5769 ExitCommandProcessingEarly();
5701 }; 5770 };
5702 5771
5703 void GLES2DecoderImpl::DoTexParameterf( 5772 void GLES2DecoderImpl::DoTexParameterf(
5704 GLenum target, GLenum pname, GLfloat param) { 5773 GLenum target, GLenum pname, GLfloat param) {
5705 TextureRef* texture = texture_manager()->GetTextureInfoForTarget( 5774 TextureRef* texture = texture_manager()->GetTextureInfoForTarget(
5706 &state_, target); 5775 &state_, target);
5707 if (!texture) { 5776 if (!texture) {
5708 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexParameterf", "unknown texture"); 5777 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexParameterf", "unknown texture");
5709 return; 5778 return;
5710 } 5779 }
(...skipping 1108 matching lines...) Expand 10 before | Expand all | Expand 10 after
6819 if (use_shader_translator_) { 6888 if (use_shader_translator_) {
6820 translator = shader->shader_type() == GL_VERTEX_SHADER ? 6889 translator = shader->shader_type() == GL_VERTEX_SHADER ?
6821 vertex_translator_.get() : fragment_translator_.get(); 6890 vertex_translator_.get() : fragment_translator_.get();
6822 } 6891 }
6823 6892
6824 program_manager()->DoCompileShader( 6893 program_manager()->DoCompileShader(
6825 shader, 6894 shader,
6826 translator, 6895 translator,
6827 feature_info_->feature_flags().angle_translated_shader_source ? 6896 feature_info_->feature_flags().angle_translated_shader_source ?
6828 ProgramManager::kANGLE : ProgramManager::kGL); 6897 ProgramManager::kANGLE : ProgramManager::kGL);
6829 }; 6898
6899 // CompileShader can be very slow. Exit command processing to allow for
6900 // context preemption and GPU watchdog checks.
6901 ExitCommandProcessingEarly();
6902 }
6830 6903
6831 void GLES2DecoderImpl::DoGetShaderiv( 6904 void GLES2DecoderImpl::DoGetShaderiv(
6832 GLuint shader_id, GLenum pname, GLint* params) { 6905 GLuint shader_id, GLenum pname, GLint* params) {
6833 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderiv"); 6906 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderiv");
6834 if (!shader) { 6907 if (!shader) {
6835 return; 6908 return;
6836 } 6909 }
6837 switch (pname) { 6910 switch (pname) {
6838 case GL_SHADER_SOURCE_LENGTH: 6911 case GL_SHADER_SOURCE_LENGTH:
6839 *params = shader->source() ? shader->source()->size() + 1 : 0; 6912 *params = shader->source() ? shader->source()->size() + 1 : 0;
(...skipping 1478 matching lines...) Expand 10 before | Expand all | Expand 10 after
8318 } 8391 }
8319 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage2D"); 8392 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage2D");
8320 glCompressedTexImage2D( 8393 glCompressedTexImage2D(
8321 target, level, internal_format, width, height, border, image_size, data); 8394 target, level, internal_format, width, height, border, image_size, data);
8322 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage2D"); 8395 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage2D");
8323 if (error == GL_NO_ERROR) { 8396 if (error == GL_NO_ERROR) {
8324 texture_manager()->SetLevelInfo( 8397 texture_manager()->SetLevelInfo(
8325 texture_ref, target, level, internal_format, 8398 texture_ref, target, level, internal_format,
8326 width, height, 1, border, 0, 0, true); 8399 width, height, 1, border, 0, 0, true);
8327 } 8400 }
8401
8402 // This may be a slow command. Exit command processing to allow for
8403 // context preemption and GPU watchdog checks.
8404 ExitCommandProcessingEarly();
8328 return error::kNoError; 8405 return error::kNoError;
8329 } 8406 }
8330 8407
8331 error::Error GLES2DecoderImpl::HandleCompressedTexImage2D( 8408 error::Error GLES2DecoderImpl::HandleCompressedTexImage2D(
8332 uint32 immediate_data_size, 8409 uint32 immediate_data_size,
8333 const void* cmd_data) { 8410 const void* cmd_data) {
8334 const gles2::cmds::CompressedTexImage2D& c = 8411 const gles2::cmds::CompressedTexImage2D& c =
8335 *static_cast<const gles2::cmds::CompressedTexImage2D*>(cmd_data); 8412 *static_cast<const gles2::cmds::CompressedTexImage2D*>(cmd_data);
8336 GLenum target = static_cast<GLenum>(c.target); 8413 GLenum target = static_cast<GLenum>(c.target);
8337 GLint level = static_cast<GLint>(c.level); 8414 GLint level = static_cast<GLint>(c.level);
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
8465 if (!pixels) { 8542 if (!pixels) {
8466 return error::kOutOfBounds; 8543 return error::kOutOfBounds;
8467 } 8544 }
8468 } 8545 }
8469 8546
8470 TextureManager::DoTextImage2DArguments args = { 8547 TextureManager::DoTextImage2DArguments args = {
8471 target, level, internal_format, width, height, border, format, type, 8548 target, level, internal_format, width, height, border, format, type,
8472 pixels, pixels_size}; 8549 pixels, pixels_size};
8473 texture_manager()->ValidateAndDoTexImage2D( 8550 texture_manager()->ValidateAndDoTexImage2D(
8474 &texture_state_, &state_, &framebuffer_state_, args); 8551 &texture_state_, &state_, &framebuffer_state_, args);
8552
8553 // This may be a slow command. Exit command processing to allow for
8554 // context preemption and GPU watchdog checks.
8555 ExitCommandProcessingEarly();
8475 return error::kNoError; 8556 return error::kNoError;
8476 } 8557 }
8477 8558
8478 void GLES2DecoderImpl::DoCompressedTexSubImage2D( 8559 void GLES2DecoderImpl::DoCompressedTexSubImage2D(
8479 GLenum target, 8560 GLenum target,
8480 GLint level, 8561 GLint level,
8481 GLint xoffset, 8562 GLint xoffset,
8482 GLint yoffset, 8563 GLint yoffset,
8483 GLsizei width, 8564 GLsizei width,
8484 GLsizei height, 8565 GLsizei height,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
8523 return; 8604 return;
8524 } 8605 }
8525 8606
8526 8607
8527 // Note: There is no need to deal with texture cleared tracking here 8608 // Note: There is no need to deal with texture cleared tracking here
8528 // because the validation above means you can only get here if the level 8609 // because the validation above means you can only get here if the level
8529 // is already a matching compressed format and in that case 8610 // is already a matching compressed format and in that case
8530 // CompressedTexImage2D already cleared the texture. 8611 // CompressedTexImage2D already cleared the texture.
8531 glCompressedTexSubImage2D( 8612 glCompressedTexSubImage2D(
8532 target, level, xoffset, yoffset, width, height, format, image_size, data); 8613 target, level, xoffset, yoffset, width, height, format, image_size, data);
8614
8615 // This may be a slow command. Exit command processing to allow for
8616 // context preemption and GPU watchdog checks.
8617 ExitCommandProcessingEarly();
8533 } 8618 }
8534 8619
8535 static void Clip( 8620 static void Clip(
8536 GLint start, GLint range, GLint sourceRange, 8621 GLint start, GLint range, GLint sourceRange,
8537 GLint* out_start, GLint* out_range) { 8622 GLint* out_start, GLint* out_range) {
8538 DCHECK(out_start); 8623 DCHECK(out_start);
8539 DCHECK(out_range); 8624 DCHECK(out_range);
8540 if (start < 0) { 8625 if (start < 0) {
8541 range += start; 8626 range += start;
8542 start = 0; 8627 start = 0;
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
8668 ScopedModifyPixels modify(texture_ref); 8753 ScopedModifyPixels modify(texture_ref);
8669 glCopyTexImage2D(target, level, internal_format, 8754 glCopyTexImage2D(target, level, internal_format,
8670 copyX, copyY, copyWidth, copyHeight, border); 8755 copyX, copyY, copyWidth, copyHeight, border);
8671 } 8756 }
8672 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTexImage2D"); 8757 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTexImage2D");
8673 if (error == GL_NO_ERROR) { 8758 if (error == GL_NO_ERROR) {
8674 texture_manager()->SetLevelInfo( 8759 texture_manager()->SetLevelInfo(
8675 texture_ref, target, level, internal_format, width, height, 1, 8760 texture_ref, target, level, internal_format, width, height, 1,
8676 border, internal_format, GL_UNSIGNED_BYTE, true); 8761 border, internal_format, GL_UNSIGNED_BYTE, true);
8677 } 8762 }
8763
8764 // This may be a slow command. Exit command processing to allow for
8765 // context preemption and GPU watchdog checks.
8766 ExitCommandProcessingEarly();
8678 } 8767 }
8679 8768
8680 void GLES2DecoderImpl::DoCopyTexSubImage2D( 8769 void GLES2DecoderImpl::DoCopyTexSubImage2D(
8681 GLenum target, 8770 GLenum target,
8682 GLint level, 8771 GLint level,
8683 GLint xoffset, 8772 GLint xoffset,
8684 GLint yoffset, 8773 GLint yoffset,
8685 GLint x, 8774 GLint x,
8686 GLint y, 8775 GLint y,
8687 GLsizei width, 8776 GLsizei width,
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
8778 if (copyHeight > 0 && copyWidth > 0) { 8867 if (copyHeight > 0 && copyWidth > 0) {
8779 GLint dx = copyX - x; 8868 GLint dx = copyX - x;
8780 GLint dy = copyY - y; 8869 GLint dy = copyY - y;
8781 GLint destX = xoffset + dx; 8870 GLint destX = xoffset + dx;
8782 GLint destY = yoffset + dy; 8871 GLint destY = yoffset + dy;
8783 ScopedModifyPixels modify(texture_ref); 8872 ScopedModifyPixels modify(texture_ref);
8784 glCopyTexSubImage2D(target, level, 8873 glCopyTexSubImage2D(target, level,
8785 destX, destY, copyX, copyY, 8874 destX, destY, copyX, copyY,
8786 copyWidth, copyHeight); 8875 copyWidth, copyHeight);
8787 } 8876 }
8877
8878 // This may be a slow command. Exit command processing to allow for
8879 // context preemption and GPU watchdog checks.
8880 ExitCommandProcessingEarly();
8788 } 8881 }
8789 8882
8790 bool GLES2DecoderImpl::ValidateTexSubImage2D( 8883 bool GLES2DecoderImpl::ValidateTexSubImage2D(
8791 error::Error* error, 8884 error::Error* error,
8792 const char* function_name, 8885 const char* function_name,
8793 GLenum target, 8886 GLenum target,
8794 GLint level, 8887 GLint level,
8795 GLint xoffset, 8888 GLint xoffset,
8796 GLint yoffset, 8889 GLint yoffset,
8797 GLsizei width, 8890 GLsizei width,
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
8908 // NOTE: In OpenGL ES 2.0 border is always zero. If that changes we'll need 9001 // NOTE: In OpenGL ES 2.0 border is always zero. If that changes we'll need
8909 // to look it up. 9002 // to look it up.
8910 glTexImage2D( 9003 glTexImage2D(
8911 target, level, internal_format, width, height, 0, format, type, data); 9004 target, level, internal_format, width, height, 0, format, type, data);
8912 } else { 9005 } else {
8913 ScopedTextureUploadTimer timer(&texture_state_); 9006 ScopedTextureUploadTimer timer(&texture_state_);
8914 glTexSubImage2D( 9007 glTexSubImage2D(
8915 target, level, xoffset, yoffset, width, height, format, type, data); 9008 target, level, xoffset, yoffset, width, height, format, type, data);
8916 } 9009 }
8917 texture_manager()->SetLevelCleared(texture_ref, target, level, true); 9010 texture_manager()->SetLevelCleared(texture_ref, target, level, true);
9011
9012 // This may be a slow command. Exit command processing to allow for
9013 // context preemption and GPU watchdog checks.
9014 ExitCommandProcessingEarly();
8918 return error::kNoError; 9015 return error::kNoError;
8919 } 9016 }
8920 9017
8921 error::Error GLES2DecoderImpl::HandleTexSubImage2D(uint32 immediate_data_size, 9018 error::Error GLES2DecoderImpl::HandleTexSubImage2D(uint32 immediate_data_size,
8922 const void* cmd_data) { 9019 const void* cmd_data) {
8923 const gles2::cmds::TexSubImage2D& c = 9020 const gles2::cmds::TexSubImage2D& c =
8924 *static_cast<const gles2::cmds::TexSubImage2D*>(cmd_data); 9021 *static_cast<const gles2::cmds::TexSubImage2D*>(cmd_data);
8925 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexSubImage2D", 9022 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexSubImage2D",
8926 "width", c.width, "height", c.height); 9023 "width", c.width, "height", c.height);
8927 GLboolean internal = static_cast<GLboolean>(c.internal); 9024 GLboolean internal = static_cast<GLboolean>(c.internal);
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
9394 // single D3D device for all contexts. 9491 // single D3D device for all contexts.
9395 if (!feature_info_->feature_flags().is_angle) 9492 if (!feature_info_->feature_flags().is_angle)
9396 glFlush(); 9493 glFlush();
9397 } 9494 }
9398 } else { 9495 } else {
9399 if (!surface_->SwapBuffers()) { 9496 if (!surface_->SwapBuffers()) {
9400 LOG(ERROR) << "Context lost because SwapBuffers failed."; 9497 LOG(ERROR) << "Context lost because SwapBuffers failed.";
9401 LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB); 9498 LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB);
9402 } 9499 }
9403 } 9500 }
9501
9502 // This may be a slow command. Exit command processing to allow for
9503 // context preemption and GPU watchdog checks.
9504 ExitCommandProcessingEarly();
9404 } 9505 }
9405 9506
9406 error::Error GLES2DecoderImpl::HandleEnableFeatureCHROMIUM( 9507 error::Error GLES2DecoderImpl::HandleEnableFeatureCHROMIUM(
9407 uint32 immediate_data_size, 9508 uint32 immediate_data_size,
9408 const void* cmd_data) { 9509 const void* cmd_data) {
9409 const gles2::cmds::EnableFeatureCHROMIUM& c = 9510 const gles2::cmds::EnableFeatureCHROMIUM& c =
9410 *static_cast<const gles2::cmds::EnableFeatureCHROMIUM*>(cmd_data); 9511 *static_cast<const gles2::cmds::EnableFeatureCHROMIUM*>(cmd_data);
9411 Bucket* bucket = GetBucket(c.bucket_id); 9512 Bucket* bucket = GetBucket(c.bucket_id);
9412 if (!bucket || bucket->size() == 0) { 9513 if (!bucket || bucket->size() == 0) {
9413 return error::kInvalidArguments; 9514 return error::kInvalidArguments;
(...skipping 1749 matching lines...) Expand 10 before | Expand all | Expand 10 after
11163 } 11264 }
11164 } 11265 }
11165 11266
11166 // Include the auto-generated part of this file. We split this because it means 11267 // Include the auto-generated part of this file. We split this because it means
11167 // we can easily edit the non-auto generated parts right here in this file 11268 // we can easily edit the non-auto generated parts right here in this file
11168 // instead of having to edit some template or the code generator. 11269 // instead of having to edit some template or the code generator.
11169 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 11270 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
11170 11271
11171 } // namespace gles2 11272 } // namespace gles2
11172 } // namespace gpu 11273 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698