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 748eb21cd1256913dc7f711e1930f6a834f87d12..f7e3ebcfb0f0bacca7e27fd68b8ef809e3afacd2 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -39,6 +39,7 @@ |
#include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" |
#include "gpu/command_buffer/service/gles2_cmd_validation.h" |
#include "gpu/command_buffer/service/gpu_switches.h" |
+#include "gpu/command_buffer/service/image_manager.h" |
#include "gpu/command_buffer/service/mailbox_manager.h" |
#include "gpu/command_buffer/service/memory_tracking.h" |
#include "gpu/command_buffer/service/program_manager.h" |
@@ -54,6 +55,7 @@ |
#include "gpu/command_buffer/service/vertex_attrib_manager.h" |
#include "gpu/command_buffer/service/vertex_array_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) |
@@ -616,6 +618,10 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
return group_->mailbox_manager(); |
} |
+ ImageManager* image_manager() { |
+ return group_->image_manager(); |
+ } |
+ |
VertexArrayManager* vertex_array_manager() { |
return vertex_array_manager_.get(); |
} |
@@ -653,100 +659,107 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
// Wrapper for CompressedTexImage2D commands. |
error::Error DoCompressedTexImage2D( |
- GLenum target, |
- GLint level, |
- GLenum internal_format, |
- GLsizei width, |
- GLsizei height, |
- GLint border, |
- GLsizei image_size, |
- const void* data); |
+ GLenum target, |
+ GLint level, |
+ GLenum internal_format, |
+ GLsizei width, |
+ GLsizei height, |
+ GLint border, |
+ GLsizei image_size, |
+ const void* data); |
// Wrapper for CompressedTexSubImage2D. |
void DoCompressedTexSubImage2D( |
- GLenum target, |
- GLint level, |
- GLint xoffset, |
- GLint yoffset, |
- GLsizei width, |
- GLsizei height, |
- GLenum format, |
- GLsizei imageSize, |
- const void * data); |
+ GLenum target, |
+ GLint level, |
+ GLint xoffset, |
+ GLint yoffset, |
+ GLsizei width, |
+ GLsizei height, |
+ GLenum format, |
+ GLsizei imageSize, |
+ const void * data); |
// Wrapper for CopyTexImage2D. |
void DoCopyTexImage2D( |
- GLenum target, |
- GLint level, |
- GLenum internal_format, |
- GLint x, |
- GLint y, |
- GLsizei width, |
- GLsizei height, |
- GLint border); |
+ GLenum target, |
+ GLint level, |
+ GLenum internal_format, |
+ GLint x, |
+ GLint y, |
+ GLsizei width, |
+ GLsizei height, |
+ GLint border); |
// Wrapper for CopyTexSubImage2D. |
void DoCopyTexSubImage2D( |
- GLenum target, |
- GLint level, |
- GLint xoffset, |
- GLint yoffset, |
- GLint x, |
- GLint y, |
- GLsizei width, |
- GLsizei height); |
+ GLenum target, |
+ GLint level, |
+ GLint xoffset, |
+ GLint yoffset, |
+ GLint x, |
+ GLint y, |
+ GLsizei width, |
+ GLsizei height); |
// Wrapper for TexImage2D commands. |
error::Error DoTexImage2D( |
- GLenum target, |
- GLint level, |
- GLenum internal_format, |
- GLsizei width, |
- GLsizei height, |
- GLint border, |
- GLenum format, |
- GLenum type, |
- const void* pixels, |
- uint32 pixels_size); |
+ GLenum target, |
+ GLint level, |
+ GLenum internal_format, |
+ GLsizei width, |
+ GLsizei height, |
+ GLint border, |
+ GLenum format, |
+ GLenum type, |
+ const void* pixels, |
+ uint32 pixels_size); |
// Wrapper for TexSubImage2D. |
void DoTexSubImage2D( |
- GLenum target, |
- GLint level, |
- GLint xoffset, |
- GLint yoffset, |
- GLsizei width, |
- GLsizei height, |
- GLenum format, |
- GLenum type, |
- const void * data); |
+ GLenum target, |
+ GLint level, |
+ GLint xoffset, |
+ GLint yoffset, |
+ GLsizei width, |
+ GLsizei height, |
+ GLenum format, |
+ GLenum type, |
+ const void * data); |
// Wrapper for TexImageIOSurface2DCHROMIUM. |
void DoTexImageIOSurface2DCHROMIUM( |
- GLenum target, |
- GLsizei width, |
- GLsizei height, |
- GLuint io_surface_id, |
- GLuint plane); |
+ GLenum target, |
+ GLsizei width, |
+ GLsizei height, |
+ GLuint io_surface_id, |
+ GLuint plane); |
void DoCopyTextureCHROMIUM( |
- GLenum target, |
- GLuint source_id, |
- GLuint target_id, |
- GLint level, |
- GLenum internal_format); |
+ GLenum target, |
+ GLuint source_id, |
+ GLuint target_id, |
+ GLint level, |
+ GLenum internal_format); |
// Wrapper for TexStorage2DEXT. |
void DoTexStorage2DEXT( |
- GLenum target, |
- GLint levels, |
- GLenum internal_format, |
- GLsizei width, |
- GLsizei height); |
+ GLenum target, |
+ GLint levels, |
+ GLenum internal_format, |
+ GLsizei width, |
+ GLsizei height); |
void DoProduceTextureCHROMIUM(GLenum target, const GLbyte* key); |
void DoConsumeTextureCHROMIUM(GLenum target, const GLbyte* key); |
+ void DoBindTexImage2DCHROMIUM( |
+ GLenum target, |
+ GLint image_id); |
+ void DoReleaseTexImage2DCHROMIUM( |
+ GLenum target, |
+ GLint image_id); |
+ |
// Creates a ProgramInfo for the given program. |
ProgramManager::ProgramInfo* CreateProgramInfo( |
GLuint client_id, GLuint service_id) { |
@@ -1268,6 +1281,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); |
@@ -8922,18 +8945,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 |
@@ -9333,6 +9353,88 @@ void GLES2DecoderImpl::DoPopGroupMarkerEXT(void) { |
debug_marker_manager_.PopGroup(); |
} |
+void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM( |
+ GLenum target, GLint image_id) { |
+ TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoBindTexImage2DCHROMIUM"); |
+ if (target != GL_TEXTURE_2D) { |
+ // This might be supported in the future. |
+ SetGLError( |
+ GL_INVALID_OPERATION, |
+ "glBindTexImage2DCHROMIUM", "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, |
+ "glBindTexImage2DCHROMIUM", "no texture bound"); |
+ return; |
+ } |
+ |
+ gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); |
+ if (!gl_image) { |
+ SetGLError(GL_INVALID_OPERATION, |
+ "glBindTexImage2DCHROMIUM", |
+ "no image found with the given ID"); |
+ return; |
+ } |
+ |
+ if (!gl_image->BindTexImage()) { |
+ SetGLError(GL_INVALID_OPERATION, |
+ "glBindTexImage2DCHROMIUM", |
+ "fail to bind image with the given ID"); |
+ return; |
+ } |
+ |
+ gfx::Size size = gl_image->GetSize(); |
+ texture_manager()->SetLevelInfo( |
+ info, target, 0, GL_RGBA, size.width(), size.height(), 1, 0, |
+ GL_RGBA, GL_UNSIGNED_BYTE, true); |
+ texture_manager()->SetLevelImage(info, target, 0, gl_image); |
+} |
+ |
+void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM( |
+ GLenum target, GLint image_id) { |
+ TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM"); |
+ if (target != GL_TEXTURE_2D) { |
+ // This might be supported in the future. |
+ SetGLError( |
+ GL_INVALID_OPERATION, |
+ "glReleaseTexImage2DCHROMIUM", "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, |
+ "glReleaseTexImage2DCHROMIUM", "no texture bound"); |
+ return; |
+ } |
+ |
+ gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); |
+ if (!gl_image) { |
+ SetGLError(GL_INVALID_OPERATION, |
+ "glReleaseTexImage2DCHROMIUM", |
+ "no image found with the given ID"); |
+ return; |
+ } |
+ |
+ // Do nothing when image is not currently bound. |
+ if (info->GetLevelImage(target, 0) != gl_image) |
+ return; |
+ |
+ gl_image->ReleaseTexImage(); |
+ |
+ texture_manager()->SetLevelInfo( |
+ info, target, 0, GL_RGBA, 0, 0, 1, 0, |
+ GL_RGBA, GL_UNSIGNED_BYTE, 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 |