Index: gpu/command_buffer/service/texture_manager.h |
diff --git a/gpu/command_buffer/service/texture_manager.h b/gpu/command_buffer/service/texture_manager.h |
index dbb22186c87251f49cb736ddb726c3bb69450b89..0fccbf6cf1f96a9d996bcfcf44810de7904e8b7e 100644 |
--- a/gpu/command_buffer/service/texture_manager.h |
+++ b/gpu/command_buffer/service/texture_manager.h |
@@ -16,6 +16,7 @@ namespace gpu { |
namespace gles2 { |
class FeatureInfo; |
+class GLES2Decoder; |
// This class keeps track of the textures and their sizes so we can do NPOT and |
// texture complete checking. |
@@ -32,6 +33,8 @@ class TextureManager { |
explicit TextureInfo(GLuint service_id) |
: service_id_(service_id), |
deleted_(false), |
+ cleared_(true), |
+ num_uncleared_mips_(0), |
target_(0), |
min_filter_(GL_NEAREST_MIPMAP_LINEAR), |
mag_filter_(GL_LINEAR), |
@@ -63,6 +66,10 @@ class TextureManager { |
return wrap_t_; |
} |
+ int num_uncleared_mips() const { |
+ return num_uncleared_mips_; |
+ } |
+ |
// True if this texture meets all the GLES2 criteria for rendering. |
// See section 3.8.2 of the GLES2 spec. |
bool CanRender(const FeatureInfo* feature_info) const; |
@@ -101,6 +108,10 @@ class TextureManager { |
return npot_; |
} |
+ bool SafeToRenderFrom() const { |
+ return cleared_; |
+ } |
+ |
// Returns true if mipmaps can be generated by GL. |
bool CanGenerateMipmaps(const FeatureInfo* feature_info) const; |
@@ -146,7 +157,7 @@ class TextureManager { |
} |
void DetachFromFramebuffer() { |
- DCHECK(framebuffer_attachment_count_ > 0); |
+ DCHECK_GT(framebuffer_attachment_count_, 0); |
--framebuffer_attachment_count_; |
} |
@@ -158,6 +169,9 @@ class TextureManager { |
return stream_texture_; |
} |
+ // Whether a particular level/face is cleared. |
+ bool IsLevelCleared(GLenum target, GLint level); |
+ |
private: |
friend class TextureManager; |
friend class base::RefCounted<TextureInfo>; |
@@ -166,7 +180,9 @@ class TextureManager { |
struct LevelInfo { |
LevelInfo() |
- : valid(false), |
+ : cleared(true), |
+ target(0), |
+ level(-1), |
internal_format(0), |
width(0), |
height(0), |
@@ -176,7 +192,9 @@ class TextureManager { |
type(0) { |
} |
- bool valid; |
+ bool cleared; |
+ GLenum target; |
+ GLint level; |
GLenum internal_format; |
GLsizei width; |
GLsizei height; |
@@ -197,7 +215,22 @@ class TextureManager { |
GLsizei depth, |
GLint border, |
GLenum format, |
- GLenum type); |
+ GLenum type, |
+ bool cleared); |
+ |
+ // Marks a particular level as cleared or uncleared. |
+ void SetLevelCleared(GLenum target, GLint level); |
+ |
+ // Updates the cleared flag for this texture by inspecting all the mips. |
+ void UpdateCleared(); |
+ |
+ // Clears any renderable uncleared levels. |
+ // Returns false if a GL error was generated. |
+ bool ClearRenderableLevels(GLES2Decoder* decoder); |
+ |
+ // Clears the level. |
+ // Returns false if a GL error was generated. |
+ bool ClearLevel(GLES2Decoder* decoder, GLenum target, GLint level); |
// Sets a texture parameter. |
// TODO(gman): Expand to SetParameteri,f,iv,fv |
@@ -236,6 +269,11 @@ class TextureManager { |
// Whether this texture has been deleted. |
bool deleted_; |
+ // Whether all renderable mips of this texture have been cleared. |
+ bool cleared_; |
+ |
+ int num_uncleared_mips_; |
+ |
// The target. 0 if unset, otherwise GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP. |
GLenum target_; |
@@ -333,7 +371,11 @@ class TextureManager { |
GLsizei depth, |
GLint border, |
GLenum format, |
- GLenum type); |
+ GLenum type, |
+ bool cleared); |
+ |
+ // Sets a mip as cleared. |
+ void SetLevelCleared(TextureInfo* info, GLenum target, GLint level); |
// Sets a texture parameter of a TextureInfo |
// TODO(gman): Expand to SetParameteri,f,iv,fv |
@@ -343,9 +385,14 @@ class TextureManager { |
// Makes each of the mip levels as though they were generated. |
// Returns false if that's not allowed for the given texture. |
- bool MarkMipmapsGenerated( |
- const FeatureInfo* feature_info, |
- TextureManager::TextureInfo* info); |
+ bool MarkMipmapsGenerated(const FeatureInfo* feature_info, TextureInfo* info); |
+ |
+ // Clears any uncleared renderable levels. |
+ bool ClearRenderableLevels(GLES2Decoder* decoder, TextureInfo* info); |
+ |
+ // Clear a specific level. |
+ bool ClearTextureLevel( |
+ GLES2Decoder* decoder,TextureInfo* info, GLenum target, GLint level); |
// Creates a new texture info. |
TextureInfo* CreateTextureInfo( |
@@ -378,6 +425,14 @@ class TextureManager { |
return num_unrenderable_textures_ > 0; |
} |
+ bool HaveUnsafeTextures() const { |
+ return num_unsafe_textures_ > 0; |
+ } |
+ |
+ bool HaveUnclearedMips() const { |
+ return num_uncleared_mips_ > 0; |
+ } |
+ |
GLuint black_texture_id(GLenum target) const { |
switch (target) { |
case GL_SAMPLER_2D: |
@@ -403,6 +458,8 @@ class TextureManager { |
GLint max_cube_map_levels_; |
int num_unrenderable_textures_; |
+ int num_unsafe_textures_; |
+ int num_uncleared_mips_; |
// Black (0,0,0,1) textures for when non-renderable textures are used. |
// NOTE: There is no corresponding TextureInfo for these textures. |