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 <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <cmath> | 10 #include <cmath> |
(...skipping 1892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1903 // and allow context preemption and GPU watchdog checks in GpuScheduler(). | 1903 // and allow context preemption and GPU watchdog checks in GpuScheduler(). |
1904 void ExitCommandProcessingEarly() { commands_to_process_ = 0; } | 1904 void ExitCommandProcessingEarly() { commands_to_process_ = 0; } |
1905 | 1905 |
1906 void ProcessPendingReadPixels(bool did_finish); | 1906 void ProcessPendingReadPixels(bool did_finish); |
1907 void FinishReadPixels(const cmds::ReadPixels& c, GLuint buffer); | 1907 void FinishReadPixels(const cmds::ReadPixels& c, GLuint buffer); |
1908 | 1908 |
1909 void DoBindFragmentInputLocationCHROMIUM(GLuint program_id, | 1909 void DoBindFragmentInputLocationCHROMIUM(GLuint program_id, |
1910 GLint location, | 1910 GLint location, |
1911 const std::string& name); | 1911 const std::string& name); |
1912 | 1912 |
1913 const SamplerState* GetSamplerStateForTextureUnit(GLenum target, GLuint unit); | |
1914 | |
1913 // Generate a member function prototype for each command in an automated and | 1915 // Generate a member function prototype for each command in an automated and |
1914 // typesafe way. | 1916 // typesafe way. |
1915 #define GLES2_CMD_OP(name) \ | 1917 #define GLES2_CMD_OP(name) \ |
1916 Error Handle##name(uint32 immediate_data_size, const void* data); | 1918 Error Handle##name(uint32 immediate_data_size, const void* data); |
1917 | 1919 |
1918 GLES2_COMMAND_LIST(GLES2_CMD_OP) | 1920 GLES2_COMMAND_LIST(GLES2_CMD_OP) |
1919 | 1921 |
1920 #undef GLES2_CMD_OP | 1922 #undef GLES2_CMD_OP |
1921 | 1923 |
1922 // The GL context this decoder renders to on behalf of the client. | 1924 // The GL context this decoder renders to on behalf of the client. |
(...skipping 5726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7649 "GLES2DecoderImpl::DoCopyTexImageIfNeeded", GetErrorState()); | 7651 "GLES2DecoderImpl::DoCopyTexImageIfNeeded", GetErrorState()); |
7650 glBindTexture(textarget, texture->service_id()); | 7652 glBindTexture(textarget, texture->service_id()); |
7651 DoCopyTexImage(texture, textarget, image); | 7653 DoCopyTexImage(texture, textarget, image); |
7652 RestoreCurrentTextureBindings(&state_, textarget); | 7654 RestoreCurrentTextureBindings(&state_, textarget); |
7653 } | 7655 } |
7654 } | 7656 } |
7655 } | 7657 } |
7656 | 7658 |
7657 bool GLES2DecoderImpl::PrepareTexturesForRender() { | 7659 bool GLES2DecoderImpl::PrepareTexturesForRender() { |
7658 DCHECK(state_.current_program.get()); | 7660 DCHECK(state_.current_program.get()); |
7659 if (!texture_manager()->HaveUnrenderableTextures() && | 7661 if (!texture_manager()->HaveImages()) { |
piman
2015/12/14 14:04:14
This early exit is pretty important for performanc
bajones
2015/12/14 17:40:38
For ES3 we can't evaluate this ahead of time becau
| |
7660 !texture_manager()->HaveImages()) { | |
7661 return true; | 7662 return true; |
7662 } | 7663 } |
7663 bool textures_set = false; | 7664 bool textures_set = false; |
7664 const Program::SamplerIndices& sampler_indices = | 7665 const Program::SamplerIndices& sampler_indices = |
7665 state_.current_program->sampler_indices(); | 7666 state_.current_program->sampler_indices(); |
7666 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { | 7667 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
7667 const Program::UniformInfo* uniform_info = | 7668 const Program::UniformInfo* uniform_info = |
7668 state_.current_program->GetUniformInfo(sampler_indices[ii]); | 7669 state_.current_program->GetUniformInfo(sampler_indices[ii]); |
7669 DCHECK(uniform_info); | 7670 DCHECK(uniform_info); |
7670 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { | 7671 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { |
7671 GLuint texture_unit_index = uniform_info->texture_units[jj]; | 7672 GLuint texture_unit_index = uniform_info->texture_units[jj]; |
7672 if (texture_unit_index < state_.texture_units.size()) { | 7673 if (texture_unit_index < state_.texture_units.size()) { |
7673 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; | 7674 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; |
7674 TextureRef* texture_ref = | 7675 TextureRef* texture_ref = |
7675 texture_unit.GetInfoForSamplerType(uniform_info->type).get(); | 7676 texture_unit.GetInfoForSamplerType(uniform_info->type).get(); |
7676 GLenum textarget = GetBindTargetForSamplerType(uniform_info->type); | 7677 GLenum textarget = GetBindTargetForSamplerType(uniform_info->type); |
7677 if (!texture_ref || !texture_manager()->CanRender(texture_ref)) { | 7678 const SamplerState* sampler_state = GetSamplerStateForTextureUnit( |
7679 uniform_info->type, texture_unit_index); | |
7680 if (!texture_ref || | |
7681 !texture_manager()->CanRenderWithSampler( | |
7682 texture_ref, sampler_state)) { | |
7678 textures_set = true; | 7683 textures_set = true; |
7679 glActiveTexture(GL_TEXTURE0 + texture_unit_index); | 7684 glActiveTexture(GL_TEXTURE0 + texture_unit_index); |
7680 glBindTexture( | 7685 glBindTexture( |
7681 textarget, | 7686 textarget, |
7682 texture_manager()->black_texture_id(uniform_info->type)); | 7687 texture_manager()->black_texture_id(uniform_info->type)); |
7683 if (!texture_ref) { | 7688 if (!texture_ref) { |
7684 LOCAL_RENDER_WARNING( | 7689 LOCAL_RENDER_WARNING( |
7685 std::string("there is no texture bound to the unit ") + | 7690 std::string("there is no texture bound to the unit ") + |
7686 base::UintToString(texture_unit_index)); | 7691 base::UintToString(texture_unit_index)); |
7687 } else { | 7692 } else { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7723 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { | 7728 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
7724 const Program::UniformInfo* uniform_info = | 7729 const Program::UniformInfo* uniform_info = |
7725 state_.current_program->GetUniformInfo(sampler_indices[ii]); | 7730 state_.current_program->GetUniformInfo(sampler_indices[ii]); |
7726 DCHECK(uniform_info); | 7731 DCHECK(uniform_info); |
7727 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { | 7732 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { |
7728 GLuint texture_unit_index = uniform_info->texture_units[jj]; | 7733 GLuint texture_unit_index = uniform_info->texture_units[jj]; |
7729 if (texture_unit_index < state_.texture_units.size()) { | 7734 if (texture_unit_index < state_.texture_units.size()) { |
7730 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; | 7735 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; |
7731 TextureRef* texture_ref = | 7736 TextureRef* texture_ref = |
7732 texture_unit.GetInfoForSamplerType(uniform_info->type).get(); | 7737 texture_unit.GetInfoForSamplerType(uniform_info->type).get(); |
7733 if (!texture_ref || !texture_manager()->CanRender(texture_ref)) { | 7738 const SamplerState* sampler_state = GetSamplerStateForTextureUnit( |
7739 uniform_info->type, texture_unit_index); | |
7740 if (!texture_ref || | |
7741 !texture_manager()->CanRenderWithSampler( | |
7742 texture_ref, sampler_state)) { | |
7734 glActiveTexture(GL_TEXTURE0 + texture_unit_index); | 7743 glActiveTexture(GL_TEXTURE0 + texture_unit_index); |
7735 // Get the texture_ref info that was previously bound here. | 7744 // Get the texture_ref info that was previously bound here. |
7736 texture_ref = texture_unit.bind_target == GL_TEXTURE_2D | 7745 texture_ref = texture_unit.bind_target == GL_TEXTURE_2D |
7737 ? texture_unit.bound_texture_2d.get() | 7746 ? texture_unit.bound_texture_2d.get() |
7738 : texture_unit.bound_texture_cube_map.get(); | 7747 : texture_unit.bound_texture_cube_map.get(); |
7739 glBindTexture(texture_unit.bind_target, | 7748 glBindTexture(texture_unit.bind_target, |
7740 texture_ref ? texture_ref->service_id() : 0); | 7749 texture_ref ? texture_ref->service_id() : 0); |
7741 continue; | 7750 continue; |
7742 } | 7751 } |
7743 } | 7752 } |
(...skipping 7905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
15649 if (location < 0 || | 15658 if (location < 0 || |
15650 static_cast<uint32>(location) >= group_->max_varying_vectors() * 4) { | 15659 static_cast<uint32>(location) >= group_->max_varying_vectors() * 4) { |
15651 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, | 15660 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, |
15652 "location out of range"); | 15661 "location out of range"); |
15653 return; | 15662 return; |
15654 } | 15663 } |
15655 | 15664 |
15656 program->SetFragmentInputLocationBinding(name, location); | 15665 program->SetFragmentInputLocationBinding(name, location); |
15657 } | 15666 } |
15658 | 15667 |
15668 const SamplerState* GLES2DecoderImpl::GetSamplerStateForTextureUnit( | |
15669 GLenum target, GLuint unit) { | |
15670 if (features().enable_samplers) { | |
15671 Sampler* sampler = state_.sampler_units[unit].get(); | |
15672 if (sampler) | |
15673 return sampler->sampler_state(); | |
15674 } | |
15675 TextureUnit& texture_unit = state_.texture_units[unit]; | |
15676 TextureRef* texture_ref = texture_unit.GetInfoForSamplerType(target).get(); | |
15677 if (texture_ref) | |
15678 return texture_ref->texture()->sampler_state(); | |
15679 | |
15680 return nullptr; | |
15681 } | |
15682 | |
15659 error::Error GLES2DecoderImpl::HandleBindFragmentInputLocationCHROMIUMBucket( | 15683 error::Error GLES2DecoderImpl::HandleBindFragmentInputLocationCHROMIUMBucket( |
15660 uint32 immediate_data_size, | 15684 uint32 immediate_data_size, |
15661 const void* cmd_data) { | 15685 const void* cmd_data) { |
15662 const gles2::cmds::BindFragmentInputLocationCHROMIUMBucket& c = | 15686 const gles2::cmds::BindFragmentInputLocationCHROMIUMBucket& c = |
15663 *static_cast<const gles2::cmds::BindFragmentInputLocationCHROMIUMBucket*>( | 15687 *static_cast<const gles2::cmds::BindFragmentInputLocationCHROMIUMBucket*>( |
15664 cmd_data); | 15688 cmd_data); |
15665 if (!features().chromium_path_rendering) { | 15689 if (!features().chromium_path_rendering) { |
15666 return error::kUnknownCommand; | 15690 return error::kUnknownCommand; |
15667 } | 15691 } |
15668 | 15692 |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
15785 return error::kNoError; | 15809 return error::kNoError; |
15786 } | 15810 } |
15787 | 15811 |
15788 // Include the auto-generated part of this file. We split this because it means | 15812 // Include the auto-generated part of this file. We split this because it means |
15789 // we can easily edit the non-auto generated parts right here in this file | 15813 // we can easily edit the non-auto generated parts right here in this file |
15790 // instead of having to edit some template or the code generator. | 15814 // instead of having to edit some template or the code generator. |
15791 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 15815 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
15792 | 15816 |
15793 } // namespace gles2 | 15817 } // namespace gles2 |
15794 } // namespace gpu | 15818 } // namespace gpu |
OLD | NEW |