| Index: gpu/command_buffer/service/texture_manager.cc
|
| diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc
|
| index ed0fd10e5b1e6e1ae96fc5b0316d0be8b10290fb..53715c4d2df3d7dcd5d0738b0ef4df8fd916521d 100644
|
| --- a/gpu/command_buffer/service/texture_manager.cc
|
| +++ b/gpu/command_buffer/service/texture_manager.cc
|
| @@ -1939,6 +1939,14 @@ void TextureManager::ValidateAndDoTexImage(
|
| return;
|
| }
|
|
|
| + if (texture_state->force_cube_map_positive_x_allocation) {
|
| + if (!DoTexImage2DCubeMapPositiveXIfNeeded(
|
| + texture_state, state->GetErrorState(), framebuffer_state,
|
| + function_name, texture_ref, args)) {
|
| + return;
|
| + }
|
| + }
|
| +
|
| DoTexImage(texture_state, state->GetErrorState(), framebuffer_state,
|
| function_name, texture_ref, args);
|
| }
|
| @@ -1955,6 +1963,48 @@ GLenum TextureManager::AdjustTexFormat(GLenum format) const {
|
| return format;
|
| }
|
|
|
| +// Nexus 5 crashes on allocating a cube map texture bound to FBO, if
|
| +// the CUBE_MAP_POSITIVE_X texture is not allocated yet.
|
| +bool TextureManager::DoTexImage2DCubeMapPositiveXIfNeeded(
|
| + DecoderTextureState* texture_state,
|
| + ErrorState* error_state,
|
| + DecoderFramebufferState* framebuffer_state,
|
| + const char* function_name,
|
| + TextureRef* texture_ref,
|
| + const DoTexImageArguments& args) {
|
| + switch (args.target) {
|
| + case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
|
| + case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
|
| + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
|
| + case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
|
| + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
|
| + break;
|
| + default:
|
| + return true;
|
| + }
|
| +
|
| + // ValidateTexImage is passed already.
|
| + Texture* texture = texture_ref->texture();
|
| + int width = 0;
|
| + int height = 0;
|
| + bool positive_x_level_defined = texture->GetLevelSize(
|
| + GL_TEXTURE_CUBE_MAP_POSITIVE_X, args.level, &width, &height, nullptr);
|
| + if (!positive_x_level_defined) {
|
| + DoTexImageArguments positive_x_args = args;
|
| + positive_x_args.target = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
|
| + positive_x_args.pixels = nullptr;
|
| + if (!memory_tracker_managed_->EnsureGPUMemoryAvailable(2 *
|
| + args.pixels_size)) {
|
| + ERRORSTATE_SET_GL_ERROR(error_state, GL_OUT_OF_MEMORY, function_name,
|
| + "out of memory");
|
| + return false;
|
| + }
|
| + DoTexImage(texture_state, error_state, framebuffer_state, function_name,
|
| + texture_ref, positive_x_args);
|
| + }
|
| + return true;
|
| +}
|
| +
|
| void TextureManager::DoTexImage(
|
| DecoderTextureState* texture_state,
|
| ErrorState* error_state,
|
|
|