diff --git a/panda/src/glstuff/glGraphicsBuffer_src.cxx b/panda/src/glstuff/glGraphicsBuffer_src.cxx index 36aa82684d..05d8c4b78f 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.cxx +++ b/panda/src/glstuff/glGraphicsBuffer_src.cxx @@ -32,7 +32,8 @@ CLP(GraphicsBuffer)(GraphicsEngine *engine, GraphicsPipe *pipe, _generate_mipmap_pcollector(_draw_window_pcollector, "Generate mipmaps"), _resolve_multisample_pcollector(_draw_window_pcollector, "Resolve multisamples"), _requested_multisamples(0), - _requested_coverage_samples(0) + _requested_coverage_samples(0), + _rb_context(NULL) { // A FBO doesn't have a back buffer. _draw_buffer_type = RenderBuffer::T_front; @@ -50,6 +51,7 @@ CLP(GraphicsBuffer)(GraphicsEngine *engine, GraphicsPipe *pipe, _rb[i] = 0; _rbm[i] = 0; } + _rb_data_size_bytes = 0; _shared_depth_buffer = 0; _bound_tex_page = -1; @@ -246,6 +248,7 @@ rebuild_bitplanes() { } else { glgsg->bind_fbo(0); } + _rb_context->set_active(true); return; } @@ -273,6 +276,7 @@ rebuild_bitplanes() { rb_resize = true; } _rb_size_z = 1; + _rb_data_size_bytes = 0; int num_fbos = 1; @@ -526,6 +530,9 @@ rebuild_bitplanes() { _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; 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); _fb_properties.set_depth_bits(depth_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); @@ -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->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_DEPTH_SIZE_EXT, &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); @@ -868,14 +877,17 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, GLCAT.debug() << "Creating color renderbuffer.\n"; 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) { - 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); } + _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->_glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, attachpoint, GL_RENDERBUFFER_EXT, _rb[slot]); @@ -1236,6 +1248,10 @@ open_buffer() { return false; } + if (_rb_context == NULL) { + _rb_context = new BufferContext(&(glgsg->_renderbuffer_residency)); + } + // Describe the framebuffer properties of the FBO. // // Unfortunately, we can't currently predict which formats @@ -1407,6 +1423,13 @@ open_buffer() { //////////////////////////////////////////////////////////////////// void CLP(GraphicsBuffer):: 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(); if (_gsg == 0) { @@ -1425,13 +1448,14 @@ close_buffer() { _rb[i] = 0; } } - // Delete the renderbuffers. + // Delete the multisample renderbuffers. for (int i=0; i_glDeleteRenderbuffers(1, &(_rbm[i])); _rb[i] = 0; } } + _rb_size_x = 0; _rb_size_y = 0; report_my_gl_errors(); diff --git a/panda/src/glstuff/glGraphicsBuffer_src.h b/panda/src/glstuff/glGraphicsBuffer_src.h index 653e5dc8b2..03e429a422 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.h +++ b/panda/src/glstuff/glGraphicsBuffer_src.h @@ -57,7 +57,6 @@ // the buffer will render as if multisamples is 0. // //////////////////////////////////////////////////////////////////// - class EXPCL_GL CLP(GraphicsBuffer) : public GraphicsBuffer { public: CLP(GraphicsBuffer)(GraphicsEngine *engine, GraphicsPipe *pipe, @@ -125,6 +124,10 @@ private: GLuint _rb[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 // after rendering one frame. typedef pvector TextureContexts; diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 4ca96767e1..5a1752932e 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -304,7 +304,8 @@ int CLP(GraphicsStateGuardian)::get_driver_shader_version_minor() { return _gl_s //////////////////////////////////////////////////////////////////// CLP(GraphicsStateGuardian):: 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; @@ -2942,6 +2943,8 @@ begin_frame(Thread *current_thread) { if (!GraphicsStateGuardian::begin_frame(current_thread)) { return false; } + _renderbuffer_residency.begin_frame(current_thread); + report_my_gl_errors(); #ifdef DO_PSTATS @@ -3102,6 +3105,8 @@ end_frame(Thread *current_thread) { GraphicsStateGuardian::end_frame(current_thread); + _renderbuffer_residency.end_frame(current_thread); + // Flush any PCollectors specific to this kind of GSG. _primitive_batches_display_list_pcollector.flush_level(); _vertices_display_list_pcollector.flush_level(); @@ -10971,9 +10976,7 @@ upload_texture(CLP(TextureContext) *gtc, bool force, bool uses_mipmaps) { gtc->_width = width; gtc->_height = height; gtc->_depth = depth; - } - if (!image.is_null()) { gtc->update_data_size_bytes(get_texture_memory_size(tex)); } diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.h b/panda/src/glstuff/glGraphicsStateGuardian_src.h index f9eaa36ccb..93cc526fd6 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.h +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.h @@ -923,6 +923,8 @@ public: UsageTextures _usage_textures; #endif // NDEBUG + BufferResidencyTracker _renderbuffer_residency; + static PStatCollector _load_display_list_pcollector; static PStatCollector _primitive_batches_display_list_pcollector; static PStatCollector _vertices_display_list_pcollector; diff --git a/panda/src/putil/bamReader.cxx b/panda/src/putil/bamReader.cxx index 2c7ed67416..9ae84b5deb 100644 --- a/panda/src/putil/bamReader.cxx +++ b/panda/src/putil/bamReader.cxx @@ -1222,6 +1222,11 @@ p_read_object() { } return p_read_object(); + + default: + bam_cat.error() + << "Encountered invalid BamObjectCode 0x" << hex << (int)boc << dec << ".\n"; + return 0; } // An object definition in a Bam file consists of a TypeHandle