| 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 4815d9c972b560c4d37ca40c6cf12a360d8de555..155ffbaca914dfe83b78deffa58441a3125f1238 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -1015,12 +1015,8 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
|
| const volatile GLbyte* key);
|
| void DoApplyScreenSpaceAntialiasingCHROMIUM();
|
|
|
| - void DoBindTexImage2DCHROMIUM(
|
| - GLenum target,
|
| - GLint image_id);
|
| - void DoReleaseTexImage2DCHROMIUM(
|
| - GLenum target,
|
| - GLint image_id);
|
| + void DoBindTexImage2DCHROMIUM(GLenum target, GLint image_id, GLint fence_id);
|
| + void DoReleaseTexImage2DCHROMIUM(GLenum target, GLint image_id);
|
|
|
| void DoTraceEndCHROMIUM(void);
|
|
|
| @@ -2725,7 +2721,7 @@ bool BackTexture::AllocateNativeGpuMemoryBuffer(const gfx::Size& size,
|
| scoped_refptr<gl::GLImage> image =
|
| decoder_->GetContextGroup()->image_factory()->CreateAnonymousImage(
|
| size, buffer_format, format);
|
| - if (!image || !image->BindTexImage(Target()))
|
| + if (!image || !image->BindTexImage(Target(), nullptr))
|
| return false;
|
|
|
| image_ = image;
|
| @@ -16951,8 +16947,9 @@ void GLES2DecoderImpl::DoPushGroupMarkerEXT(
|
| void GLES2DecoderImpl::DoPopGroupMarkerEXT(void) {
|
| }
|
|
|
| -void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
|
| - GLenum target, GLint image_id) {
|
| +void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(GLenum target,
|
| + GLint image_id,
|
| + GLint fence_id) {
|
| TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoBindTexImage2DCHROMIUM");
|
|
|
| if (target == GL_TEXTURE_CUBE_MAP) {
|
| @@ -16981,6 +16978,16 @@ void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
|
| return;
|
| }
|
|
|
| + gl::GLFence* fence = nullptr;
|
| + if (fence_id) {
|
| + fence = fence_manager()->LookupFence(fence_id);
|
| + if (!fence) {
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glBindTexImage2DCHROMIUM",
|
| + "no fence found with the given ID");
|
| + return;
|
| + }
|
| + }
|
| +
|
| Texture::ImageState image_state = Texture::UNBOUND;
|
|
|
| {
|
| @@ -16989,10 +16996,13 @@ void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
|
|
|
| // Note: We fallback to using CopyTexImage() before the texture is used
|
| // when BindTexImage() fails.
|
| - if (image->BindTexImage(target))
|
| + if (image->BindTexImage(target, fence))
|
| image_state = Texture::BOUND;
|
| }
|
|
|
| + DLOG_IF(WARNING, fence && image_state != Texture::BOUND)
|
| + << "BindTexImage2D fence ignored by CopyTexImage() fallback";
|
| +
|
| gfx::Size size = image->GetSize();
|
| GLenum internalformat = image->GetInternalFormat();
|
| texture_manager()->SetLevelInfo(
|
| @@ -17001,8 +17011,8 @@ void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
|
| texture_manager()->SetLevelImage(texture_ref, target, 0, image, image_state);
|
| }
|
|
|
| -void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM(
|
| - GLenum target, GLint image_id) {
|
| +void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM(GLenum target,
|
| + GLint image_id) {
|
| TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM");
|
|
|
| // Default target might be conceptually valid, but disallow it to avoid
|
|
|