Track residency of graphics buffers (both RTT and renderbuffers)

This commit is contained in:
rdb 2015-05-18 02:07:35 +02:00
parent f152c238d5
commit 49e0ff000c
4 changed files with 43 additions and 11 deletions

View File

@ -32,7 +32,8 @@ CLP(GraphicsBuffer)(GraphicsEngine *engine, GraphicsPipe *pipe,
_generate_mipmap_pcollector(_draw_window_pcollector, "Generate mipmaps"), _generate_mipmap_pcollector(_draw_window_pcollector, "Generate mipmaps"),
_resolve_multisample_pcollector(_draw_window_pcollector, "Resolve multisamples"), _resolve_multisample_pcollector(_draw_window_pcollector, "Resolve multisamples"),
_requested_multisamples(0), _requested_multisamples(0),
_requested_coverage_samples(0) _requested_coverage_samples(0),
_rb_context(NULL)
{ {
// A FBO doesn't have a back buffer. // A FBO doesn't have a back buffer.
_draw_buffer_type = RenderBuffer::T_front; _draw_buffer_type = RenderBuffer::T_front;
@ -50,6 +51,7 @@ CLP(GraphicsBuffer)(GraphicsEngine *engine, GraphicsPipe *pipe,
_rb[i] = 0; _rb[i] = 0;
_rbm[i] = 0; _rbm[i] = 0;
} }
_rb_data_size_bytes = 0;
_shared_depth_buffer = 0; _shared_depth_buffer = 0;
_bound_tex_page = -1; _bound_tex_page = -1;
@ -246,6 +248,7 @@ rebuild_bitplanes() {
} else { } else {
glgsg->bind_fbo(0); glgsg->bind_fbo(0);
} }
_rb_context->set_active(true);
return; return;
} }
@ -273,6 +276,7 @@ rebuild_bitplanes() {
rb_resize = true; rb_resize = true;
} }
_rb_size_z = 1; _rb_size_z = 1;
_rb_data_size_bytes = 0;
int num_fbos = 1; int num_fbos = 1;
@ -526,6 +530,9 @@ rebuild_bitplanes() {
_fb_properties.set_rgba_bits(0, 0, 0, 0); _fb_properties.set_rgba_bits(0, 0, 0, 0);
} }
_rb_context->set_active(true);
_rb_context->update_data_size_bytes(_rb_data_size_bytes);
_initial_clear = false; _initial_clear = false;
report_my_gl_errors(); report_my_gl_errors();
@ -828,6 +835,7 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot,
glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_STENCIL_SIZE_EXT, &stencil_size); glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_STENCIL_SIZE_EXT, &stencil_size);
_fb_properties.set_depth_bits(depth_size); _fb_properties.set_depth_bits(depth_size);
_fb_properties.set_stencil_bits(stencil_size); _fb_properties.set_stencil_bits(stencil_size);
_rb_data_size_bytes += _rb_size_x * _rb_size_y * ((depth_size + stencil_size) / 8);
glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0); glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
@ -851,6 +859,7 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot,
glgsg->_glRenderbufferStorage(GL_RENDERBUFFER_EXT, gl_format, _rb_size_x, _rb_size_y); glgsg->_glRenderbufferStorage(GL_RENDERBUFFER_EXT, gl_format, _rb_size_x, _rb_size_y);
glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_DEPTH_SIZE_EXT, &depth_size); glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_DEPTH_SIZE_EXT, &depth_size);
_fb_properties.set_depth_bits(depth_size); _fb_properties.set_depth_bits(depth_size);
_rb_data_size_bytes += _rb_size_x * _rb_size_y * (depth_size / 8);
glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0); glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
@ -868,14 +877,17 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot,
GLCAT.debug() << "Creating color renderbuffer.\n"; GLCAT.debug() << "Creating color renderbuffer.\n";
glgsg->_glRenderbufferStorage(GL_RENDERBUFFER_EXT, gl_format, _rb_size_x, _rb_size_y); glgsg->_glRenderbufferStorage(GL_RENDERBUFFER_EXT, gl_format, _rb_size_x, _rb_size_y);
GLint red_size = 0, green_size = 0, blue_size = 0, alpha_size = 0;
glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_RED_SIZE_EXT, &red_size);
glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_GREEN_SIZE_EXT, &green_size);
glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_BLUE_SIZE_EXT, &blue_size);
glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_ALPHA_SIZE_EXT, &alpha_size);
if (attachpoint == GL_COLOR_ATTACHMENT0_EXT) { if (attachpoint == GL_COLOR_ATTACHMENT0_EXT) {
GLint red_size = 0, green_size = 0, blue_size = 0, alpha_size = 0;
glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_RED_SIZE_EXT, &red_size);
glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_GREEN_SIZE_EXT, &green_size);
glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_BLUE_SIZE_EXT, &blue_size);
glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_ALPHA_SIZE_EXT, &alpha_size);
_fb_properties.set_rgba_bits(red_size, green_size, blue_size, alpha_size); _fb_properties.set_rgba_bits(red_size, green_size, blue_size, alpha_size);
} }
_rb_data_size_bytes += _rb_size_x * _rb_size_y * ((red_size + green_size + blue_size + alpha_size) / 8);
glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0); glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
glgsg->_glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, attachpoint, glgsg->_glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, attachpoint,
GL_RENDERBUFFER_EXT, _rb[slot]); GL_RENDERBUFFER_EXT, _rb[slot]);
@ -1236,6 +1248,10 @@ open_buffer() {
return false; return false;
} }
if (_rb_context == NULL) {
_rb_context = new BufferContext(&(glgsg->_renderbuffer_residency));
}
// Describe the framebuffer properties of the FBO. // Describe the framebuffer properties of the FBO.
// //
// Unfortunately, we can't currently predict which formats // Unfortunately, we can't currently predict which formats
@ -1407,6 +1423,13 @@ open_buffer() {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void CLP(GraphicsBuffer):: void CLP(GraphicsBuffer)::
close_buffer() { close_buffer() {
_rb_data_size_bytes = 0;
if (_rb_context != NULL) {
_rb_context->update_data_size_bytes(0);
delete _rb_context;
_rb_context = NULL;
}
check_host_valid(); check_host_valid();
if (_gsg == 0) { if (_gsg == 0) {
@ -1425,13 +1448,14 @@ close_buffer() {
_rb[i] = 0; _rb[i] = 0;
} }
} }
// Delete the renderbuffers. // Delete the multisample renderbuffers.
for (int i=0; i<RTP_COUNT; i++) { for (int i=0; i<RTP_COUNT; i++) {
if (_rbm[i] != 0) { if (_rbm[i] != 0) {
glgsg->_glDeleteRenderbuffers(1, &(_rbm[i])); glgsg->_glDeleteRenderbuffers(1, &(_rbm[i]));
_rb[i] = 0; _rb[i] = 0;
} }
} }
_rb_size_x = 0; _rb_size_x = 0;
_rb_size_y = 0; _rb_size_y = 0;
report_my_gl_errors(); report_my_gl_errors();

View File

@ -57,7 +57,6 @@
// the buffer will render as if multisamples is 0. // the buffer will render as if multisamples is 0.
// //
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
class EXPCL_GL CLP(GraphicsBuffer) : public GraphicsBuffer { class EXPCL_GL CLP(GraphicsBuffer) : public GraphicsBuffer {
public: public:
CLP(GraphicsBuffer)(GraphicsEngine *engine, GraphicsPipe *pipe, CLP(GraphicsBuffer)(GraphicsEngine *engine, GraphicsPipe *pipe,
@ -125,6 +124,10 @@ private:
GLuint _rb[RTP_COUNT]; GLuint _rb[RTP_COUNT];
GLuint _rbm[RTP_COUNT]; GLuint _rbm[RTP_COUNT];
// For memory tracking of renderbuffers.
BufferContext *_rb_context;
size_t _rb_data_size_bytes;
// List of textures for which we might have to generate mipmaps // List of textures for which we might have to generate mipmaps
// after rendering one frame. // after rendering one frame.
typedef pvector<CLP(TextureContext)*> TextureContexts; typedef pvector<CLP(TextureContext)*> TextureContexts;

View File

@ -304,7 +304,8 @@ int CLP(GraphicsStateGuardian)::get_driver_shader_version_minor() { return _gl_s
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
CLP(GraphicsStateGuardian):: CLP(GraphicsStateGuardian)::
CLP(GraphicsStateGuardian)(GraphicsEngine *engine, GraphicsPipe *pipe) : CLP(GraphicsStateGuardian)(GraphicsEngine *engine, GraphicsPipe *pipe) :
GraphicsStateGuardian(gl_coordinate_system, engine, pipe) GraphicsStateGuardian(gl_coordinate_system, engine, pipe),
_renderbuffer_residency(get_prepared_objects()->get_name(), "renderbuffer")
{ {
_error_count = 0; _error_count = 0;
@ -2911,6 +2912,8 @@ begin_frame(Thread *current_thread) {
if (!GraphicsStateGuardian::begin_frame(current_thread)) { if (!GraphicsStateGuardian::begin_frame(current_thread)) {
return false; return false;
} }
_renderbuffer_residency.begin_frame(current_thread);
report_my_gl_errors(); report_my_gl_errors();
#ifdef DO_PSTATS #ifdef DO_PSTATS
@ -3071,6 +3074,8 @@ end_frame(Thread *current_thread) {
GraphicsStateGuardian::end_frame(current_thread); GraphicsStateGuardian::end_frame(current_thread);
_renderbuffer_residency.end_frame(current_thread);
// Flush any PCollectors specific to this kind of GSG. // Flush any PCollectors specific to this kind of GSG.
_primitive_batches_display_list_pcollector.flush_level(); _primitive_batches_display_list_pcollector.flush_level();
_vertices_display_list_pcollector.flush_level(); _vertices_display_list_pcollector.flush_level();
@ -10862,9 +10867,7 @@ upload_texture(CLP(TextureContext) *gtc, bool force, bool uses_mipmaps) {
gtc->_width = width; gtc->_width = width;
gtc->_height = height; gtc->_height = height;
gtc->_depth = depth; gtc->_depth = depth;
}
if (!image.is_null()) {
gtc->update_data_size_bytes(get_texture_memory_size(tex)); gtc->update_data_size_bytes(get_texture_memory_size(tex));
} }

View File

@ -914,6 +914,8 @@ public:
UsageTextures _usage_textures; UsageTextures _usage_textures;
#endif // NDEBUG #endif // NDEBUG
BufferResidencyTracker _renderbuffer_residency;
static PStatCollector _load_display_list_pcollector; static PStatCollector _load_display_list_pcollector;
static PStatCollector _primitive_batches_display_list_pcollector; static PStatCollector _primitive_batches_display_list_pcollector;
static PStatCollector _vertices_display_list_pcollector; static PStatCollector _vertices_display_list_pcollector;