Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(177)

Unified Diff: gpu/command_buffer/service/texture_manager.h

Issue 14844004: gpu: Refactor to support cross-channel shared textures (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix accidentally reverted behavior Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/test_helper.cc ('k') | gpu/command_buffer/service/texture_manager.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 2dd6af2dfa8ce3eeceede19f2dbd00eaeb5f6e37..af5eb0ccf2209973f869c27ca023ea9965f3edba 100644
--- a/gpu/command_buffer/service/texture_manager.h
+++ b/gpu/command_buffer/service/texture_manager.h
@@ -6,6 +6,7 @@
#define GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_
#include <list>
+#include <set>
#include <string>
#include <vector>
#include "base/basictypes.h"
@@ -25,13 +26,17 @@ class GLES2Decoder;
class Display;
class ErrorState;
class FeatureInfo;
+class FramebufferManager;
class TextureDefinition;
class TextureManager;
+class TextureRef;
// Info about Textures currently in the system.
-class GPU_EXPORT Texture : public base::RefCounted<Texture> {
+// This class wraps a real GL texture, keeping track of its meta-data. It is
+// jointly owned by possibly multiple TextureRef.
+class GPU_EXPORT Texture {
public:
- Texture(TextureManager* manager, GLuint service_id);
+ explicit Texture(GLuint service_id);
GLenum min_filter() const {
return min_filter_;
@@ -102,10 +107,6 @@ class GPU_EXPORT Texture : public base::RefCounted<Texture> {
// does not exist.
gfx::GLImage* GetLevelImage(GLint target, GLint level) const;
- bool IsDeleted() const {
- return deleted_;
- }
-
// Returns true of the given dimensions are inside the dimensions of the
// level and if the format and type match the level.
bool ValidForTexture(
@@ -119,7 +120,7 @@ class GPU_EXPORT Texture : public base::RefCounted<Texture> {
GLenum type) const;
bool IsValid() const {
- return target() && !IsDeleted();
+ return !!target();
}
void SetNotOwned() {
@@ -143,15 +144,13 @@ class GPU_EXPORT Texture : public base::RefCounted<Texture> {
return stream_texture_;
}
- gpu::AsyncPixelTransferState* GetAsyncTransferState() const {
- return async_transfer_state_.get();
- }
- void SetAsyncTransferState(scoped_ptr<gpu::AsyncPixelTransferState> state) {
- async_transfer_state_ = state.Pass();
- }
+ // Gets the async transfer state for this texture. Note: the transfer state is
+ // owned by a single TextureRef.
+ AsyncPixelTransferState* GetAsyncTransferState() const;
+
bool AsyncTransferIsInProgress() {
- return async_transfer_state_ &&
- async_transfer_state_->TransferIsInProgress();
+ AsyncPixelTransferState* state = GetAsyncTransferState();
+ return state && state->TransferIsInProgress();
}
void SetImmutable(bool immutable) {
@@ -172,10 +171,25 @@ class GPU_EXPORT Texture : public base::RefCounted<Texture> {
private:
friend class TextureManager;
+ friend class TextureRef;
friend class TextureTestHelper;
- friend class base::RefCounted<Texture>;
~Texture();
+ void AddTextureRef(TextureRef* ref);
+ void RemoveTextureRef(TextureRef* ref, bool have_context);
+ MemoryTypeTracker* GetMemTracker();
+
+ // Condition on which this texture is renderable. Can be ONLY_IF_NPOT if it
+ // depends on context support for non-power-of-two textures (i.e. will be
+ // renderable if NPOT support is in the context, otherwise not, e.g. texture
+ // with a NPOT level). ALWAYS means it doesn't depend on context features
+ // (e.g. complete POT), NEVER means it's not renderable regardless (e.g.
+ // incomplete).
+ enum CanRenderCondition {
+ CAN_RENDER_ALWAYS,
+ CAN_RENDER_NEVER,
+ CAN_RENDER_ONLY_IF_NPOT
+ };
struct LevelInfo {
LevelInfo();
@@ -230,6 +244,7 @@ class GPU_EXPORT Texture : public base::RefCounted<Texture> {
void SetStreamTexture(bool stream_texture) {
stream_texture_ = stream_texture;
+ UpdateCanRenderCondition();
}
// Marks a particular level as cleared or uncleared.
@@ -255,10 +270,6 @@ class GPU_EXPORT Texture : public base::RefCounted<Texture> {
// Makes each of the mip levels as though they were generated.
bool MarkMipmapsGenerated(const FeatureInfo* feature_info);
- void MarkAsDeleted() {
- deleted_ = true;
- }
-
bool NeedsMips() const {
return min_filter_ != GL_NEAREST && min_filter_ != GL_LINEAR;
}
@@ -293,18 +304,39 @@ class GPU_EXPORT Texture : public base::RefCounted<Texture> {
const FeatureInfo* feature_info,
GLenum target, GLint level, std::string* signature) const;
+ // Updates the unsafe textures count in all the managers referencing this
+ // texture.
+ void UpdateSafeToRenderFrom(bool cleared);
+
+ // Updates the uncleared mip count in all the managers referencing this
+ // texture.
+ void UpdateMipCleared(LevelInfo* info, bool cleared);
+
+ // Computes the CanRenderCondition flag.
+ CanRenderCondition GetCanRenderCondition() const;
+
+ // Updates the unrenderable texture count in all the managers referencing this
+ // texture.
+ void UpdateCanRenderCondition();
+
+ // Increment the framebuffer state change count in all the managers
+ // referencing this texture.
+ void IncAllFramebufferStateChangeCount();
+
// Info about each face and level of texture.
std::vector<std::vector<LevelInfo> > level_infos_;
- // The texture manager that manages this Texture.
- TextureManager* manager_;
+ // The texture refs that point to this Texture.
+ typedef std::set<TextureRef*> RefSet;
+ RefSet refs_;
+
+ // The single TextureRef that accounts for memory for this texture. Must be
+ // one of refs_.
+ TextureRef* memory_tracking_ref_;
// The id of the texure
GLuint service_id_;
- // Whether this texture has been deleted.
- bool deleted_;
-
// Whether all renderable mips of this texture have been cleared.
bool cleared_;
@@ -346,9 +378,6 @@ class GPU_EXPORT Texture : public base::RefCounted<Texture> {
// Whether this is a special streaming texture.
bool stream_texture_;
- // State to facilitate async transfers on this texture.
- scoped_ptr<gpu::AsyncPixelTransferState> async_transfer_state_;
-
// Whether the texture is immutable and no further changes to the format
// or dimensions of the texture object can be made.
bool immutable_;
@@ -356,9 +385,55 @@ class GPU_EXPORT Texture : public base::RefCounted<Texture> {
// Size in bytes this texture is assumed to take in memory.
uint32 estimated_size_;
+ // Cache of the computed CanRenderCondition flag.
+ CanRenderCondition can_render_condition_;
+
DISALLOW_COPY_AND_ASSIGN(Texture);
};
+// This class represents a texture in a client context group. It's mostly 1:1
+// with a client id, though it can outlive the client id if it's still bound to
+// a FBO or another context when destroyed.
+// Multiple TextureRef can point to the same texture with cross-context sharing.
+class GPU_EXPORT TextureRef : public base::RefCounted<TextureRef> {
+ public:
+ TextureRef(TextureManager* manager, Texture* texture);
+ static scoped_refptr<TextureRef> Create(TextureManager* manager,
+ GLuint service_id);
+ const Texture* texture() const { return texture_; }
+ Texture* texture() { return texture_; }
+ GLuint service_id() const { return texture_->service_id(); }
+
+ // Sets the async transfer state for this texture. Only a single TextureRef
+ // can set this on a given texture at any time.
+ // NOTE: this should be per-context rather than per-texture. crbug.com/240504
+ void SetAsyncTransferState(
+ scoped_ptr<AsyncPixelTransferState> state) {
+ DCHECK(!state || !texture_->GetAsyncTransferState());
+ async_transfer_state_ = state.Pass();
+ }
+
+ private:
+ friend class base::RefCounted<TextureRef>;
+ friend class Texture;
+ friend class TextureManager;
+
+ ~TextureRef();
+ const TextureManager* manager() const { return manager_; }
+ TextureManager* manager() { return manager_; }
+ AsyncPixelTransferState* async_transfer_state() const {
+ return async_transfer_state_.get();
+ }
+
+ TextureManager* manager_;
+ Texture* texture_;
+
+ // State to facilitate async transfers on this texture.
+ scoped_ptr<AsyncPixelTransferState> async_transfer_state_;
+
+ DISALLOW_COPY_AND_ASSIGN(TextureRef);
+};
+
// This class keeps track of the textures and their sizes so we can do NPOT and
// texture complete checking.
//
@@ -380,6 +455,10 @@ class GPU_EXPORT TextureManager {
GLsizei max_cube_map_texture_size);
~TextureManager();
+ void set_framebuffer_manager(FramebufferManager* manager) {
+ framebuffer_manager_ = manager;
+ }
+
// Init the texture manager.
bool Initialize();
@@ -420,13 +499,13 @@ class GPU_EXPORT TextureManager {
// True if this texture meets all the GLES2 criteria for rendering.
// See section 3.8.2 of the GLES2 spec.
- bool CanRender(const Texture* texture) const {
- return texture->CanRender(feature_info_);
+ bool CanRender(const TextureRef* ref) const {
+ return ref->texture()->CanRender(feature_info_);
}
// Returns true if mipmaps can be generated by GL.
- bool CanGenerateMipmaps(const Texture* texture) const {
- return texture->CanGenerateMipmaps(feature_info_);
+ bool CanGenerateMipmaps(const TextureRef* ref) const {
+ return ref->texture()->CanGenerateMipmaps(feature_info_);
}
// Sets the Texture's target
@@ -434,15 +513,15 @@ class GPU_EXPORT TextureManager {
// target: GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP
// max_levels: The maximum levels this type of target can have.
void SetTarget(
- Texture* texture,
+ TextureRef* ref,
GLenum target);
// Marks a texture as a stream texture.
- void SetStreamTexture(Texture* texture, bool stream_texture);
+ void SetStreamTexture(TextureRef* ref, bool stream_texture);
// Set the info for a particular level in a TexureInfo.
void SetLevelInfo(
- Texture* texture,
+ TextureRef* ref,
GLenum target,
GLint level,
GLenum internal_format,
@@ -455,27 +534,27 @@ class GPU_EXPORT TextureManager {
bool cleared);
// Adapter to call above function.
- void SetLevelInfoFromParams(Texture* texture,
+ void SetLevelInfoFromParams(TextureRef* ref,
const gpu::AsyncTexImage2DParams& params) {
SetLevelInfo(
- texture, params.target, params.level, params.internal_format,
+ ref, params.target, params.level, params.internal_format,
params.width, params.height, 1 /* depth */,
params.border, params.format,
params.type, true /* cleared */ );
}
// Save the texture definition and leave it undefined.
- TextureDefinition* Save(Texture* texture);
+ TextureDefinition* Save(TextureRef* ref);
// Redefine all the levels from the texture definition.
bool Restore(
const char* function_name,
GLES2Decoder* decoder,
- Texture* texture,
+ TextureRef* ref,
TextureDefinition* definition);
// Sets a mip as cleared.
- void SetLevelCleared(Texture* texture, GLenum target,
+ void SetLevelCleared(TextureRef* ref, GLenum target,
GLint level, bool cleared);
// Sets a texture parameter of a Texture
@@ -483,24 +562,24 @@ class GPU_EXPORT TextureManager {
// TODO(gman): Expand to SetParameteri,f,iv,fv
void SetParameter(
const char* function_name, ErrorState* error_state,
- Texture* texture, GLenum pname, GLint param);
+ TextureRef* ref, GLenum pname, GLint param);
// Makes each of the mip levels as though they were generated.
// Returns false if that's not allowed for the given texture.
- bool MarkMipmapsGenerated(Texture* texture);
+ bool MarkMipmapsGenerated(TextureRef* ref);
// Clears any uncleared renderable levels.
- bool ClearRenderableLevels(GLES2Decoder* decoder, Texture* texture);
+ bool ClearRenderableLevels(GLES2Decoder* decoder, TextureRef* ref);
// Clear a specific level.
bool ClearTextureLevel(
- GLES2Decoder* decoder,Texture* texture, GLenum target, GLint level);
+ GLES2Decoder* decoder, TextureRef* ref, GLenum target, GLint level);
// Creates a new texture info.
- Texture* CreateTexture(GLuint client_id, GLuint service_id);
+ TextureRef* CreateTexture(GLuint client_id, GLuint service_id);
// Gets the texture info for the given texture.
- Texture* GetTexture(GLuint client_id) const;
+ TextureRef* GetTexture(GLuint client_id) const;
// Removes a texture info.
void RemoveTexture(GLuint client_id);
@@ -508,7 +587,7 @@ class GPU_EXPORT TextureManager {
// Gets a client id for a given service id.
bool GetClientId(GLuint service_id, GLuint* client_id) const;
- Texture* GetDefaultTextureInfo(GLenum target) {
+ TextureRef* GetDefaultTextureInfo(GLenum target) {
switch (target) {
case GL_TEXTURE_2D:
return default_textures_[kTexture2D];
@@ -559,27 +638,34 @@ class GPU_EXPORT TextureManager {
}
void SetLevelImage(
- Texture* texture,
+ TextureRef* ref,
GLenum target,
GLint level,
gfx::GLImage* image);
void AddToSignature(
- Texture* texture,
+ TextureRef* ref,
GLenum target,
GLint level,
std::string* signature) const;
private:
friend class Texture;
+ friend class TextureRef;
// Helper for Initialize().
- scoped_refptr<Texture> CreateDefaultAndBlackTextures(
+ scoped_refptr<TextureRef> CreateDefaultAndBlackTextures(
GLenum target,
GLuint* black_texture);
- void StartTracking(Texture* texture);
- void StopTracking(Texture* texture);
+ void StartTracking(TextureRef* texture);
+ void StopTracking(TextureRef* texture);
+
+ void UpdateSafeToRenderFrom(int delta);
+ void UpdateUnclearedMips(int delta);
+ void UpdateCanRenderCondition(Texture::CanRenderCondition old_condition,
+ Texture::CanRenderCondition new_condition);
+ void IncFramebufferStateChangeCount();
MemoryTypeTracker* GetMemTracker(GLenum texture_pool);
scoped_ptr<MemoryTypeTracker> memory_tracker_managed_;
@@ -587,8 +673,10 @@ class GPU_EXPORT TextureManager {
scoped_refptr<FeatureInfo> feature_info_;
+ FramebufferManager* framebuffer_manager_;
+
// Info for each texture in the system.
- typedef base::hash_map<GLuint, scoped_refptr<Texture> > TextureMap;
+ typedef base::hash_map<GLuint, scoped_refptr<TextureRef> > TextureMap;
TextureMap textures_;
GLsizei max_texture_size_;
@@ -612,7 +700,7 @@ class GPU_EXPORT TextureManager {
GLuint black_texture_ids_[kNumDefaultTextures];
// The default textures for each target (texture name = 0)
- scoped_refptr<Texture> default_textures_[kNumDefaultTextures];
+ scoped_refptr<TextureRef> default_textures_[kNumDefaultTextures];
DISALLOW_COPY_AND_ASSIGN(TextureManager);
};
« no previous file with comments | « gpu/command_buffer/service/test_helper.cc ('k') | gpu/command_buffer/service/texture_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698