Chromium Code Reviews| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| index 6121a58da44ff4784a8c609b3c3e305337fbc57d..f6f414aa4cc0ebf7cadc076d05c0d26bc3954fd4 100644 |
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| @@ -307,6 +307,14 @@ static inline GLenum GetTexInternalFormat(GLenum internal_format, |
| return gl_internal_format; |
| } |
| +static inline GLenum GetTexType(GLenum type) { |
| + if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { |
| + if (type == GL_HALF_FLOAT_OES) |
| + return GL_HALF_FLOAT_ARB; |
| + } |
| + return type; |
| +} |
| + |
| static void WrappedTexImage2D( |
| GLenum target, |
| GLint level, |
| @@ -319,7 +327,22 @@ static void WrappedTexImage2D( |
| const void* pixels) { |
| glTexImage2D( |
| target, level, GetTexInternalFormat(internal_format, format, type), |
| - width, height, border, format, type, pixels); |
| + width, height, border, format, GetTexType(type), pixels); |
| +} |
| + |
| +static void WrappedTexSubImage2D( |
| + GLenum target, |
| + GLint level, |
| + GLint xoffset, |
| + GLint yoffset, |
| + GLsizei width, |
| + GLsizei height, |
| + GLenum format, |
| + GLenum type, |
| + const void * data) { |
| + glTexSubImage2D( |
| + target, level, xoffset, yoffset, width, height, format, |
| + GetTexType(type), data); |
| } |
| // Wrapper for glEnable/glDisable that doesn't suck. |
| @@ -7885,7 +7908,8 @@ void GLES2DecoderImpl::DoTexImage2D( |
| } |
| if (!teximage2d_faster_than_texsubimage2d_ && level_is_same && pixels) { |
| - glTexSubImage2D(target, level, 0, 0, width, height, format, type, pixels); |
| + WrappedTexSubImage2D(target, level, 0, 0, width, height, format, |
| + type, pixels); |
| texture_manager()->SetLevelCleared(texture, target, level, true); |
| tex_image_2d_failed_ = false; |
| return; |
| @@ -8375,7 +8399,7 @@ error::Error GLES2DecoderImpl::DoTexSubImage2D( |
| return error::kNoError; |
| } |
| ScopedTextureUploadTimer timer(this); |
| - glTexSubImage2D( |
| + WrappedTexSubImage2D( |
| target, level, xoffset, yoffset, width, height, format, type, data); |
| return error::kNoError; |
| } |
| @@ -8388,7 +8412,7 @@ error::Error GLES2DecoderImpl::DoTexSubImage2D( |
| target, level, format, width, height, 0, format, type, data); |
| } else { |
| ScopedTextureUploadTimer timer(this); |
| - glTexSubImage2D( |
| + WrappedTexSubImage2D( |
| target, level, xoffset, yoffset, width, height, format, type, data); |
| } |
| texture_manager()->SetLevelCleared(texture, target, level, true); |
| @@ -10270,8 +10294,10 @@ error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( |
| // Setup the parameters. |
| GLenum gl_internal_format = |
| GetTexInternalFormat(internal_format, format, type); |
| + GLenum gl_type = GetTexType(type); |
|
greggman
2013/05/03 06:26:21
Hey Jun, Sorry about this but I just remembered th
|
| gfx::AsyncTexImage2DParams tex_params = {target, level, gl_internal_format, |
| - width, height, border, format, type}; |
| + width, height, border, format, |
| + gl_type}; |
| gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, |
| shm_data_offset, shm_data_size}; |
| @@ -10360,8 +10386,9 @@ error::Error GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM( |
| uint32 shm_data_size = data_size; |
| // Setup the parameters. |
| + GLenum gl_type = GetTexType(type); |
| gfx::AsyncTexSubImage2DParams tex_params = {target, level, xoffset, yoffset, |
| - width, height, format, type}; |
| + width, height, format, gl_type}; |
| gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, |
| shm_data_offset, shm_data_size}; |
| if (!texture->GetAsyncTransferState()) { |
| @@ -10374,6 +10401,13 @@ error::Error GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM( |
| &define_params.height); |
| texture->GetLevelType(target, level, &define_params.type, |
| &define_params.internal_format); |
| + |
| + // Update the internal_format and type for PixelTransferState if needed. |
| + define_params.internal_format = |
| + GetTexInternalFormat(define_params.internal_format, |
| + define_params.internal_format, type); |
| + define_params.type = GetTexType(define_params.type); |
| + |
| // Set up the async state if needed, and make the texture |
| // immutable so the async state stays valid. |
| texture->SetAsyncTransferState( |