diff options
-rwxr-xr-x | gpu/command_buffer/build_gles2_cmd_buffer.py | 8 | ||||
-rw-r--r-- | gpu/command_buffer/common/gles2_cmd_utils_autogen.h | 1 | ||||
-rw-r--r-- | gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h | 14 | ||||
-rw-r--r-- | gpu/command_buffer/service/gl_utils.h | 5 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 5 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc | 40 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_validation_autogen.h | 1 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h | 8 | ||||
-rw-r--r-- | gpu/command_buffer/service/texture_manager.cc | 34 | ||||
-rw-r--r-- | gpu/command_buffer/service/texture_manager.h | 12 | ||||
-rw-r--r-- | third_party/khronos/GLES2/gl2ext.h | 12 | ||||
-rw-r--r-- | third_party/khronos/README.chromium | 1 |
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 |