Chromium Code Reviews| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
| =================================================================== |
| --- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 48721) |
| +++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy) |
| @@ -990,8 +990,8 @@ |
| bool SimulateAttrib0(GLuint max_vertex_accessed); |
| void RestoreStateForSimulatedAttrib0(); |
| - void SetBlackTextureForNonRenderableTextures( |
| - bool* has_non_renderable_textures); |
| + // Returns true of textures were set. |
|
apatrick_chromium
2010/06/02 22:20:56
of -> if
|
| + bool SetBlackTextureForNonRenderableTextures(); |
| void RestoreStateForNonRenderableTextures(); |
| // Gets the buffer id for a given target. |
| @@ -1829,15 +1829,17 @@ |
| parent_->texture_manager()->GetTextureInfo(service_id); |
| DCHECK(info); |
| - info->SetLevelInfo(GL_TEXTURE_2D, |
| - 0, // level |
| - GL_RGBA, |
| - pending_offscreen_size_.width(), |
| - pending_offscreen_size_.height(), |
| - 1, // depth |
| - 0, // border |
| - GL_RGBA, |
| - GL_UNSIGNED_BYTE); |
| + texture_manager()->SetLevelInfo( |
| + info, |
| + GL_TEXTURE_2D, |
| + 0, // level |
| + GL_RGBA, |
| + pending_offscreen_size_.width(), |
| + pending_offscreen_size_.height(), |
| + 1, // depth |
| + 0, // border |
| + GL_RGBA, |
| + GL_UNSIGNED_BYTE); |
| } |
| return true; |
| @@ -2164,7 +2166,7 @@ |
| void GLES2DecoderImpl::DoGenerateMipmap(GLenum target) { |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| - if (!info || !info->MarkMipmapsGenerated()) { |
| + if (!info || !texture_manager()->MarkMipmapsGenerated(info)) { |
| SetGLError(GL_INVALID_OPERATION, |
| "glGenerateMipmaps: Can not generate mips for npot textures"); |
| return; |
| @@ -2584,11 +2586,10 @@ |
| void GLES2DecoderImpl::DoDrawArrays( |
| GLenum mode, GLint first, GLsizei count) { |
| if (IsDrawValid(first + count - 1)) { |
| - bool has_non_renderable_textures; |
| bool simulated_attrib_0 = SimulateAttrib0(first + count - 1); |
| - SetBlackTextureForNonRenderableTextures(&has_non_renderable_textures); |
| + bool textures_set = SetBlackTextureForNonRenderableTextures(); |
| glDrawArrays(mode, first, count); |
| - if (has_non_renderable_textures) { |
| + if (textures_set) { |
| RestoreStateForNonRenderableTextures(); |
| } |
| if (simulated_attrib_0) { |
| @@ -2700,7 +2701,7 @@ |
| if (!info) { |
| SetGLError(GL_INVALID_VALUE, "glTexParameterf: unknown texture"); |
| } else { |
| - info->SetParameter(pname, static_cast<GLint>(param)); |
| + texture_manager()->SetParameter(info, pname, static_cast<GLint>(param)); |
| glTexParameterf(target, pname, param); |
| } |
| } |
| @@ -2711,7 +2712,7 @@ |
| if (!info) { |
| SetGLError(GL_INVALID_VALUE, "glTexParameteri: unknown texture"); |
| } else { |
| - info->SetParameter(pname, param); |
| + texture_manager()->SetParameter(info, pname, param); |
| glTexParameteri(target, pname, param); |
| } |
| } |
| @@ -2722,7 +2723,8 @@ |
| if (!info) { |
| SetGLError(GL_INVALID_VALUE, "glTexParameterfv: unknown texture"); |
| } else { |
| - info->SetParameter(pname, *reinterpret_cast<const GLint*>(params)); |
| + texture_manager()->SetParameter( |
| + info, pname, *reinterpret_cast<const GLint*>(params)); |
| glTexParameterfv(target, pname, params); |
| } |
| } |
| @@ -2733,7 +2735,7 @@ |
| if (!info) { |
| SetGLError(GL_INVALID_VALUE, "glTexParameteriv: unknown texture"); |
| } else { |
| - info->SetParameter(pname, *params); |
| + texture_manager()->SetParameter(info, pname, *params); |
| glTexParameteriv(target, pname, params); |
| } |
| } |
| @@ -2923,12 +2925,14 @@ |
| } |
| } |
| -void GLES2DecoderImpl::SetBlackTextureForNonRenderableTextures( |
| - bool* has_non_renderable_textures) { |
| - DCHECK(has_non_renderable_textures); |
| +bool GLES2DecoderImpl::SetBlackTextureForNonRenderableTextures() { |
| DCHECK(current_program_); |
| DCHECK(!current_program_->IsDeleted()); |
| - *has_non_renderable_textures = false; |
| + // Only check if there are some unrenderable textures. |
| + if (!texture_manager()->HaveUnrenderableTextures()) { |
| + return false; |
| + } |
| + bool textures_set = false; |
| const ProgramManager::ProgramInfo::SamplerIndices& sampler_indices = |
| current_program_->sampler_indices(); |
| for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
| @@ -2944,7 +2948,7 @@ |
| texture_unit.bound_texture_2d : |
| texture_unit.bound_texture_cube_map; |
| if (!texture_info || !texture_info->CanRender()) { |
| - *has_non_renderable_textures = true; |
| + textures_set = true; |
| glActiveTexture(GL_TEXTURE0 + texture_unit_index); |
| glBindTexture( |
| uniform_info->type == GL_SAMPLER_2D ? GL_TEXTURE_2D : |
| @@ -2956,6 +2960,7 @@ |
| // else: should this be an error? |
| } |
| } |
| + return textures_set; |
| } |
| void GLES2DecoderImpl::RestoreStateForNonRenderableTextures() { |
| @@ -3126,13 +3131,11 @@ |
| } |
| if (IsDrawValid(max_vertex_accessed)) { |
| - bool has_non_renderable_textures; |
| bool simulated_attrib_0 = SimulateAttrib0(max_vertex_accessed); |
| - SetBlackTextureForNonRenderableTextures( |
| - &has_non_renderable_textures); |
| + bool textures_set = SetBlackTextureForNonRenderableTextures(); |
| const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset); |
| glDrawElements(mode, count, type, indices); |
| - if (has_non_renderable_textures) { |
| + if (textures_set) { |
| RestoreStateForNonRenderableTextures(); |
| } |
| if (simulated_attrib_0) { |
| @@ -4114,8 +4117,8 @@ |
| memset(zero.get(), 0, image_size); |
| data = zero.get(); |
| } |
| - info->SetLevelInfo( |
| - target, level, internal_format, width, height, 1, border, 0, 0); |
| + texture_manager()->SetLevelInfo( |
| + info, target, level, internal_format, width, height, 1, border, 0, 0); |
| glCompressedTexImage2D( |
| target, level, internal_format, width, height, border, image_size, data); |
| return error::kNoError; |
| @@ -4257,7 +4260,7 @@ |
| memset(zero.get(), 0, pixels_size); |
| pixels = zero.get(); |
| } |
| - info->SetLevelInfo( |
| + texture_manager()->SetLevelInfo(info, |
| target, level, internal_format, width, height, 1, border, format, type); |
| glTexImage2D( |
| target, level, internal_format, width, height, border, format, type, |