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 6b254e0966bb8ad2de4ee746bf53e6f7cb3dc269..8c24d3cd1df5f8e04a458d173ec5106f5d3971bd 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -1191,8 +1191,7 @@ class GLES2DecoderImpl : public GLES2Decoder, |
void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer); |
// overridden from GLES2Decoder |
- bool ClearLevel(unsigned service_id, |
- unsigned bind_target, |
+ bool ClearLevel(Texture* texture, |
unsigned target, |
int level, |
unsigned internal_format, |
@@ -2445,7 +2444,6 @@ bool GLES2DecoderImpl::Initialize( |
surfaceless_ = surface->IsSurfaceless() && !offscreen; |
set_initialized(); |
- gpu_tracer_.reset(new GPUTracer(this)); |
gpu_state_tracer_ = GPUStateTracer::Create(&state_); |
if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
@@ -2476,6 +2474,9 @@ bool GLES2DecoderImpl::Initialize( |
if (!attrib_parser.Parse(attribs)) |
return false; |
+ // Create GPU Tracer for timing values. |
+ gpu_tracer_.reset(new GPUTracer(this)); |
+ |
// Save the loseContextWhenOutOfMemory context creation attribute. |
lose_context_when_out_of_memory_ = |
attrib_parser.lose_context_when_out_of_memory; |
@@ -2858,8 +2859,14 @@ Capabilities GLES2DecoderImpl::GetCapabilities() { |
caps.egl_image_external = |
feature_info_->feature_flags().oes_egl_image_external; |
+ caps.texture_format_atc = |
+ feature_info_->feature_flags().ext_texture_format_atc; |
caps.texture_format_bgra8888 = |
feature_info_->feature_flags().ext_texture_format_bgra8888; |
+ caps.texture_format_dxt1 = |
+ feature_info_->feature_flags().ext_texture_format_dxt1; |
+ caps.texture_format_dxt5 = |
+ feature_info_->feature_flags().ext_texture_format_dxt5; |
caps.texture_format_etc1 = |
feature_info_->feature_flags().oes_compressed_etc1_rgb8_texture; |
caps.texture_format_etc1_npot = |
@@ -5133,8 +5140,7 @@ error::Error GLES2DecoderImpl::HandleDeleteShader(uint32 immediate_data_size, |
Shader* shader = GetShader(client_id); |
if (shader) { |
if (!shader->IsDeleted()) { |
- glDeleteShader(shader->service_id()); |
- shader_manager()->MarkAsDeleted(shader); |
+ shader_manager()->Delete(shader); |
} |
} else { |
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glDeleteShader", "unknown shader"); |
@@ -8405,8 +8411,7 @@ void GLES2DecoderImpl::DoBufferSubData( |
} |
bool GLES2DecoderImpl::ClearLevel( |
- unsigned service_id, |
- unsigned bind_target, |
+ Texture* texture, |
unsigned target, |
int level, |
unsigned internal_format, |
@@ -8428,8 +8433,8 @@ bool GLES2DecoderImpl::ClearLevel( |
GLenum attachment = have_stencil ? GL_DEPTH_STENCIL_ATTACHMENT : |
GL_DEPTH_ATTACHMENT; |
- glFramebufferTexture2DEXT( |
- GL_DRAW_FRAMEBUFFER_EXT, attachment, target, service_id, level); |
+ glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, attachment, target, |
+ texture->service_id(), level); |
// ANGLE promises a depth only attachment ok. |
if (glCheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT) != |
GL_FRAMEBUFFER_COMPLETE) { |
@@ -8488,12 +8493,13 @@ bool GLES2DecoderImpl::ClearLevel( |
// Assumes the size has already been checked. |
scoped_ptr<char[]> zero(new char[size]); |
memset(zero.get(), 0, size); |
- glBindTexture(bind_target, service_id); |
+ glBindTexture(texture->target(), texture->service_id()); |
+ bool has_images = texture->HasImages(); |
GLint y = 0; |
while (y < height) { |
GLint h = y + tile_height > height ? height - y : tile_height; |
- if (is_texture_immutable || h != height) { |
+ if (is_texture_immutable || h != height || has_images) { |
glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); |
} else { |
glTexImage2D( |
@@ -8502,9 +8508,10 @@ bool GLES2DecoderImpl::ClearLevel( |
} |
y += tile_height; |
} |
- TextureRef* texture = texture_manager()->GetTextureInfoForTarget( |
- &state_, bind_target); |
- glBindTexture(bind_target, texture ? texture->service_id() : 0); |
+ TextureRef* bound_texture = |
+ texture_manager()->GetTextureInfoForTarget(&state_, texture->target()); |
+ glBindTexture(texture->target(), |
+ bound_texture ? bound_texture->service_id() : 0); |
return true; |
} |
@@ -9165,10 +9172,8 @@ void GLES2DecoderImpl::DoCopyTexImage2D( |
copyWidth != width || |
copyHeight != height) { |
// some part was clipped so clear the texture. |
- if (!ClearLevel( |
- texture->service_id(), texture->target(), |
- target, level, internal_format, internal_format, GL_UNSIGNED_BYTE, |
- width, height, texture->IsImmutable())) { |
+ if (!ClearLevel(texture, target, level, internal_format, internal_format, |
+ GL_UNSIGNED_BYTE, width, height, texture->IsImmutable())) { |
LOCAL_SET_GL_ERROR( |
GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); |
return; |
@@ -9441,7 +9446,8 @@ error::Error GLES2DecoderImpl::DoTexSubImage2D( |
} |
if (!texture_state_.texsubimage2d_faster_than_teximage2d && |
- !texture->IsImmutable()) { |
+ !texture->IsImmutable() && |
+ !texture->HasImages()) { |
ScopedTextureUploadTimer timer(&texture_state_); |
GLenum internal_format; |
GLenum tex_type; |