| 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 008dcdbbcb388d4db7fd76b743c818aec0c374c2..cac9cf86f81a156ead3e4cbcadcbe2b88b9b78e8 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -1036,12 +1036,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);
|
|
|
| @@ -2701,7 +2697,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;
|
| @@ -16418,8 +16414,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) {
|
| @@ -16448,6 +16445,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;
|
|
|
| {
|
| @@ -16456,10 +16463,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(
|
| @@ -16468,8 +16478,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
|
|
|