| 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 81ecee496c9c70038085eb2f2be1fe5c023cf8ab..b0907c4319b6ed04f7affdbcfb8146cc96d0942d 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -50,6 +50,7 @@
|
| #include "gpu/command_buffer/service/texture_manager.h"
|
| #include "gpu/command_buffer/service/vertex_attrib_manager.h"
|
| #include "ui/gl/gl_context.h"
|
| +#include "ui/gl/gl_image.h"
|
| #include "ui/gl/gl_implementation.h"
|
| #include "ui/gl/gl_surface.h"
|
| #if defined(OS_MACOSX)
|
| @@ -765,6 +766,11 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
|
| GLsizei width,
|
| GLsizei height);
|
|
|
| + // Wrapper for TexImagePixmap2DCHROMIUM.
|
| + void DoTexImagePixmap2DCHROMIUM(
|
| + GLenum target,
|
| + GLuint pixmap_id);
|
| +
|
| void DoProduceTextureCHROMIUM(GLenum target, const GLbyte* key);
|
| void DoConsumeTextureCHROMIUM(GLenum target, const GLbyte* key);
|
|
|
| @@ -1261,6 +1267,16 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
|
| return info;
|
| }
|
|
|
| + TextureManager::TextureInfo* GetTextureInfoForTargetUnlessDefault(
|
| + GLenum target) {
|
| + TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
|
| + if (!info)
|
| + return NULL;
|
| + if (info == texture_manager()->GetDefaultTextureInfo(target))
|
| + return NULL;
|
| + return info;
|
| + }
|
| +
|
| GLenum GetBindTargetForSamplerType(GLenum type) {
|
| DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE ||
|
| type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB);
|
| @@ -8802,18 +8818,15 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM(
|
| return;
|
| }
|
|
|
| - TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
|
| + // Default target might be conceptually valid, but disallow it to avoid
|
| + // accidents.
|
| + TextureManager::TextureInfo* info = GetTextureInfoForTargetUnlessDefault(
|
| + target);
|
| if (!info) {
|
| SetGLError(GL_INVALID_OPERATION,
|
| "glTexImageIOSurface2DCHROMIUM", "no rectangle texture bound");
|
| return;
|
| }
|
| - if (info == texture_manager()->GetDefaultTextureInfo(target)) {
|
| - // Maybe this is conceptually valid, but disallow it to avoid accidents.
|
| - SetGLError(GL_INVALID_OPERATION,
|
| - "glTexImageIOSurface2DCHROMIUM", "can't bind default texture");
|
| - return;
|
| - }
|
|
|
| // Look up the new IOSurface. Note that because of asynchrony
|
| // between processes this might fail; during live resizing the
|
| @@ -9189,6 +9202,62 @@ void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target,
|
| BindAndApplyTextureParameters(info);
|
| }
|
|
|
| +void GLES2DecoderImpl::DoTexImagePixmap2DCHROMIUM(
|
| + GLenum target, GLuint pixmap_id) {
|
| + if (target != GL_TEXTURE_2D) {
|
| + // This might be supported in the future.
|
| + SetGLError(
|
| + GL_INVALID_OPERATION,
|
| + "glTexImagePixmap2DCHROMIUM", "requires TEXTURE_2D target");
|
| + return;
|
| + }
|
| +
|
| + // Default target might be conceptually valid, but disallow it to avoid
|
| + // accidents.
|
| + TextureManager::TextureInfo* info = GetTextureInfoForTargetUnlessDefault(
|
| + target);
|
| + if (!info) {
|
| + SetGLError(GL_INVALID_OPERATION,
|
| + "glTexImagePixmap2DCHROMIUM", "no texture bound");
|
| + return;
|
| + }
|
| +
|
| + scoped_refptr<gfx::GLImage> pixmap_gl_image = info->GetLevelImage(target, 0);
|
| + if (pixmap_id) {
|
| + if (!pixmap_gl_image) {
|
| + pixmap_gl_image = gfx::GLImage::CreatePixmapGLImage(surface_);
|
| + if (!pixmap_gl_image) {
|
| + SetGLError(GL_INVALID_OPERATION,
|
| + "glTexImagePixmap2DCHROMIUM",
|
| + "fail to create PixmapGLImage");
|
| + return;
|
| + }
|
| + }
|
| +
|
| + // Update GL image and bind to texture.
|
| + if (!pixmap_gl_image->RebindPixmap(pixmap_id)) {
|
| + SetGLError(GL_INVALID_OPERATION,
|
| + "glTexImagePixmap2DCHROMIUM",
|
| + "fail to bind Pixmap with the given ID");
|
| + return;
|
| + }
|
| +
|
| + gfx::Size size = pixmap_gl_image->GetSize();
|
| + texture_manager()->SetLevelInfo(
|
| + info, target, 0, GL_RGBA, size.width(), size.height(), 1, 0,
|
| + GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, true);
|
| + texture_manager()->SetLevelImage(info, target, 0, pixmap_gl_image);
|
| + } else {
|
| + // Release pixmap image previously bound to this texture.
|
| + if (pixmap_gl_image)
|
| + pixmap_gl_image->RebindPixmap(0);
|
| +
|
| + texture_manager()->SetLevelInfo(
|
| + info, 0, 0, GL_RGBA, 0, 0, 1, 0,
|
| + GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, false);
|
| + }
|
| +}
|
| +
|
| // Include the auto-generated part of this file. We split this because it means
|
| // we can easily edit the non-auto generated parts right here in this file
|
| // instead of having to edit some template or the code generator.
|
|
|