| 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 b90974062192801e6f5a9a29d000204649798c14..db2c9d22c142c3fa90d8e93ba069e37e30e79b9b 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -1041,6 +1041,14 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
|
| void DoBindTexImage2DCHROMIUM(
|
| GLenum target,
|
| GLint image_id);
|
| + void DoBindTexImage2DWithInternalformatCHROMIUM(GLenum target,
|
| + GLenum internalformat,
|
| + GLint image_id);
|
| + // Common implementation of DoBindTexImage2DCHROMIUM entry points.
|
| + void BindTexImage2DCHROMIUMImpl(const char* function_name,
|
| + GLenum target,
|
| + GLenum internalformat,
|
| + GLint image_id);
|
| void DoReleaseTexImage2DCHROMIUM(
|
| GLenum target,
|
| GLint image_id);
|
| @@ -17763,10 +17771,26 @@ void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
|
| GLenum target, GLint image_id) {
|
| TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoBindTexImage2DCHROMIUM");
|
|
|
| + BindTexImage2DCHROMIUMImpl("glBindTexImage2DCHROMIUM", target, 0, image_id);
|
| +}
|
| +
|
| +void GLES2DecoderImpl::DoBindTexImage2DWithInternalformatCHROMIUM(
|
| + GLenum target,
|
| + GLenum internalformat,
|
| + GLint image_id) {
|
| + TRACE_EVENT0("gpu",
|
| + "GLES2DecoderImpl::DoBindTexImage2DWithInternalformatCHROMIUM");
|
| +
|
| + BindTexImage2DCHROMIUMImpl("glBindTexImage2DWithInternalformatCHROMIUM",
|
| + target, internalformat, image_id);
|
| +}
|
| +
|
| +void GLES2DecoderImpl::BindTexImage2DCHROMIUMImpl(const char* function_name,
|
| + GLenum target,
|
| + GLenum internalformat,
|
| + GLint image_id) {
|
| if (target == GL_TEXTURE_CUBE_MAP) {
|
| - LOCAL_SET_GL_ERROR(
|
| - GL_INVALID_ENUM,
|
| - "glBindTexImage2DCHROMIUM", "invalid target");
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, function_name, "invalid target");
|
| return;
|
| }
|
|
|
| @@ -17775,17 +17799,14 @@ void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
|
| TextureRef* texture_ref =
|
| texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target);
|
| if (!texture_ref) {
|
| - LOCAL_SET_GL_ERROR(
|
| - GL_INVALID_OPERATION,
|
| - "glBindTexImage2DCHROMIUM", "no texture bound");
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, "no texture bound");
|
| return;
|
| }
|
|
|
| gl::GLImage* image = image_manager()->LookupImage(image_id);
|
| if (!image) {
|
| - LOCAL_SET_GL_ERROR(
|
| - GL_INVALID_OPERATION,
|
| - "glBindTexImage2DCHROMIUM", "no image found with the given ID");
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
|
| + "no image found with the given ID");
|
| return;
|
| }
|
|
|
| @@ -17797,15 +17818,22 @@ void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
|
|
|
| // Note: We fallback to using CopyTexImage() before the texture is used
|
| // when BindTexImage() fails.
|
| - if (image->BindTexImage(target))
|
| - image_state = Texture::BOUND;
|
| + if (internalformat) {
|
| + if (image->BindTexImageWithInternalformat(target, internalformat))
|
| + image_state = Texture::BOUND;
|
| + } else {
|
| + if (image->BindTexImage(target))
|
| + image_state = Texture::BOUND;
|
| + }
|
| }
|
|
|
| gfx::Size size = image->GetSize();
|
| - GLenum internalformat = image->GetInternalFormat();
|
| - texture_manager()->SetLevelInfo(
|
| - texture_ref, target, 0, internalformat, size.width(), size.height(), 1, 0,
|
| - internalformat, GL_UNSIGNED_BYTE, gfx::Rect(size));
|
| + GLenum texture_internalformat =
|
| + internalformat ? internalformat : image->GetInternalFormat();
|
| + texture_manager()->SetLevelInfo(texture_ref, target, 0,
|
| + texture_internalformat, size.width(),
|
| + size.height(), 1, 0, texture_internalformat,
|
| + GL_UNSIGNED_BYTE, gfx::Rect(size));
|
| texture_manager()->SetLevelImage(texture_ref, target, 0, image, image_state);
|
| }
|
|
|
|
|