Track texture memory globally
Also mostly consolidates texture creation
Change-Id: Ifea01303afda531dcec99b8fe2a0f64cf2f24420
diff --git a/libs/hwui/Texture.h b/libs/hwui/Texture.h
index 1c544b9..4e8e6dc 100644
--- a/libs/hwui/Texture.h
+++ b/libs/hwui/Texture.h
@@ -17,20 +17,27 @@
#ifndef ANDROID_HWUI_TEXTURE_H
#define ANDROID_HWUI_TEXTURE_H
+#include "GpuMemoryTracker.h"
+
#include <GLES2/gl2.h>
+#include <SkBitmap.h>
namespace android {
namespace uirenderer {
class Caches;
class UvMapper;
+class Layer;
/**
* Represents an OpenGL texture.
*/
-class Texture {
+class Texture : public GpuMemoryTracker {
public:
- Texture(Caches& caches) : mCaches(caches) { }
+ Texture(Caches& caches)
+ : GpuMemoryTracker(GpuObjectType::Texture)
+ , mCaches(caches)
+ { }
virtual ~Texture() { }
@@ -53,12 +60,55 @@
/**
* Convenience method to call glDeleteTextures() on this texture's id.
*/
- void deleteTexture() const;
+ void deleteTexture();
/**
- * Name of the texture.
+ * Sets the width, height, and format of the texture along with allocating
+ * the texture ID. Does nothing if the width, height, and format are already
+ * the requested values.
+ *
+ * The image data is undefined after calling this.
*/
- GLuint id = 0;
+ void resize(uint32_t width, uint32_t height, GLint format) {
+ upload(format, width, height, format, GL_UNSIGNED_BYTE, nullptr);
+ }
+
+ /**
+ * Updates this Texture with the contents of the provided SkBitmap,
+ * also setting the appropriate width, height, and format. It is not necessary
+ * to call resize() prior to this.
+ *
+ * Note this does not set the generation from the SkBitmap.
+ */
+ void upload(const SkBitmap& source);
+
+ /**
+ * Basically glTexImage2D/glTexSubImage2D.
+ */
+ void upload(GLint internalformat, uint32_t width, uint32_t height,
+ GLenum format, GLenum type, const void* pixels);
+
+ /**
+ * Wraps an existing texture.
+ */
+ void wrap(GLuint id, uint32_t width, uint32_t height, GLint format);
+
+ GLuint id() const {
+ return mId;
+ }
+
+ uint32_t width() const {
+ return mWidth;
+ }
+
+ uint32_t height() const {
+ return mHeight;
+ }
+
+ GLint format() const {
+ return mFormat;
+ }
+
/**
* Generation of the backing bitmap,
*/
@@ -68,14 +118,6 @@
*/
bool blend = false;
/**
- * Width of the backing bitmap.
- */
- uint32_t width = 0;
- /**
- * Height of the backing bitmap.
- */
- uint32_t height = 0;
- /**
* Indicates whether this texture should be cleaned up after use.
*/
bool cleanup = false;
@@ -100,6 +142,19 @@
void* isInUse = nullptr;
private:
+ // TODO: Temporarily grant private access to Layer, remove once
+ // Layer can be de-tangled from being a dual-purpose render target
+ // and external texture wrapper
+ friend class Layer;
+
+ // Returns true if the size changed, false if it was the same
+ bool updateSize(uint32_t width, uint32_t height, GLint format);
+
+ GLuint mId = 0;
+ uint32_t mWidth = 0;
+ uint32_t mHeight = 0;
+ GLint mFormat = 0;
+
/**
* Last wrap modes set on this texture.
*/
@@ -120,7 +175,7 @@
class AutoTexture {
public:
- AutoTexture(const Texture* texture)
+ AutoTexture(Texture* texture)
: texture(texture) {}
~AutoTexture() {
if (texture && texture->cleanup) {
@@ -129,7 +184,7 @@
}
}
- const Texture *const texture;
+ Texture* const texture;
}; // class AutoTexture
}; // namespace uirenderer