summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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
-rw-r--r--third_party/khronos/GLES2/gl2ext.h12
-rw-r--r--third_party/khronos/README.chromium1
12 files changed, 121 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_;
diff --git a/third_party/khronos/GLES2/gl2ext.h b/third_party/khronos/GLES2/gl2ext.h
index f1fd2c4..35a28cb9 100644
--- a/third_party/khronos/GLES2/gl2ext.h
+++ b/third_party/khronos/GLES2/gl2ext.h
@@ -2018,6 +2018,18 @@ typedef void (GL_APIENTRYP PFNGLPOSTSUBBUFFERCHROMIUM) (GLint x, GLint y, GLint
#define GL_CHROMIUM_front_buffer_cached 1
#endif
+/* GL_CHROMIUM_gpu_memory_manager */
+/* This extension provides a mechanism for indicating to the implementation
+ which textures may be discarded by the client based on the recommendations
+ of the implementation's memory allocation changed callback (e.g, compositor
+ tiles), and which texture will not be discarded (e.g, WebGL textures). */
+#ifndef GL_CHROMIUM_gpu_memory_manager
+#define GL_CHROMIUM_gpu_memory_manager 1
+#define GL_TEXTURE_POOL_CHROMIUM 0x6000
+#define GL_TEXTURE_POOL_MANAGED_CHROMIUM 0x6001
+#define GL_TEXTURE_POOL_UNMANAGED_CHROMIUM 0x6002
+#endif
+
/* GL_ARB_robustness */
/* This extension is subsetted for the moment, incorporating only the
* enums necessary to describe the reasons that we might encounter for
diff --git a/third_party/khronos/README.chromium b/third_party/khronos/README.chromium
index 6a04ec6..7760f41 100644
--- a/third_party/khronos/README.chromium
+++ b/third_party/khronos/README.chromium
@@ -34,6 +34,7 @@ GLES2/gl2ext.h
- Added GL_CHROMIUM_texture_from_image
- Added GL_CHROMIUM_pixel_transfer_buffer_object
- Added GL_CHROMIUM_async_pixel_transfers
+ - Added GL_CHROMIUM_gpu_memory_manager
- Added GL_NVX_gpu_memory_info
- Added include of gl2chromium.h
EGL/eglplatform.h