Index: gpu/command_buffer/service/texture_manager.cc |
=================================================================== |
--- gpu/command_buffer/service/texture_manager.cc (revision 57082) |
+++ gpu/command_buffer/service/texture_manager.cc (working copy) |
@@ -75,6 +75,15 @@ |
} |
texture_infos_.erase(texture_infos_.begin()); |
} |
+ if (have_context) { |
+ GLuint ids[] = { |
+ black_2d_texture_id_, |
+ black_cube_texture_id_, |
+ default_texture_2d_->service_id(), |
+ default_texture_cube_map_->service_id(), |
+ }; |
+ glDeleteTextures(arraysize(ids), ids); |
+ } |
} |
bool TextureManager::TextureInfo::CanRender( |
@@ -352,18 +361,50 @@ |
max_cube_map_levels_(ComputeMipMapCount(max_cube_map_texture_size, |
max_cube_map_texture_size, |
max_cube_map_texture_size)), |
- num_unrenderable_textures_(0) { |
- default_texture_2d_ = TextureInfo::Ref(new TextureInfo(0)); |
+ num_unrenderable_textures_(0), |
+ black_2d_texture_id_(0), |
+ black_cube_texture_id_(0) { |
+} |
+ |
+bool TextureManager::Initialize() { |
+ // TODO(gman): The default textures have to be real textures, not the 0 |
+ // texture because we simulate non shared resources on top of shared |
+ // resources and all contexts that share resource share the same default |
+ // texture. |
+ |
+ // Make default textures and texture for replacing non-renderable textures. |
+ GLuint ids[4]; |
+ glGenTextures(arraysize(ids), ids); |
+ static uint8 black[] = {0, 0, 0, 255}; |
+ for (int ii = 0; ii < 2; ++ii) { |
+ glBindTexture(GL_TEXTURE_2D, ids[ii]); |
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, |
+ GL_UNSIGNED_BYTE, black); |
+ glBindTexture(GL_TEXTURE_CUBE_MAP, ids[2 + ii]); |
+ for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) { |
+ glTexImage2D(GLES2Util::IndexToGLFaceTarget(ii), 0, GL_RGBA, 1, 1, 0, |
+ GL_RGBA, GL_UNSIGNED_BYTE, black); |
+ } |
+ } |
+ glBindTexture(GL_TEXTURE_2D, 0); |
+ glBindTexture(GL_TEXTURE_CUBE_MAP, 0); |
+ |
+ default_texture_2d_ = TextureInfo::Ref(new TextureInfo(ids[1])); |
SetInfoTarget(default_texture_2d_, GL_TEXTURE_2D); |
default_texture_2d_->SetLevelInfo( |
this, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE); |
- default_texture_cube_map_ = TextureInfo::Ref(new TextureInfo(0)); |
+ default_texture_cube_map_ = TextureInfo::Ref(new TextureInfo(ids[3])); |
SetInfoTarget(default_texture_cube_map_, GL_TEXTURE_CUBE_MAP); |
for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) { |
default_texture_cube_map_->SetLevelInfo( |
this, GLES2Util::IndexToGLFaceTarget(ii), |
0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE); |
} |
+ |
+ black_2d_texture_id_ = ids[0]; |
+ black_cube_texture_id_ = ids[2]; |
+ |
+ return true; |
} |
bool TextureManager::ValidForTarget( |