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 63f73a9aef2c79d4310d40dcf5491980c2cc856f..c67c78fafd29985323114fc96eb62cc676af3f78 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -517,6 +517,18 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
// texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with |
// glBindTexture |
TextureManager::TextureInfo::Ref bound_texture_cube_map; |
+ |
+ // texture currently bound to this unit's GL_TEXTURE_EXTERNAL_OES with |
+ // glBindTexture |
+ TextureManager::TextureInfo::Ref bound_texture_external_oes; |
+ |
+ TextureManager::TextureInfo::Ref GetInfoForSamplerType(GLenum type) { |
+ DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || |
+ type == GL_SAMPLER_EXTERNAL_OES); |
+ return type == GL_SAMPLER_2D ? bound_texture_2d : |
+ (type == GL_SAMPLER_EXTERNAL_OES ? bound_texture_external_oes : |
+ bound_texture_cube_map); |
+ } |
}; |
// Initialize or re-initialize the shader translator. |
@@ -1094,6 +1106,9 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: |
info = unit.bound_texture_cube_map; |
break; |
+ case GL_TEXTURE_EXTERNAL_OES: |
+ info = unit.bound_texture_external_oes; |
+ break; |
// Note: If we ever support TEXTURE_RECTANGLE as a target, be sure to |
// track |texture_| with the currently bound TEXTURE_RECTANGLE texture, |
// because |texture_| is used by the FBO rendering mechanism for readback |
@@ -1105,6 +1120,14 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
return (info && !info->IsDeleted()) ? info : NULL; |
} |
+ GLenum GetBindTargetForSamplerType(GLenum type) { |
+ DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || |
+ type == GL_SAMPLER_EXTERNAL_OES); |
+ return type == GL_SAMPLER_2D ? GL_TEXTURE_2D : |
+ (type == GL_SAMPLER_EXTERNAL_OES ? GL_TEXTURE_EXTERNAL_OES : |
+ GL_TEXTURE_CUBE_MAP); |
+ } |
+ |
// Gets the framebuffer info for a particular target. |
FramebufferManager::FramebufferInfo* GetFramebufferInfoForTarget( |
GLenum target) { |
@@ -1726,9 +1749,14 @@ bool GLES2DecoderImpl::Initialize( |
new TextureUnit[group_->max_texture_units()]); |
for (uint32 tt = 0; tt < group_->max_texture_units(); ++tt) { |
glActiveTexture(GL_TEXTURE0 + tt); |
- // Do cube map first because we want the last bind to be 2D. |
- TextureManager::TextureInfo* info = |
- texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); |
+ // We want the last bind to be 2D. |
+ TextureManager::TextureInfo* info; |
+ if (feature_info_->feature_flags().oes_egl_image_external) { |
+ info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_EXTERNAL_OES); |
+ texture_units_[tt].bound_texture_external_oes = info; |
+ glBindTexture(GL_TEXTURE_EXTERNAL_OES, info->service_id()); |
+ } |
+ info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); |
texture_units_[tt].bound_texture_cube_map = info; |
glBindTexture(GL_TEXTURE_CUBE_MAP, info->service_id()); |
info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D); |
@@ -2821,6 +2849,9 @@ void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) { |
case GL_TEXTURE_CUBE_MAP: |
unit.bound_texture_cube_map = info; |
break; |
+ case GL_TEXTURE_EXTERNAL_OES: |
+ unit.bound_texture_external_oes = info; |
+ break; |
default: |
NOTREACHED(); // Validation should prevent us getting here. |
break; |
@@ -3115,6 +3146,20 @@ bool GLES2DecoderImpl::GetHelper( |
} |
} |
return true; |
+ case GL_TEXTURE_BINDING_EXTERNAL_OES: |
+ *num_written = 1; |
+ if (params) { |
+ TextureUnit& unit = texture_units_[active_texture_unit_]; |
+ if (unit.bound_texture_external_oes) { |
+ GLuint client_id = 0; |
+ texture_manager()->GetClientId( |
+ unit.bound_texture_external_oes->service_id(), &client_id); |
+ *params = client_id; |
+ } else { |
+ *params = 0; |
+ } |
+ } |
+ return true; |
default: |
*num_written = util_.GLGetNumValuesReturned(pname); |
return false; |
@@ -3884,7 +3929,8 @@ void GLES2DecoderImpl::DoUniform1iv( |
if (!PrepForSetUniformByLocation(location, "glUniform1iv", &type, &count)) { |
return; |
} |
- if (type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE) { |
+ if (type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || |
+ type == GL_SAMPLER_EXTERNAL_OES) { |
current_program_->SetSamplers(location, count, value); |
} |
glUniform1iv(location, count, value); |
@@ -4110,15 +4156,12 @@ bool GLES2DecoderImpl::SetBlackTextureForNonRenderableTextures() { |
if (texture_unit_index < group_->max_texture_units()) { |
TextureUnit& texture_unit = texture_units_[texture_unit_index]; |
TextureManager::TextureInfo* texture_info = |
- uniform_info->type == GL_SAMPLER_2D ? |
- texture_unit.bound_texture_2d : |
- texture_unit.bound_texture_cube_map; |
+ texture_unit.GetInfoForSamplerType(uniform_info->type); |
if (!texture_info || !texture_info->CanRender(feature_info_)) { |
textures_set = true; |
glActiveTexture(GL_TEXTURE0 + texture_unit_index); |
glBindTexture( |
- uniform_info->type == GL_SAMPLER_2D ? GL_TEXTURE_2D : |
- GL_TEXTURE_CUBE_MAP, |
+ GetBindTargetForSamplerType(uniform_info->type), |
texture_manager()->black_texture_id(uniform_info->type)); |
} |
} |