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..04864317d455141abfec35608d849d029e6e60ff 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. |
@@ -6915,12 +6938,13 @@ error::Error GLES2DecoderImpl::HandleReadPixels( |
// If the row is in range, copy it. |
if (ry >= 0 && ry < max_size.height() && read_width > 0) { |
glReadPixels( |
- read_x, ry, read_width, 1, format, type, dst + dest_row_offset); |
+ read_x, ry, read_width, 1, format, GetTexType(type), |
+ dst + dest_row_offset); |
} |
dst += padded_row_size; |
} |
} else { |
- glReadPixels(x, y, width, height, format, type, pixels); |
+ glReadPixels(x, y, width, height, format, GetTexType(type), pixels); |
} |
GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels"); |
if (error == GL_NO_ERROR) { |
@@ -7885,7 +7909,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 +8400,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 +8413,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 +10295,10 @@ error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( |
// Setup the parameters. |
GLenum gl_internal_format = |
GetTexInternalFormat(internal_format, format, type); |
+ GLenum gl_type = GetTexType(type); |
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 +10387,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 +10402,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( |