mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 05:31:01 +00:00 
			
		
		
		
	-Ability to debug video memory usage
-Small fix to xml saver (swapping > and <)
This commit is contained in:
		
							parent
							
								
									f6a790d58c
								
							
						
					
					
						commit
						b59c86f6f9
					
				
					 18 changed files with 271 additions and 7 deletions
				
			
		|  | @ -34,6 +34,33 @@ | |||
| #include "print_string.h" | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| 
 | ||||
| const char* Image::format_names[Image::FORMAT_MAX]={ | ||||
| 	"Grayscale", | ||||
| 	"Intensity", | ||||
| 	"GrayscaleAlpha", | ||||
| 	"RGB", | ||||
| 	"RGBA", | ||||
| 	"Indexed", | ||||
| 	"IndexedAlpha", | ||||
| 	"YUV422", | ||||
| 	"YUV444", | ||||
| 	"BC1", | ||||
| 	"BC2", | ||||
| 	"BC3", | ||||
| 	"BC4", | ||||
| 	"BC5", | ||||
| 	"PVRTC2", | ||||
| 	"PVRTC2Alpha", | ||||
| 	"PVRTC4", | ||||
| 	"PVRTC4Alpha", | ||||
| 	"ETC", | ||||
| 	"ATC", | ||||
| 	"ATCAlphaExp", | ||||
| 	"ATCAlphaInterp", | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| SavePNGFunc Image::save_png_func = NULL; | ||||
| 
 | ||||
| void Image::_put_pixel(int p_x,int p_y, const BColor& p_color, unsigned char *p_data) { | ||||
|  | @ -2355,6 +2382,12 @@ void Image::fix_alpha_edges() { | |||
| 
 | ||||
| } | ||||
| 
 | ||||
| String Image::get_format_name(Format p_format) { | ||||
| 
 | ||||
| 	ERR_FAIL_INDEX_V(p_format,FORMAT_MAX,String()); | ||||
| 	return format_names[p_format]; | ||||
| } | ||||
| 
 | ||||
| Image::Image(const uint8_t* p_png,int p_len) { | ||||
| 
 | ||||
| 	width=0; | ||||
|  |  | |||
|  | @ -87,6 +87,7 @@ public: | |||
| 		FORMAT_MAX | ||||
| 	}; | ||||
| 
 | ||||
| 	static const char* format_names[FORMAT_MAX]; | ||||
| 	enum Interpolation { | ||||
| 	 | ||||
| 		INTERPOLATE_NEAREST, | ||||
|  | @ -352,6 +353,8 @@ public: | |||
| 	Image get_rect(const Rect2& p_area) const; | ||||
| 
 | ||||
| 	static void set_compress_bc_func(void (*p_compress_func)(Image *)); | ||||
| 	static String get_format_name(Format p_format); | ||||
| 
 | ||||
| 	Image(const uint8_t* p_mem_png, int p_len=-1); | ||||
| 	Image(const char **p_xpm); | ||||
| 	~Image(); | ||||
|  |  | |||
|  | @ -2056,8 +2056,8 @@ Error ResourceFormatLoaderXML::rename_dependencies(const String &p_path,const Ma | |||
| void ResourceFormatSaverXMLInstance::escape(String& p_str) { | ||||
| 
 | ||||
| 	p_str=p_str.replace("&","&"); | ||||
| 	p_str=p_str.replace("<",">"); | ||||
| 	p_str=p_str.replace(">","<"); | ||||
| 	p_str=p_str.replace("<","<"); | ||||
| 	p_str=p_str.replace(">",">"); | ||||
| 	p_str=p_str.replace("'","'"); | ||||
| 	p_str=p_str.replace("\"","""); | ||||
| 	for (char i=1;i<32;i++) { | ||||
|  |  | |||
|  | @ -31,6 +31,28 @@ | |||
| #include "io/ip.h" | ||||
| #include "globals.h" | ||||
| 
 | ||||
| void ScriptDebuggerRemote::_send_video_memory() { | ||||
| 
 | ||||
| 	List<ResourceUsage> usage; | ||||
| 	if (resource_usage_func) | ||||
| 		resource_usage_func(&usage); | ||||
| 
 | ||||
| 	usage.sort(); | ||||
| 
 | ||||
| 	packet_peer_stream->put_var("message:video_mem"); | ||||
| 	packet_peer_stream->put_var(usage.size()*4); | ||||
| 
 | ||||
| 
 | ||||
| 	for(List<ResourceUsage>::Element *E=usage.front();E;E=E->next()) { | ||||
| 
 | ||||
| 		packet_peer_stream->put_var(E->get().path); | ||||
| 		packet_peer_stream->put_var(E->get().type); | ||||
| 		packet_peer_stream->put_var(E->get().format); | ||||
| 		packet_peer_stream->put_var(E->get().vram); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| Error ScriptDebuggerRemote::connect_to_host(const String& p_host,uint16_t p_port) { | ||||
| 
 | ||||
| 
 | ||||
|  | @ -248,6 +270,9 @@ void ScriptDebuggerRemote::debug(ScriptLanguage *p_script,bool p_can_continue) { | |||
| 				if (request_scene_tree) | ||||
| 					request_scene_tree(request_scene_tree_ud); | ||||
| 
 | ||||
| 			} else if (command=="request_video_mem") { | ||||
| 
 | ||||
| 				_send_video_memory(); | ||||
| 			} else if (command=="breakpoint") { | ||||
| 
 | ||||
| 				bool set = cmd[3]; | ||||
|  | @ -531,6 +556,9 @@ void ScriptDebuggerRemote::_poll_events() { | |||
| 
 | ||||
| 			if (request_scene_tree) | ||||
| 				request_scene_tree(request_scene_tree_ud); | ||||
| 		} else if (command=="request_video_mem") { | ||||
| 
 | ||||
| 			_send_video_memory(); | ||||
| 		} else if (command=="breakpoint") { | ||||
| 
 | ||||
| 			bool set = cmd[3]; | ||||
|  | @ -652,6 +680,8 @@ void ScriptDebuggerRemote::set_live_edit_funcs(LiveEditFuncs *p_funcs) { | |||
| 	live_edit_funcs=p_funcs; | ||||
| } | ||||
| 
 | ||||
| ScriptDebuggerRemote::ResourceUsageFunc ScriptDebuggerRemote::resource_usage_func=NULL; | ||||
| 
 | ||||
| ScriptDebuggerRemote::ScriptDebuggerRemote() { | ||||
| 
 | ||||
| 	tcp_client  = StreamPeerTCP::create_ref(); | ||||
|  |  | |||
|  | @ -34,6 +34,7 @@ | |||
| #include "io/stream_peer_tcp.h" | ||||
| #include "io/packet_peer.h" | ||||
| #include "list.h" | ||||
| 
 | ||||
| class ScriptDebuggerRemote : public ScriptDebugger { | ||||
| 
 | ||||
| 	struct Message { | ||||
|  | @ -42,6 +43,8 @@ class ScriptDebuggerRemote : public ScriptDebugger { | |||
| 		Array data; | ||||
| 	}; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 	Ref<StreamPeerTCP> tcp_client; | ||||
| 	Ref<PacketPeerStream> packet_peer_stream; | ||||
| 
 | ||||
|  | @ -90,6 +93,7 @@ class ScriptDebuggerRemote : public ScriptDebugger { | |||
| 	RequestSceneTreeMessageFunc request_scene_tree; | ||||
| 	void *request_scene_tree_ud; | ||||
| 
 | ||||
| 	void _send_video_memory(); | ||||
| 	LiveEditFuncs *live_edit_funcs; | ||||
| 
 | ||||
| 	ErrorHandlerList eh; | ||||
|  | @ -98,6 +102,20 @@ class ScriptDebuggerRemote : public ScriptDebugger { | |||
| 
 | ||||
| public: | ||||
| 
 | ||||
| 	struct ResourceUsage { | ||||
| 
 | ||||
| 		String path; | ||||
| 		String format; | ||||
| 		String type; | ||||
| 		RID id; | ||||
| 		int vram; | ||||
| 		bool operator<(const ResourceUsage& p_img) const { return vram==p_img.vram ? id<p_img.id : vram > p_img.vram; } | ||||
| 	}; | ||||
| 
 | ||||
| 	typedef void (*ResourceUsageFunc)(List<ResourceUsage>*); | ||||
| 
 | ||||
| 	static ResourceUsageFunc resource_usage_func; | ||||
| 
 | ||||
| 	Error connect_to_host(const String& p_host,uint16_t p_port); | ||||
| 	virtual void debug(ScriptLanguage *p_script,bool p_can_continue=true); | ||||
| 	virtual void idle_poll(); | ||||
|  |  | |||
|  | @ -1408,6 +1408,40 @@ GLuint RasterizerGLES2::_texture_get_name(RID p_tex) { | |||
| 	return texture->tex_id; | ||||
| }; | ||||
| 
 | ||||
| void RasterizerGLES2::texture_set_path(RID p_texture,const String& p_path) { | ||||
| 	Texture * texture = texture_owner.get(p_texture); | ||||
| 	ERR_FAIL_COND(!texture); | ||||
| 
 | ||||
| 	texture->path=p_path; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| String RasterizerGLES2::texture_get_path(RID p_texture) const{ | ||||
| 
 | ||||
| 	Texture * texture = texture_owner.get(p_texture); | ||||
| 	ERR_FAIL_COND_V(!texture,String()); | ||||
| 	return texture->path; | ||||
| } | ||||
| void RasterizerGLES2::texture_debug_usage(List<VS::TextureInfo> *r_info){ | ||||
| 
 | ||||
| 	List<RID> textures; | ||||
| 	texture_owner.get_owned_list(&textures); | ||||
| 
 | ||||
| 	for (List<RID>::Element *E=textures.front();E;E=E->next()) { | ||||
| 
 | ||||
| 		Texture *t = texture_owner.get(E->get()); | ||||
| 		if (!t) | ||||
| 			continue; | ||||
| 		VS::TextureInfo tinfo; | ||||
| 		tinfo.path=t->path; | ||||
| 		tinfo.format=t->format; | ||||
| 		tinfo.size.x=t->alloc_width; | ||||
| 		tinfo.size.y=t->alloc_height; | ||||
| 		tinfo.bytes=t->total_data_size; | ||||
| 		r_info->push_back(tinfo); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /* SHADER API */ | ||||
| 
 | ||||
|  |  | |||
|  | @ -115,6 +115,7 @@ class RasterizerGLES2 : public Rasterizer { | |||
| 
 | ||||
| 	struct Texture { | ||||
| 
 | ||||
| 		String path; | ||||
| 		uint32_t flags; | ||||
| 		int width,height; | ||||
| 		int alloc_width, alloc_height; | ||||
|  | @ -1325,6 +1326,10 @@ public: | |||
| 	virtual void texture_set_size_override(RID p_texture,int p_width, int p_height); | ||||
| 	virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const; | ||||
| 
 | ||||
| 	virtual void texture_set_path(RID p_texture,const String& p_path); | ||||
| 	virtual String texture_get_path(RID p_texture) const; | ||||
| 	virtual void texture_debug_usage(List<VS::TextureInfo> *r_info); | ||||
| 
 | ||||
| 	GLuint _texture_get_name(RID p_tex); | ||||
| 
 | ||||
| 	/* SHADER API */ | ||||
|  |  | |||
|  | @ -366,6 +366,16 @@ void ImageTexture::set_size_override(const Size2& p_size) { | |||
| 	VisualServer::get_singleton()->texture_set_size_override(texture,w,h); | ||||
| } | ||||
| 
 | ||||
| void ImageTexture::set_path(const String& p_path,bool p_take_over) { | ||||
| 
 | ||||
| 	if (texture.is_valid()) { | ||||
| 		VisualServer::get_singleton()->texture_set_path(texture,p_path); | ||||
| 	} | ||||
| 
 | ||||
| 	Resource::set_path(p_path,p_take_over); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void ImageTexture::set_storage(Storage p_storage) { | ||||
| 
 | ||||
| 	storage=p_storage; | ||||
|  | @ -944,6 +954,16 @@ float CubeMap::get_lossy_storage_quality() const { | |||
| 	return lossy_storage_quality; | ||||
| } | ||||
| 
 | ||||
| void CubeMap::set_path(const String& p_path,bool p_take_over) { | ||||
| 
 | ||||
| 	if (cubemap.is_valid()) { | ||||
| 		VisualServer::get_singleton()->texture_set_path(cubemap,p_path); | ||||
| 	} | ||||
| 
 | ||||
| 	Resource::set_path(p_path,p_take_over); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool CubeMap::_set(const StringName& p_name, const Variant& p_value) { | ||||
| 
 | ||||
| 	if (p_name=="side/left") { | ||||
|  |  | |||
|  | @ -152,6 +152,7 @@ public: | |||
| 
 | ||||
| 	void set_size_override(const Size2& p_size); | ||||
| 
 | ||||
| 	virtual void set_path(const String& p_path,bool p_take_over=false); | ||||
| 
 | ||||
| 	ImageTexture(); | ||||
| 	~ImageTexture(); | ||||
|  | @ -320,6 +321,8 @@ public: | |||
| 	void set_lossy_storage_quality(float p_lossy_storage_quality); | ||||
| 	float get_lossy_storage_quality() const; | ||||
| 
 | ||||
| 	virtual void set_path(const String& p_path,bool p_take_over=false); | ||||
| 
 | ||||
| 	CubeMap(); | ||||
| 	~CubeMap(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -35,6 +35,25 @@ | |||
| #include "physics_2d_server.h" | ||||
| #include "spatial_sound_server.h" | ||||
| #include "spatial_sound_2d_server.h" | ||||
| #include "script_debugger_remote.h" | ||||
| 
 | ||||
| static void _debugger_get_resource_usage(List<ScriptDebuggerRemote::ResourceUsage>* r_usage) { | ||||
| 
 | ||||
| 	List<VS::TextureInfo> tinfo; | ||||
| 	VS::get_singleton()->texture_debug_usage(&tinfo); | ||||
| 
 | ||||
| 	for (List<VS::TextureInfo>::Element *E=tinfo.front();E;E=E->next()) { | ||||
| 
 | ||||
| 		ScriptDebuggerRemote::ResourceUsage usage; | ||||
| 		usage.path=E->get().path; | ||||
| 		usage.vram=E->get().bytes; | ||||
| 		usage.id=E->get().texture; | ||||
| 		usage.type="Texture"; | ||||
| 		usage.format=itos(E->get().size.width)+"x"+itos(E->get().size.height)+" "+Image::get_format_name(E->get().format); | ||||
| 		r_usage->push_back(usage); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| void register_server_types() { | ||||
| 
 | ||||
|  | @ -63,6 +82,7 @@ void register_server_types() { | |||
| 	ObjectTypeDB::register_virtual_type<PhysicsDirectSpaceState>(); | ||||
| 	ObjectTypeDB::register_virtual_type<PhysicsShapeQueryResult>(); | ||||
| 
 | ||||
| 	ScriptDebuggerRemote::resource_usage_func=_debugger_get_resource_usage; | ||||
| } | ||||
| 
 | ||||
| void unregister_server_types(){ | ||||
|  |  | |||
|  | @ -190,9 +190,12 @@ public: | |||
| 	virtual bool texture_has_alpha(RID p_texture) const=0; | ||||
| 	virtual void texture_set_size_override(RID p_texture,int p_width, int p_height)=0; | ||||
| 
 | ||||
| 
 | ||||
| 	virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const=0; | ||||
| 
 | ||||
| 	virtual void texture_set_path(RID p_texture,const String& p_path)=0; | ||||
| 	virtual String texture_get_path(RID p_texture) const=0; | ||||
| 	virtual void texture_debug_usage(List<VS::TextureInfo> *r_info)=0; | ||||
| 
 | ||||
| 	/* SHADER API */ | ||||
| 
 | ||||
| 	virtual RID shader_create(VS::ShaderMode p_mode=VS::SHADER_MATERIAL)=0; | ||||
|  |  | |||
|  | @ -415,6 +415,10 @@ public: | |||
| 	virtual void texture_set_size_override(RID p_texture,int p_width, int p_height); | ||||
| 	virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const; | ||||
| 
 | ||||
| 	virtual void texture_set_path(RID p_texture,const String& p_path) {} | ||||
| 	virtual String texture_get_path(RID p_texture) const { return String(); } | ||||
| 	virtual void texture_debug_usage(List<VS::TextureInfo> *r_info) {} | ||||
| 
 | ||||
| 	/* SHADER API */ | ||||
| 
 | ||||
| 	virtual RID shader_create(VS::ShaderMode p_mode=VS::SHADER_MATERIAL); | ||||
|  |  | |||
|  | @ -112,6 +112,21 @@ void VisualServerRaster::texture_set_reload_hook(RID p_texture,ObjectID p_owner, | |||
| 	rasterizer->texture_set_reload_hook(p_texture,p_owner,p_function); | ||||
| } | ||||
| 
 | ||||
| void VisualServerRaster::texture_set_path(RID p_texture,const String& p_path) { | ||||
| 
 | ||||
| 	rasterizer->texture_set_path(p_texture,p_path); | ||||
| } | ||||
| 
 | ||||
| String VisualServerRaster::texture_get_path(RID p_texture) const{ | ||||
| 
 | ||||
| 	return rasterizer->texture_get_path(p_texture); | ||||
| } | ||||
| 
 | ||||
| void VisualServerRaster::texture_debug_usage(List<TextureInfo> *r_info){ | ||||
| 
 | ||||
| 	rasterizer->texture_debug_usage(r_info); | ||||
| } | ||||
| 
 | ||||
| /* SHADER API */ | ||||
| 
 | ||||
| RID VisualServerRaster::shader_create(ShaderMode p_mode) { | ||||
|  |  | |||
|  | @ -668,6 +668,11 @@ public: | |||
| 	virtual bool texture_can_stream(RID p_texture) const; | ||||
| 	virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const; | ||||
| 
 | ||||
| 	virtual void texture_set_path(RID p_texture,const String& p_path); | ||||
| 	virtual String texture_get_path(RID p_texture) const; | ||||
| 
 | ||||
| 	virtual void texture_debug_usage(List<TextureInfo> *r_info); | ||||
| 
 | ||||
| 
 | ||||
| 	/* SHADER API */ | ||||
| 	 | ||||
|  |  | |||
|  | @ -98,6 +98,15 @@ public: | |||
| 	FUNC1RC(bool,texture_can_stream,RID); | ||||
| 	FUNC3C(texture_set_reload_hook,RID,ObjectID,const StringName&); | ||||
| 
 | ||||
| 	FUNC2(texture_set_path,RID,const String&); | ||||
| 	FUNC1RC(String,texture_get_path,RID); | ||||
| 
 | ||||
| 	virtual void texture_debug_usage(List<TextureInfo> *r_info) { | ||||
| 		//pass directly, should lock the server anyway
 | ||||
| 		visual_server->texture_debug_usage(r_info); | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| 	/* SHADER API */ | ||||
| 
 | ||||
| 	FUNC1R(RID,shader_create,ShaderMode); | ||||
|  |  | |||
|  | @ -135,6 +135,18 @@ public: | |||
| 	virtual bool texture_can_stream(RID p_texture) const=0; | ||||
| 	virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const=0; | ||||
| 
 | ||||
| 	virtual void texture_set_path(RID p_texture,const String& p_path)=0; | ||||
| 	virtual String texture_get_path(RID p_texture) const=0; | ||||
| 
 | ||||
| 	struct TextureInfo { | ||||
| 		RID texture; | ||||
| 		Size2 size; | ||||
| 		Image::Format format; | ||||
| 		int bytes; | ||||
| 		String path; | ||||
| 	}; | ||||
| 
 | ||||
| 	virtual void texture_debug_usage(List<TextureInfo> *r_info)=0; | ||||
| 
 | ||||
| 
 | ||||
| 	/* SHADER API */ | ||||
|  |  | |||
|  | @ -169,6 +169,17 @@ void ScriptEditorDebugger::_scene_tree_request() { | |||
| 
 | ||||
| } | ||||
| 
 | ||||
| void ScriptEditorDebugger::_video_mem_request() { | ||||
| 
 | ||||
| 	ERR_FAIL_COND(connection.is_null()); | ||||
| 	ERR_FAIL_COND(!connection->is_connected()); | ||||
| 
 | ||||
| 	Array msg; | ||||
| 	msg.push_back("request_video_mem"); | ||||
| 	ppeer->put_var(msg); | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| Size2 ScriptEditorDebugger::get_minimum_size() const { | ||||
| 
 | ||||
| 	Size2 ms = Control::get_minimum_size(); | ||||
|  | @ -244,6 +255,31 @@ void ScriptEditorDebugger::_parse_message(const String& p_msg,const Array& p_dat | |||
| 		le_clear->set_disabled(false); | ||||
| 		le_set->set_disabled(false); | ||||
| 
 | ||||
| 	} else if (p_msg=="message:video_mem") { | ||||
| 
 | ||||
| 		vmem_tree->clear(); | ||||
| 		TreeItem* root=vmem_tree->create_item(); | ||||
| 
 | ||||
| 		int total=0; | ||||
| 
 | ||||
| 		for(int i=0;i<p_data.size();i+=4) { | ||||
| 
 | ||||
| 			TreeItem *it = vmem_tree->create_item(root); | ||||
| 			String type=p_data[i+1]; | ||||
| 			int bytes=p_data[i+3].operator int(); | ||||
| 			it->set_text(0,p_data[i+0]); //path
 | ||||
| 			it->set_text(1,type); //type
 | ||||
| 			it->set_text(2,p_data[i+2]); //type
 | ||||
| 			it->set_text(3,String::humanize_size(bytes)); //type
 | ||||
| 			total+=bytes; | ||||
| 
 | ||||
| 			if (has_icon(type,"EditorIcons")) | ||||
| 				it->set_icon(0,get_icon(type,"EditorIcons")); | ||||
| 		} | ||||
| 
 | ||||
| 		vmem_total->set_tooltip("Bytes: "+itos(total)); | ||||
| 		vmem_total->set_text(String::humanize_size(total)); | ||||
| 
 | ||||
| 	} else if (p_msg=="stack_dump") { | ||||
| 
 | ||||
| 		stack_dump->clear(); | ||||
|  | @ -506,6 +542,7 @@ void ScriptEditorDebugger::_notification(int p_what) { | |||
| 			le_clear->connect("pressed",this,"_live_edit_clear"); | ||||
| 			error_list->connect("item_selected",this,"_error_selected"); | ||||
| 			error_stack->connect("item_selected",this,"_error_stack_selected"); | ||||
| 			vmem_refresh->set_icon( get_icon("Reload","EditorIcons")); | ||||
| 
 | ||||
| 		} break; | ||||
| 		case NOTIFICATION_PROCESS: { | ||||
|  | @ -1136,6 +1173,7 @@ void ScriptEditorDebugger::_bind_methods() { | |||
| 	ObjectTypeDB::bind_method(_MD("_performance_draw"),&ScriptEditorDebugger::_performance_draw); | ||||
| 	ObjectTypeDB::bind_method(_MD("_performance_select"),&ScriptEditorDebugger::_performance_select); | ||||
| 	ObjectTypeDB::bind_method(_MD("_scene_tree_request"),&ScriptEditorDebugger::_scene_tree_request); | ||||
| 	ObjectTypeDB::bind_method(_MD("_video_mem_request"),&ScriptEditorDebugger::_video_mem_request); | ||||
| 	ObjectTypeDB::bind_method(_MD("_live_edit_set"),&ScriptEditorDebugger::_live_edit_set); | ||||
| 	ObjectTypeDB::bind_method(_MD("_live_edit_clear"),&ScriptEditorDebugger::_live_edit_clear); | ||||
| 
 | ||||
|  | @ -1327,9 +1365,15 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor){ | |||
| 	Label *vmlb = memnew(Label("List of Video Memory Usage by Resource: ") ); | ||||
| 	vmlb->set_h_size_flags(SIZE_EXPAND_FILL); | ||||
| 	vmem_hb->add_child( vmlb ); | ||||
| 	vmem_hb->add_child( memnew(Label("Total: ")) ); | ||||
| 	vmem_total = memnew( LineEdit ); | ||||
| 	vmem_total->set_editable(false); | ||||
| 	vmem_total->set_custom_minimum_size(Size2(100,1)); | ||||
| 	vmem_hb->add_child(vmem_total); | ||||
| 	vmem_refresh = memnew( Button ); | ||||
| 	vmem_hb->add_child(vmem_refresh); | ||||
| 	vmem_vb->add_child(vmem_hb); | ||||
| 	vmem_refresh->connect("pressed",this,"_video_mem_request"); | ||||
| 
 | ||||
| 	MarginContainer *vmmc = memnew( MarginContainer ); | ||||
| 	vmmc = memnew( MarginContainer ); | ||||
|  | @ -1341,16 +1385,20 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor){ | |||
| 	vmem_vb->add_child(vmmc); | ||||
| 
 | ||||
| 	vmem_vb->set_name("Video Mem"); | ||||
| 	vmem_tree->set_columns(3); | ||||
| 	vmem_tree->set_columns(4); | ||||
| 	vmem_tree->set_column_titles_visible(true); | ||||
| 	vmem_tree->set_column_title(0,"Resource Path"); | ||||
| 	vmem_tree->set_column_expand(0,true); | ||||
| 	vmem_tree->set_column_expand(1,false); | ||||
| 	vmem_tree->set_column_title(1,"Type"); | ||||
| 	vmem_tree->set_column_min_width(1,150); | ||||
| 	vmem_tree->set_column_min_width(1,100); | ||||
| 	vmem_tree->set_column_expand(2,false); | ||||
| 	vmem_tree->set_column_title(2,"Usage"); | ||||
| 	vmem_tree->set_column_title(2,"Format"); | ||||
| 	vmem_tree->set_column_min_width(2,150); | ||||
| 	vmem_tree->set_column_expand(3,false); | ||||
| 	vmem_tree->set_column_title(3,"Usage"); | ||||
| 	vmem_tree->set_column_min_width(3,80); | ||||
| 	vmem_tree->set_hide_root(true); | ||||
| 
 | ||||
| 	tabs->add_child(vmem_vb); | ||||
| 
 | ||||
|  |  | |||
|  | @ -98,6 +98,7 @@ class ScriptEditorDebugger : public Control { | |||
| 
 | ||||
| 	Tree *vmem_tree; | ||||
| 	Button *vmem_refresh; | ||||
| 	LineEdit *vmem_total; | ||||
| 
 | ||||
| 	Tree *stack_dump; | ||||
| 	PropertyEditor *inspector; | ||||
|  | @ -130,6 +131,7 @@ class ScriptEditorDebugger : public Control { | |||
| 	void _scene_tree_request(); | ||||
| 	void _parse_message(const String& p_msg,const Array& p_data); | ||||
| 
 | ||||
| 	void _video_mem_request(); | ||||
| 
 | ||||
| 	int _get_node_path_cache(const NodePath& p_path); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Juan Linietsky
						Juan Linietsky