summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorccameron@chromium.org <ccameron@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-14 21:38:56 +0000
committerccameron@chromium.org <ccameron@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-14 21:38:56 +0000
commit36f659637c64042672f48f39b040991a145b4d7b (patch)
treea99538b0c04c5d31947904950bc8b46975dffc96 /gpu
parent0ce5cf3f048f6a859d08f4fcaba69f0975c54239 (diff)
downloadchromium_src-36f659637c64042672f48f39b040991a145b4d7b.zip
chromium_src-36f659637c64042672f48f39b040991a145b4d7b.tar.gz
chromium_src-36f659637c64042672f48f39b040991a145b4d7b.tar.bz2
Add to the GL_CHROMIUM_gpu_memory_manager extension a
texture parameter indicating which textures are managed and which ones aren't. This will give the GPU memory manager precise information about how much memory is not under its control (e.g, because it is WebGL memory). BUG=164947 Review URL: https://codereview.chromium.org/11517013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173213 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rwxr-xr-xgpu/command_buffer/build_gles2_cmd_buffer.py8
-rw-r--r--gpu/command_buffer/common/gles2_cmd_utils_autogen.h1
-rw-r--r--gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h14
-rw-r--r--gpu/command_buffer/service/gl_utils.h5
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc5
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc40
-rw-r--r--gpu/command_buffer/service/gles2_cmd_validation_autogen.h1
-rw-r--r--gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h8
-rw-r--r--gpu/command_buffer/service/texture_manager.cc34
-rw-r--r--gpu/command_buffer/service/texture_manager.h12
10 files changed, 108 insertions, 20 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index 30b53fd..e58b5d7 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -845,6 +845,7 @@ _ENUM_LISTS = {
'valid': [
'GL_TEXTURE_MAG_FILTER',
'GL_TEXTURE_MIN_FILTER',
+ 'GL_TEXTURE_POOL_CHROMIUM',
'GL_TEXTURE_WRAP_S',
'GL_TEXTURE_WRAP_T',
],
@@ -852,6 +853,13 @@ _ENUM_LISTS = {
'GL_GENERATE_MIPMAP',
],
},
+ 'TexturePool': {
+ 'type': 'GLenum',
+ 'valid': [
+ 'GL_TEXTURE_POOL_MANAGED_CHROMIUM',
+ 'GL_TEXTURE_POOL_UNMANAGED_CHROMIUM',
+ ],
+ },
'TextureWrapMode': {
'type': 'GLenum',
'valid': [
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_autogen.h
index b2d155c..944c16f 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_utils_autogen.h
@@ -56,6 +56,7 @@ static std::string GetStringTextureInternalFormatStorage(uint32 value);
static std::string GetStringTextureMagFilterMode(uint32 value);
static std::string GetStringTextureMinFilterMode(uint32 value);
static std::string GetStringTextureParameter(uint32 value);
+static std::string GetStringTexturePool(uint32 value);
static std::string GetStringTextureTarget(uint32 value);
static std::string GetStringTextureUsage(uint32 value);
static std::string GetStringTextureWrapMode(uint32 value);
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
index c17da70..332d321 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
@@ -471,6 +471,7 @@ static GLES2Util::EnumToString enum_to_string_table[] = {
{ 0x84DE, "GL_TEXTURE30", },
{ 0x84DB, "GL_TEXTURE27", },
{ 0x84DC, "GL_TEXTURE28", },
+ { 0x6002, "GL_TEXTURE_POOL_UNMANAGED_CHROMIUM", },
{ 0x84DA, "GL_TEXTURE26", },
{ 0x8242, "GL_DEBUG_OUTPUT_SYNCHRONOUS", },
{ 0x8243, "GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH", },
@@ -636,8 +637,10 @@ static GLES2Util::EnumToString enum_to_string_table[] = {
{ 0x40000000, "GL_MULTISAMPLE_BUFFER_BIT6_QCOM", },
{ 0x9116, "GL_SYNC_FENCE_APPLE", },
{ 0x88EF, "GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM", },
+ { 0x6000, "GL_TEXTURE_POOL_CHROMIUM", },
{ 0x00000800, "GL_DEPTH_BUFFER_BIT3_QCOM", },
{ 0x1903, "GL_RED_EXT", },
+ { 0x6001, "GL_TEXTURE_POOL_MANAGED_CHROMIUM", },
{ 0x8CE2, "GL_COLOR_ATTACHMENT2_NV", },
{ 0x8BC1, "GL_COUNTER_RANGE_AMD", },
{ 0x8CE0, "GL_COLOR_ATTACHMENT0", },
@@ -1295,6 +1298,7 @@ std::string GLES2Util::GetStringTextureParameter(uint32 value) {
static EnumToString string_table[] = {
{ GL_TEXTURE_MAG_FILTER, "GL_TEXTURE_MAG_FILTER" },
{ GL_TEXTURE_MIN_FILTER, "GL_TEXTURE_MIN_FILTER" },
+ { GL_TEXTURE_POOL_CHROMIUM, "GL_TEXTURE_POOL_CHROMIUM" },
{ GL_TEXTURE_WRAP_S, "GL_TEXTURE_WRAP_S" },
{ GL_TEXTURE_WRAP_T, "GL_TEXTURE_WRAP_T" },
};
@@ -1302,6 +1306,16 @@ std::string GLES2Util::GetStringTextureParameter(uint32 value) {
string_table, arraysize(string_table), value);
}
+std::string GLES2Util::GetStringTexturePool(uint32 value) {
+ static EnumToString string_table[] = {
+ { GL_TEXTURE_POOL_MANAGED_CHROMIUM, "GL_TEXTURE_POOL_MANAGED_CHROMIUM" },
+ { GL_TEXTURE_POOL_UNMANAGED_CHROMIUM,
+ "GL_TEXTURE_POOL_UNMANAGED_CHROMIUM" },
+ };
+ return GLES2Util::GetQualifiedEnumString(
+ string_table, arraysize(string_table), value);
+}
+
std::string GLES2Util::GetStringTextureTarget(uint32 value) {
static EnumToString string_table[] = {
{ GL_TEXTURE_2D, "GL_TEXTURE_2D" },
diff --git a/gpu/command_buffer/service/gl_utils.h b/gpu/command_buffer/service/gl_utils.h
index 8fa9325..b6b4c0b 100644
--- a/gpu/command_buffer/service/gl_utils.h
+++ b/gpu/command_buffer/service/gl_utils.h
@@ -49,6 +49,11 @@
#define GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM 0x9242
#define GL_UNPACK_COLORSPACE_CONVERSION_CHROMIUM 0x9243
+// GL_CHROMIUM_gpu_memory_manager
+#define GL_TEXTURE_POOL_CHROMIUM 0x6000
+#define GL_TEXTURE_POOL_MANAGED_CHROMIUM 0x6001
+#define GL_TEXTURE_POOL_UNMANAGED_CHROMIUM 0x6002
+
// GL_ANGLE_pack_reverse_row_order
#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 9aef1d4..228ab36 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4865,6 +4865,11 @@ void GLES2DecoderImpl::DoTexParameteri(
SetGLErrorInvalidParam(error, "glTexParameteri", pname, param);
return;
}
+ // Texture tracking pools exist only for the command decoder, so
+ // do not pass them on to the native GL implementation.
+ if (pname == GL_TEXTURE_POOL_CHROMIUM) {
+ return;
+ }
glTexParameteri(target, pname, param);
}
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
index 1c0ec4e..df2a4f1 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
@@ -7935,6 +7935,46 @@ TEST_F(GLES2DecoderTest, ReleaseTexImage2DCHROMIUM) {
EXPECT_TRUE(info->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
}
+TEST_F(GLES2DecoderManualInitTest, GpuMemoryManagerCHROMIUM) {
+ InitDecoder(
+ "GL_ARB_texture_rectangle", // extensions
+ false, // has alpha
+ false, // has depth
+ false, // has stencil
+ false, // request alpha
+ false, // request depth
+ false, // request stencil
+ true); // bind generates resource
+
+ TextureManager::TextureInfo* info = GetTextureInfo(client_texture_id_);
+ EXPECT_TRUE(info != NULL);
+ EXPECT_TRUE(info->pool() == GL_TEXTURE_POOL_UNMANAGED_CHROMIUM);
+
+ DoBindTexture(
+ GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
+
+ TexParameteri cmd;
+ cmd.Init(GL_TEXTURE_2D,
+ GL_TEXTURE_POOL_CHROMIUM,
+ GL_TEXTURE_POOL_UNMANAGED_CHROMIUM);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+
+ cmd.Init(GL_TEXTURE_2D,
+ GL_TEXTURE_POOL_CHROMIUM,
+ GL_TEXTURE_POOL_MANAGED_CHROMIUM);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+
+ EXPECT_TRUE(info->pool() == GL_TEXTURE_POOL_MANAGED_CHROMIUM);
+
+ cmd.Init(GL_TEXTURE_2D,
+ GL_TEXTURE_POOL_CHROMIUM,
+ GL_NONE);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
+}
+
// TODO(gman): Complete this test.
// TEST_F(GLES2DecoderTest, CompressedTexImage2DGLError) {
// }
diff --git a/gpu/command_buffer/service/gles2_cmd_validation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_autogen.h
index f0b81df..c19ba38 100644
--- a/gpu/command_buffer/service/gles2_cmd_validation_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_validation_autogen.h
@@ -59,6 +59,7 @@ ValueValidator<GLenum> texture_internal_format_storage;
ValueValidator<GLenum> texture_mag_filter_mode;
ValueValidator<GLenum> texture_min_filter_mode;
ValueValidator<GLenum> texture_parameter;
+ValueValidator<GLenum> texture_pool;
ValueValidator<GLenum> texture_target;
ValueValidator<GLenum> texture_usage;
ValueValidator<GLenum> texture_wrap_mode;
diff --git a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
index 6817dda..d951e79 100644
--- a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
@@ -449,10 +449,16 @@ static GLenum valid_texture_min_filter_mode_table[] = {
static GLenum valid_texture_parameter_table[] = {
GL_TEXTURE_MAG_FILTER,
GL_TEXTURE_MIN_FILTER,
+ GL_TEXTURE_POOL_CHROMIUM,
GL_TEXTURE_WRAP_S,
GL_TEXTURE_WRAP_T,
};
+static GLenum valid_texture_pool_table[] = {
+ GL_TEXTURE_POOL_MANAGED_CHROMIUM,
+ GL_TEXTURE_POOL_UNMANAGED_CHROMIUM,
+};
+
static GLenum valid_texture_target_table[] = {
GL_TEXTURE_2D,
GL_TEXTURE_CUBE_MAP_POSITIVE_X,
@@ -629,6 +635,8 @@ Validators::Validators()
texture_parameter(
valid_texture_parameter_table, arraysize(
valid_texture_parameter_table)),
+ texture_pool(
+ valid_texture_pool_table, arraysize(valid_texture_pool_table)),
texture_target(
valid_texture_target_table, arraysize(valid_texture_target_table)),
texture_usage(
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc
index 7f6dadb..6dc4b84 100644
--- a/gpu/command_buffer/service/texture_manager.cc
+++ b/gpu/command_buffer/service/texture_manager.cc
@@ -101,7 +101,7 @@ TextureManager::TextureInfo::TextureInfo(TextureManager* manager,
wrap_s_(GL_REPEAT),
wrap_t_(GL_REPEAT),
usage_(GL_NONE),
- tracking_pool_(MemoryTracker::kUnmanaged),
+ pool_(GL_TEXTURE_POOL_UNMANAGED_CHROMIUM),
max_level_set_(-1),
texture_complete_(false),
cube_complete_(false),
@@ -476,6 +476,14 @@ GLenum TextureManager::TextureInfo::SetParameter(
}
mag_filter_ = param;
break;
+ case GL_TEXTURE_POOL_CHROMIUM:
+ if (!feature_info->validators()->texture_pool.IsValid(param)) {
+ return GL_INVALID_ENUM;
+ }
+ manager_->GetMemTracker(pool_)->TrackMemFree(estimated_size());
+ pool_ = param;
+ manager_->GetMemTracker(pool_)->TrackMemAlloc(estimated_size());
+ break;
case GL_TEXTURE_WRAP_S:
if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) {
return GL_INVALID_ENUM;
@@ -915,12 +923,12 @@ void TextureManager::SetLevelInfo(
num_uncleared_mips_ -= info->num_uncleared_mips();
DCHECK_GE(num_uncleared_mips_, 0);
- GetMemTracker(info->tracking_pool_)->TrackMemFree(info->estimated_size());
+ GetMemTracker(info->pool_)->TrackMemFree(info->estimated_size());
info->SetLevelInfo(
feature_info_, target, level, internal_format, width, height, depth,
border, format, type, cleared);
- GetMemTracker(info->tracking_pool_)->TrackMemAlloc(info->estimated_size());
- GetMemTracker(info->tracking_pool_)->UpdateMemRepresented();
+ GetMemTracker(info->pool_)->TrackMemAlloc(info->estimated_size());
+ GetMemTracker(info->pool_)->UpdateMemRepresented();
num_uncleared_mips_ += info->num_uncleared_mips();
if (!info->CanRender(feature_info_)) {
@@ -1072,10 +1080,10 @@ bool TextureManager::MarkMipmapsGenerated(TextureManager::TextureInfo* info) {
}
num_uncleared_mips_ -= info->num_uncleared_mips();
DCHECK_GE(num_uncleared_mips_, 0);
- GetMemTracker(info->tracking_pool_)->TrackMemFree(info->estimated_size());
+ GetMemTracker(info->pool_)->TrackMemFree(info->estimated_size());
bool result = info->MarkMipmapsGenerated(feature_info_);
- GetMemTracker(info->tracking_pool_)->TrackMemAlloc(info->estimated_size());
- GetMemTracker(info->tracking_pool_)->UpdateMemRepresented();
+ GetMemTracker(info->pool_)->TrackMemAlloc(info->estimated_size());
+ GetMemTracker(info->pool_)->UpdateMemRepresented();
num_uncleared_mips_ += info->num_uncleared_mips();
if (!info->CanRender(feature_info_)) {
@@ -1135,18 +1143,16 @@ void TextureManager::StopTracking(TextureManager::TextureInfo* texture) {
}
num_uncleared_mips_ -= texture->num_uncleared_mips();
DCHECK_GE(num_uncleared_mips_, 0);
- GetMemTracker(texture->tracking_pool_)->TrackMemFree(
- texture->estimated_size());
- GetMemTracker(texture->tracking_pool_)->UpdateMemRepresented();
+ GetMemTracker(texture->pool_)->TrackMemFree(texture->estimated_size());
+ GetMemTracker(texture->pool_)->UpdateMemRepresented();
}
-MemoryTypeTracker* TextureManager::GetMemTracker(
- MemoryTracker::Pool tracking_pool) {
+MemoryTypeTracker* TextureManager::GetMemTracker(GLenum tracking_pool) {
switch(tracking_pool) {
- case MemoryTracker::kManaged:
+ case GL_TEXTURE_POOL_MANAGED_CHROMIUM:
return memory_tracker_managed_.get();
break;
- case MemoryTracker::kUnmanaged:
+ case GL_TEXTURE_POOL_UNMANAGED_CHROMIUM:
return memory_tracker_unmanaged_.get();
break;
default:
diff --git a/gpu/command_buffer/service/texture_manager.h b/gpu/command_buffer/service/texture_manager.h
index 8c3100b..dc1cd7f 100644
--- a/gpu/command_buffer/service/texture_manager.h
+++ b/gpu/command_buffer/service/texture_manager.h
@@ -66,6 +66,10 @@ class GPU_EXPORT TextureManager {
return usage_;
}
+ GLenum pool() const {
+ return pool_;
+ }
+
int num_uncleared_mips() const {
return num_uncleared_mips_;
}
@@ -310,11 +314,7 @@ class GPU_EXPORT TextureManager {
GLenum wrap_s_;
GLenum wrap_t_;
GLenum usage_;
-
- // The accounting pool towards which the memory for this allocation should
- // be charged. This will be rolled into a new GLenum texture parameter in
- // a separate change.
- MemoryTracker::Pool tracking_pool_;
+ GLenum pool_;
// The maximum level that has been set.
GLint max_level_set_;
@@ -539,7 +539,7 @@ class GPU_EXPORT TextureManager {
void StartTracking(TextureInfo* info);
void StopTracking(TextureInfo* info);
- MemoryTypeTracker* GetMemTracker(MemoryTracker::Pool tracking_pool);
+ MemoryTypeTracker* GetMemTracker(GLenum texture_pool);
scoped_ptr<MemoryTypeTracker> memory_tracker_managed_;
scoped_ptr<MemoryTypeTracker> memory_tracker_unmanaged_;