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

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

Issue 1280163004: gpu: workaround force_cube_map_positive_x_allocation fixes Android crash. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: resolve sievers's comment Created 5 years, 4 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/texture_manager.h" 5 #include "gpu/command_buffer/service/texture_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 1921 matching lines...) Expand 10 before | Expand all | Expand 10 after
1932 DecoderTextureState* texture_state, 1932 DecoderTextureState* texture_state,
1933 ContextState* state, 1933 ContextState* state,
1934 DecoderFramebufferState* framebuffer_state, 1934 DecoderFramebufferState* framebuffer_state,
1935 const char* function_name, 1935 const char* function_name,
1936 const DoTexImageArguments& args) { 1936 const DoTexImageArguments& args) {
1937 TextureRef* texture_ref; 1937 TextureRef* texture_ref;
1938 if (!ValidateTexImage(state, function_name, args, &texture_ref)) { 1938 if (!ValidateTexImage(state, function_name, args, &texture_ref)) {
1939 return; 1939 return;
1940 } 1940 }
1941 1941
1942 if (texture_state->force_cube_map_positive_x_allocation) {
1943 if (!DoTexImage2DCubeMapPositiveXIfNeeded(
1944 texture_state, state->GetErrorState(), framebuffer_state,
1945 function_name, texture_ref, args)) {
1946 return;
1947 }
1948 }
1949
1942 DoTexImage(texture_state, state->GetErrorState(), framebuffer_state, 1950 DoTexImage(texture_state, state->GetErrorState(), framebuffer_state,
1943 function_name, texture_ref, args); 1951 function_name, texture_ref, args);
1944 } 1952 }
1945 1953
1946 GLenum TextureManager::AdjustTexFormat(GLenum format) const { 1954 GLenum TextureManager::AdjustTexFormat(GLenum format) const {
1947 // TODO(bajones): GLES 3 allows for internal format and format to differ. 1955 // TODO(bajones): GLES 3 allows for internal format and format to differ.
1948 // This logic may need to change as a result. 1956 // This logic may need to change as a result.
1949 if (gfx::GetGLImplementation() == gfx::kGLImplementationDesktopGL) { 1957 if (gfx::GetGLImplementation() == gfx::kGLImplementationDesktopGL) {
1950 if (format == GL_SRGB_EXT) 1958 if (format == GL_SRGB_EXT)
1951 return GL_RGB; 1959 return GL_RGB;
1952 if (format == GL_SRGB_ALPHA_EXT) 1960 if (format == GL_SRGB_ALPHA_EXT)
1953 return GL_RGBA; 1961 return GL_RGBA;
1954 } 1962 }
1955 return format; 1963 return format;
1956 } 1964 }
1957 1965
1966 // Nexus 5 crashes on allocating a cube map texture bound to FBO, if
1967 // the CUBE_MAP_POSITIVE_X texture is not allocated yet.
1968 bool TextureManager::DoTexImage2DCubeMapPositiveXIfNeeded(
1969 DecoderTextureState* texture_state,
1970 ErrorState* error_state,
1971 DecoderFramebufferState* framebuffer_state,
1972 const char* function_name,
1973 TextureRef* texture_ref,
1974 const DoTexImageArguments& args) {
1975 switch (args.target) {
1976 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1977 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1978 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1979 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1980 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1981 break;
1982 default:
1983 return true;
1984 }
1985
1986 // ValidateTexImage is passed already.
1987 Texture* texture = texture_ref->texture();
1988 int width = 0;
1989 int height = 0;
1990 bool positive_x_level_defined = texture->GetLevelSize(
1991 GL_TEXTURE_CUBE_MAP_POSITIVE_X, args.level, &width, &height, nullptr);
1992 if (!positive_x_level_defined) {
1993 DoTexImageArguments positive_x_args = args;
1994 positive_x_args.target = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
1995 positive_x_args.pixels = nullptr;
1996 if (!memory_tracker_managed_->EnsureGPUMemoryAvailable(2 *
1997 args.pixels_size)) {
1998 ERRORSTATE_SET_GL_ERROR(error_state, GL_OUT_OF_MEMORY, function_name,
1999 "out of memory");
2000 return false;
2001 }
2002 DoTexImage(texture_state, error_state, framebuffer_state, function_name,
2003 texture_ref, positive_x_args);
2004 }
2005 return true;
2006 }
2007
1958 void TextureManager::DoTexImage( 2008 void TextureManager::DoTexImage(
1959 DecoderTextureState* texture_state, 2009 DecoderTextureState* texture_state,
1960 ErrorState* error_state, 2010 ErrorState* error_state,
1961 DecoderFramebufferState* framebuffer_state, 2011 DecoderFramebufferState* framebuffer_state,
1962 const char* function_name, 2012 const char* function_name,
1963 TextureRef* texture_ref, 2013 TextureRef* texture_ref,
1964 const DoTexImageArguments& args) { 2014 const DoTexImageArguments& args) {
1965 Texture* texture = texture_ref->texture(); 2015 Texture* texture = texture_ref->texture();
1966 GLsizei tex_width = 0; 2016 GLsizei tex_width = 0;
1967 GLsizei tex_height = 0; 2017 GLsizei tex_height = 0;
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
2099 // The link to the memory tracking |client_id| is given a higher importance 2149 // The link to the memory tracking |client_id| is given a higher importance
2100 // than other refs. 2150 // than other refs.
2101 if (ref == ref->texture()->memory_tracking_ref_) 2151 if (ref == ref->texture()->memory_tracking_ref_)
2102 importance = 2; 2152 importance = 2;
2103 2153
2104 pmd->AddOwnershipEdge(client_guid, service_guid, importance); 2154 pmd->AddOwnershipEdge(client_guid, service_guid, importance);
2105 } 2155 }
2106 2156
2107 } // namespace gles2 2157 } // namespace gles2
2108 } // namespace gpu 2158 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/texture_manager.h ('k') | gpu/command_buffer/tests/gl_cube_map_texture_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698