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 1864 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1875 void FinishReadPixels(const cmds::ReadPixels& c, GLuint buffer); | 1875 void FinishReadPixels(const cmds::ReadPixels& c, GLuint buffer); |
1876 | 1876 |
1877 void DoBindFragmentInputLocationCHROMIUM(GLuint program_id, | 1877 void DoBindFragmentInputLocationCHROMIUM(GLuint program_id, |
1878 GLint location, | 1878 GLint location, |
1879 const std::string& name); | 1879 const std::string& name); |
1880 | 1880 |
1881 // If |texture_manager_version_| doesn't match the current version, then this | 1881 // If |texture_manager_version_| doesn't match the current version, then this |
1882 // will rebind all external textures to match their current service_id. | 1882 // will rebind all external textures to match their current service_id. |
1883 void RestoreAllExternalTextureBindingsIfNeeded() override; | 1883 void RestoreAllExternalTextureBindingsIfNeeded() override; |
1884 | 1884 |
1885 const SamplerState& GetSamplerStateForTextureUnit(GLenum target, GLuint unit); | |
1886 | |
1887 // Generate a member function prototype for each command in an automated and | 1885 // Generate a member function prototype for each command in an automated and |
1888 // typesafe way. | 1886 // typesafe way. |
1889 #define GLES2_CMD_OP(name) \ | 1887 #define GLES2_CMD_OP(name) \ |
1890 Error Handle##name(uint32_t immediate_data_size, const void* data); | 1888 Error Handle##name(uint32_t immediate_data_size, const void* data); |
1891 | 1889 |
1892 GLES2_COMMAND_LIST(GLES2_CMD_OP) | 1890 GLES2_COMMAND_LIST(GLES2_CMD_OP) |
1893 | 1891 |
1894 #undef GLES2_CMD_OP | 1892 #undef GLES2_CMD_OP |
1895 | 1893 |
1896 // The GL context this decoder renders to on behalf of the client. | 1894 // The GL context this decoder renders to on behalf of the client. |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2084 | 2082 |
2085 // Most recent generation of the TextureManager. If this no longer matches | 2083 // Most recent generation of the TextureManager. If this no longer matches |
2086 // the current generation when our context becomes current, then we'll rebind | 2084 // the current generation when our context becomes current, then we'll rebind |
2087 // all the textures to stay up-to-date with Texture::service_id() changes. | 2085 // all the textures to stay up-to-date with Texture::service_id() changes. |
2088 uint32_t texture_manager_service_id_generation_; | 2086 uint32_t texture_manager_service_id_generation_; |
2089 | 2087 |
2090 bool force_shader_name_hashing_for_test; | 2088 bool force_shader_name_hashing_for_test; |
2091 | 2089 |
2092 GLfloat line_width_range_[2]; | 2090 GLfloat line_width_range_[2]; |
2093 | 2091 |
2094 SamplerState default_sampler_state_; | |
2095 | |
2096 DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl); | 2092 DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl); |
2097 }; | 2093 }; |
2098 | 2094 |
2099 const GLES2DecoderImpl::CommandInfo GLES2DecoderImpl::command_info[] = { | 2095 const GLES2DecoderImpl::CommandInfo GLES2DecoderImpl::command_info[] = { |
2100 #define GLES2_CMD_OP(name) \ | 2096 #define GLES2_CMD_OP(name) \ |
2101 { \ | 2097 { \ |
2102 &GLES2DecoderImpl::Handle##name, cmds::name::kArgFlags, \ | 2098 &GLES2DecoderImpl::Handle##name, cmds::name::kArgFlags, \ |
2103 cmds::name::cmd_flags, \ | 2099 cmds::name::cmd_flags, \ |
2104 sizeof(cmds::name) / sizeof(CommandBufferEntry) - 1, \ | 2100 sizeof(cmds::name) / sizeof(CommandBufferEntry) - 1, \ |
2105 } \ | 2101 } \ |
(...skipping 5501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7607 "GLES2DecoderImpl::DoCopyTexImageIfNeeded", GetErrorState()); | 7603 "GLES2DecoderImpl::DoCopyTexImageIfNeeded", GetErrorState()); |
7608 glBindTexture(textarget, texture->service_id()); | 7604 glBindTexture(textarget, texture->service_id()); |
7609 DoCopyTexImage(texture, textarget, image); | 7605 DoCopyTexImage(texture, textarget, image); |
7610 RestoreCurrentTextureBindings(&state_, textarget); | 7606 RestoreCurrentTextureBindings(&state_, textarget); |
7611 } | 7607 } |
7612 } | 7608 } |
7613 } | 7609 } |
7614 | 7610 |
7615 bool GLES2DecoderImpl::PrepareTexturesForRender() { | 7611 bool GLES2DecoderImpl::PrepareTexturesForRender() { |
7616 DCHECK(state_.current_program.get()); | 7612 DCHECK(state_.current_program.get()); |
| 7613 if (!texture_manager()->HaveUnrenderableTextures() && |
| 7614 !texture_manager()->HaveImages()) { |
| 7615 return true; |
| 7616 } |
7617 bool textures_set = false; | 7617 bool textures_set = false; |
7618 const Program::SamplerIndices& sampler_indices = | 7618 const Program::SamplerIndices& sampler_indices = |
7619 state_.current_program->sampler_indices(); | 7619 state_.current_program->sampler_indices(); |
7620 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { | 7620 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
7621 const Program::UniformInfo* uniform_info = | 7621 const Program::UniformInfo* uniform_info = |
7622 state_.current_program->GetUniformInfo(sampler_indices[ii]); | 7622 state_.current_program->GetUniformInfo(sampler_indices[ii]); |
7623 DCHECK(uniform_info); | 7623 DCHECK(uniform_info); |
7624 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { | 7624 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { |
7625 GLuint texture_unit_index = uniform_info->texture_units[jj]; | 7625 GLuint texture_unit_index = uniform_info->texture_units[jj]; |
7626 if (texture_unit_index < state_.texture_units.size()) { | 7626 if (texture_unit_index < state_.texture_units.size()) { |
7627 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; | 7627 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; |
7628 TextureRef* texture_ref = | 7628 TextureRef* texture_ref = |
7629 texture_unit.GetInfoForSamplerType(uniform_info->type).get(); | 7629 texture_unit.GetInfoForSamplerType(uniform_info->type).get(); |
7630 GLenum textarget = GetBindTargetForSamplerType(uniform_info->type); | 7630 GLenum textarget = GetBindTargetForSamplerType(uniform_info->type); |
7631 const SamplerState& sampler_state = GetSamplerStateForTextureUnit( | 7631 if (!texture_ref || !texture_manager()->CanRender(texture_ref)) { |
7632 uniform_info->type, texture_unit_index); | |
7633 if (!texture_ref || | |
7634 !texture_manager()->CanRenderWithSampler( | |
7635 texture_ref, sampler_state)) { | |
7636 textures_set = true; | 7632 textures_set = true; |
7637 glActiveTexture(GL_TEXTURE0 + texture_unit_index); | 7633 glActiveTexture(GL_TEXTURE0 + texture_unit_index); |
7638 glBindTexture( | 7634 glBindTexture( |
7639 textarget, | 7635 textarget, |
7640 texture_manager()->black_texture_id(uniform_info->type)); | 7636 texture_manager()->black_texture_id(uniform_info->type)); |
7641 if (!texture_ref) { | 7637 if (!texture_ref) { |
7642 LOCAL_RENDER_WARNING( | 7638 LOCAL_RENDER_WARNING( |
7643 std::string("there is no texture bound to the unit ") + | 7639 std::string("there is no texture bound to the unit ") + |
7644 base::UintToString(texture_unit_index)); | 7640 base::UintToString(texture_unit_index)); |
7645 } else { | 7641 } else { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7681 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { | 7677 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
7682 const Program::UniformInfo* uniform_info = | 7678 const Program::UniformInfo* uniform_info = |
7683 state_.current_program->GetUniformInfo(sampler_indices[ii]); | 7679 state_.current_program->GetUniformInfo(sampler_indices[ii]); |
7684 DCHECK(uniform_info); | 7680 DCHECK(uniform_info); |
7685 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { | 7681 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { |
7686 GLuint texture_unit_index = uniform_info->texture_units[jj]; | 7682 GLuint texture_unit_index = uniform_info->texture_units[jj]; |
7687 if (texture_unit_index < state_.texture_units.size()) { | 7683 if (texture_unit_index < state_.texture_units.size()) { |
7688 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; | 7684 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; |
7689 TextureRef* texture_ref = | 7685 TextureRef* texture_ref = |
7690 texture_unit.GetInfoForSamplerType(uniform_info->type).get(); | 7686 texture_unit.GetInfoForSamplerType(uniform_info->type).get(); |
7691 const SamplerState& sampler_state = GetSamplerStateForTextureUnit( | 7687 if (!texture_ref || !texture_manager()->CanRender(texture_ref)) { |
7692 uniform_info->type, texture_unit_index); | |
7693 if (!texture_ref || | |
7694 !texture_manager()->CanRenderWithSampler( | |
7695 texture_ref, sampler_state)) { | |
7696 glActiveTexture(GL_TEXTURE0 + texture_unit_index); | 7688 glActiveTexture(GL_TEXTURE0 + texture_unit_index); |
7697 // Get the texture_ref info that was previously bound here. | 7689 // Get the texture_ref info that was previously bound here. |
7698 texture_ref = | 7690 texture_ref = |
7699 texture_unit.GetInfoForTarget(texture_unit.bind_target).get(); | 7691 texture_unit.GetInfoForTarget(texture_unit.bind_target).get(); |
7700 glBindTexture(texture_unit.bind_target, | 7692 glBindTexture(texture_unit.bind_target, |
7701 texture_ref ? texture_ref->service_id() : 0); | 7693 texture_ref ? texture_ref->service_id() : 0); |
7702 continue; | 7694 continue; |
7703 } | 7695 } |
7704 } | 7696 } |
7705 } | 7697 } |
(...skipping 7752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15458 if (location < 0 || | 15450 if (location < 0 || |
15459 static_cast<uint32_t>(location) >= group_->max_varying_vectors() * 4) { | 15451 static_cast<uint32_t>(location) >= group_->max_varying_vectors() * 4) { |
15460 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, | 15452 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, |
15461 "location out of range"); | 15453 "location out of range"); |
15462 return; | 15454 return; |
15463 } | 15455 } |
15464 | 15456 |
15465 program->SetFragmentInputLocationBinding(name, location); | 15457 program->SetFragmentInputLocationBinding(name, location); |
15466 } | 15458 } |
15467 | 15459 |
15468 const SamplerState& GLES2DecoderImpl::GetSamplerStateForTextureUnit( | |
15469 GLenum target, GLuint unit) { | |
15470 if (features().enable_samplers) { | |
15471 Sampler* sampler = state_.sampler_units[unit].get(); | |
15472 if (sampler) | |
15473 return sampler->sampler_state(); | |
15474 } | |
15475 TextureUnit& texture_unit = state_.texture_units[unit]; | |
15476 TextureRef* texture_ref = texture_unit.GetInfoForSamplerType(target).get(); | |
15477 if (texture_ref) | |
15478 return texture_ref->texture()->sampler_state(); | |
15479 | |
15480 return default_sampler_state_; | |
15481 } | |
15482 | |
15483 error::Error GLES2DecoderImpl::HandleBindFragmentInputLocationCHROMIUMBucket( | 15460 error::Error GLES2DecoderImpl::HandleBindFragmentInputLocationCHROMIUMBucket( |
15484 uint32_t immediate_data_size, | 15461 uint32_t immediate_data_size, |
15485 const void* cmd_data) { | 15462 const void* cmd_data) { |
15486 const gles2::cmds::BindFragmentInputLocationCHROMIUMBucket& c = | 15463 const gles2::cmds::BindFragmentInputLocationCHROMIUMBucket& c = |
15487 *static_cast<const gles2::cmds::BindFragmentInputLocationCHROMIUMBucket*>( | 15464 *static_cast<const gles2::cmds::BindFragmentInputLocationCHROMIUMBucket*>( |
15488 cmd_data); | 15465 cmd_data); |
15489 if (!features().chromium_path_rendering) { | 15466 if (!features().chromium_path_rendering) { |
15490 return error::kUnknownCommand; | 15467 return error::kUnknownCommand; |
15491 } | 15468 } |
15492 | 15469 |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15636 } | 15613 } |
15637 | 15614 |
15638 // Include the auto-generated part of this file. We split this because it means | 15615 // Include the auto-generated part of this file. We split this because it means |
15639 // we can easily edit the non-auto generated parts right here in this file | 15616 // we can easily edit the non-auto generated parts right here in this file |
15640 // instead of having to edit some template or the code generator. | 15617 // instead of having to edit some template or the code generator. |
15641 #include "base/macros.h" | 15618 #include "base/macros.h" |
15642 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 15619 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
15643 | 15620 |
15644 } // namespace gles2 | 15621 } // namespace gles2 |
15645 } // namespace gpu | 15622 } // namespace gpu |
OLD | NEW |