Work on issues related to resizing buffers

This commit is contained in:
Josh Yelon 2008-02-28 23:16:13 +00:00
parent 4669ea9486
commit b3b365c99e
15 changed files with 125 additions and 22 deletions

View File

@ -58,6 +58,24 @@ GraphicsBuffer::
~GraphicsBuffer() { ~GraphicsBuffer() {
} }
////////////////////////////////////////////////////////////////////
// Function: GraphicsBuffer::set_size
// Access: Public, Virtual
// Description: This is called by the GraphicsEngine to request that
// the buffer resize itself. Although calls to get the
// size will return the new value, much of the actual
// resizing work doesn't take place until the next
// begin_frame. Not all buffers are resizeable.
////////////////////////////////////////////////////////////////////
void GraphicsBuffer::
set_size(int x, int y) {
if ((_creation_flags & GraphicsPipe::BF_resizeable) == 0) {
nassert_raise("Cannot resize buffer unless it is created with BF_resizeable flag");
return;
}
set_size_and_recalc(x, y);
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: GraphicsBuffer::request_open // Function: GraphicsBuffer::request_open
// Access: Public, Virtual // Access: Public, Virtual

View File

@ -43,6 +43,7 @@ protected:
PUBLISHED: PUBLISHED:
virtual ~GraphicsBuffer(); virtual ~GraphicsBuffer();
void set_size(int x, int y);
public: public:
virtual void request_open(); virtual void request_open();

View File

@ -84,10 +84,11 @@ PUBLISHED:
// Miscellaneous control flags. // Miscellaneous control flags.
BF_can_bind_color = 0x0040, // Need capability: bind the color bitplane to a tex. BF_can_bind_color = 0x0040, // Need capability: bind the color bitplane to a tex.
BF_can_bind_every = 0x0080, // Need capability: bind all bitplanes to a tex. BF_can_bind_every = 0x0080, // Need capability: bind all bitplanes to a tex.
BF_size_track_host = 0x0100, // Buffer should track the host size. BF_resizeable = 0x0100, // Buffer should allow set_size.
BF_rtt_cumulative = 0x0200, // Buffer supports cumulative render-to-texture. BF_size_track_host = 0x0200, // Buffer should track the host size.
BF_fb_props_optional = 0x0400, // FrameBufferProperties can be ignored. BF_rtt_cumulative = 0x0400, // Buffer supports cumulative render-to-texture.
BF_size_square = 0x0800, // x_size must equal y_size (e.g. for cube maps) BF_fb_props_optional = 0x0800, // FrameBufferProperties can be ignored.
BF_size_square = 0x1000, // x_size must equal y_size (e.g. for cube maps)
}; };
INLINE bool is_valid() const; INLINE bool is_valid() const;

View File

@ -73,6 +73,24 @@ ParasiteBuffer::
_is_valid = false; _is_valid = false;
} }
////////////////////////////////////////////////////////////////////
// Function: ParasiteBuffer::set_size
// Access: Public, Virtual
// Description: This is called by the GraphicsEngine to request that
// the buffer resize itself. Although calls to get the
// size will return the new value, much of the actual
// resizing work doesn't take place until the next
// begin_frame. Not all buffers are resizeable.
////////////////////////////////////////////////////////////////////
void ParasiteBuffer::
set_size(int x, int y) {
if ((_creation_flags & GraphicsPipe::BF_resizeable) == 0) {
nassert_raise("Cannot resize buffer unless it is created with BF_resizeable flag");
return;
}
set_size_and_recalc(x, y);
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: ParasiteBuffer::is_active // Function: ParasiteBuffer::is_active
// Access: Published, Virtual // Access: Published, Virtual

View File

@ -61,6 +61,7 @@ PUBLISHED:
virtual ~ParasiteBuffer(); virtual ~ParasiteBuffer();
virtual bool is_active() const; virtual bool is_active() const;
void set_size(int x, int y);
public: public:
virtual bool begin_frame(FrameMode mode, Thread *current_thread); virtual bool begin_frame(FrameMode mode, Thread *current_thread);

View File

@ -226,9 +226,16 @@ rebuild_bitplanes() {
// Decide how big the bitplanes should be. // Decide how big the bitplanes should be.
if ((_host != 0)&&(_creation_flags & GraphicsPipe::BF_size_track_host)) {
if ((_host->get_x_size() != _x_size)||
(_host->get_y_size() != _y_size)) {
set_size_and_recalc(_host->get_x_size(),
_host->get_y_size());
}
}
int bitplane_x = _x_size; int bitplane_x = _x_size;
int bitplane_y = _y_size; int bitplane_y = _y_size;
if (!_gsg->get_supports_tex_non_pow2()) { if (Texture::get_textures_power_2() != ATS_none) {
bitplane_x = Texture::up_to_power_2(bitplane_x); bitplane_x = Texture::up_to_power_2(bitplane_x);
bitplane_y = Texture::up_to_power_2(bitplane_y); bitplane_y = Texture::up_to_power_2(bitplane_y);
} }

View File

@ -109,12 +109,22 @@ make_output(const string &name,
if (retry == 0) { if (retry == 0) {
if (((flags&BF_require_parasite)!=0)|| if (((flags&BF_require_parasite)!=0)||
((flags&BF_refuse_window)!=0)|| ((flags&BF_refuse_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)|| ((flags&BF_size_track_host)!=0)||
((flags&BF_rtt_cumulative)!=0)|| ((flags&BF_rtt_cumulative)!=0)||
((flags&BF_can_bind_color)!=0)|| ((flags&BF_can_bind_color)!=0)||
((flags&BF_can_bind_every)!=0)) { ((flags&BF_can_bind_every)!=0)) {
return NULL; return NULL;
} }
// Early failure - if we are sure that this buffer WONT
// meet specs, we can bail out early.
if ((flags & BF_fb_props_optional) == 0) {
if ((fb_prop.get_aux_rgba() > 0)||
(fb_prop.get_aux_rgba() > 0)||
(fb_prop.get_aux_float() > 0)) {
return NULL;
}
}
return new wdxGraphicsWindow8(this, name, fb_prop, win_prop, return new wdxGraphicsWindow8(this, name, fb_prop, win_prop,
flags, gsg, host); flags, gsg, host);
} }
@ -125,11 +135,28 @@ make_output(const string &name,
if ((!support_render_texture)|| if ((!support_render_texture)||
((flags&BF_require_parasite)!=0)|| ((flags&BF_require_parasite)!=0)||
((flags&BF_require_window)!=0)|| ((flags&BF_require_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)|| ((flags&BF_size_track_host)!=0)||
((flags&BF_rtt_cumulative)!=0)|| ((flags&BF_rtt_cumulative)!=0)||
((flags&BF_can_bind_every)!=0)) { ((flags&BF_can_bind_every)!=0)) {
return NULL; return NULL;
} }
// Early failure - if we are sure that this buffer WONT
// meet specs, we can bail out early.
if ((flags & BF_fb_props_optional) == 0) {
if ((fb_prop.get_aux_rgba() > 0)||
(fb_prop.get_aux_rgba() > 0)||
(fb_prop.get_aux_float() > 0)||
(fb_prop.get_indexed_color() > 0)||
(fb_prop.get_back_buffers() > 0)||
(fb_prop.get_accum_bits() > 0)||
(fb_prop.get_multisamples() > 0)) {
return NULL;
}
}
// Early success - if we are sure that this buffer WILL
// meet specs, we can precertify it.
// This looks rather overly optimistic -- ie, buggy.
if ((gsg != 0)&& if ((gsg != 0)&&
(gsg->is_valid())&& (gsg->is_valid())&&
(!gsg->needs_reset())&& (!gsg->needs_reset())&&

View File

@ -247,9 +247,16 @@ rebuild_bitplanes() {
// Decide how big the bitplanes should be. // Decide how big the bitplanes should be.
if ((_host != 0)&&(_creation_flags & GraphicsPipe::BF_size_track_host)) {
if ((_host->get_x_size() != _x_size)||
(_host->get_y_size() != _y_size)) {
set_size_and_recalc(_host->get_x_size(),
_host->get_y_size());
}
}
int bitplane_x = _x_size; int bitplane_x = _x_size;
int bitplane_y = _y_size; int bitplane_y = _y_size;
if (!_gsg->get_supports_tex_non_pow2()) { if (Texture::get_textures_power_2() != ATS_none) {
bitplane_x = Texture::up_to_power_2(bitplane_x); bitplane_x = Texture::up_to_power_2(bitplane_x);
bitplane_y = Texture::up_to_power_2(bitplane_y); bitplane_y = Texture::up_to_power_2(bitplane_y);
} }
@ -297,8 +304,7 @@ rebuild_bitplanes() {
_color_backing_store = NULL; _color_backing_store = NULL;
} }
color_tex = get_texture(color_tex_index); color_tex = get_texture(color_tex_index);
color_tex->set_x_size(bitplane_x); color_tex->set_size_padded(_x_size, _y_size);
color_tex->set_y_size(bitplane_y);
color_tex->set_format(Texture::F_rgba); color_tex->set_format(Texture::F_rgba);
color_ctx = color_ctx =
DCAST(DXTextureContext9, DCAST(DXTextureContext9,
@ -370,8 +376,7 @@ rebuild_bitplanes() {
depth_tex = get_texture(depth_tex_index); depth_tex = get_texture(depth_tex_index);
} }
depth_tex->set_x_size(bitplane_x); depth_tex->set_size_padded(_x_size, _y_size);
depth_tex->set_y_size(bitplane_y);
depth_tex->set_format(Texture::F_depth_stencil); depth_tex->set_format(Texture::F_depth_stencil);
depth_ctx = depth_ctx =
DCAST(DXTextureContext9, DCAST(DXTextureContext9,

View File

@ -109,12 +109,22 @@ make_output(const string &name,
if (retry == 0) { if (retry == 0) {
if (((flags&BF_require_parasite)!=0)|| if (((flags&BF_require_parasite)!=0)||
((flags&BF_refuse_window)!=0)|| ((flags&BF_refuse_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)|| ((flags&BF_size_track_host)!=0)||
((flags&BF_rtt_cumulative)!=0)|| ((flags&BF_rtt_cumulative)!=0)||
((flags&BF_can_bind_color)!=0)|| ((flags&BF_can_bind_color)!=0)||
((flags&BF_can_bind_every)!=0)) { ((flags&BF_can_bind_every)!=0)) {
return NULL; return NULL;
} }
// Early failure - if we are sure that this buffer WONT
// meet specs, we can bail out early.
if ((flags & BF_fb_props_optional) == 0) {
if ((fb_prop.get_aux_rgba() > 0)||
(fb_prop.get_aux_rgba() > 0)||
(fb_prop.get_aux_float() > 0)) {
return NULL;
}
}
return new wdxGraphicsWindow9(this, name, fb_prop, win_prop, return new wdxGraphicsWindow9(this, name, fb_prop, win_prop,
flags, gsg, host); flags, gsg, host);
} }
@ -125,11 +135,26 @@ make_output(const string &name,
if ((!support_render_texture)|| if ((!support_render_texture)||
((flags&BF_require_parasite)!=0)|| ((flags&BF_require_parasite)!=0)||
((flags&BF_require_window)!=0)|| ((flags&BF_require_window)!=0)||
((flags&BF_size_track_host)!=0)||
((flags&BF_rtt_cumulative)!=0)|| ((flags&BF_rtt_cumulative)!=0)||
((flags&BF_can_bind_every)!=0)) { ((flags&BF_can_bind_every)!=0)) {
return NULL; return NULL;
} }
// Early failure - if we are sure that this buffer WONT
// meet specs, we can bail out early.
if ((flags & BF_fb_props_optional) == 0) {
if ((fb_prop.get_aux_rgba() > 0)||
(fb_prop.get_aux_rgba() > 0)||
(fb_prop.get_aux_float() > 0)||
(fb_prop.get_indexed_color() > 0)||
(fb_prop.get_back_buffers() > 0)||
(fb_prop.get_accum_bits() > 0)||
(fb_prop.get_multisamples() > 0)) {
return NULL;
}
}
// Early success - if we are sure that this buffer WILL
// meet specs, we can precertify it.
// This looks rather overly optimistic -- ie, buggy.
if ((gsg != 0)&& if ((gsg != 0)&&
(gsg->is_valid())&& (gsg->is_valid())&&
(!gsg->needs_reset())&& (!gsg->needs_reset())&&

View File

@ -306,6 +306,7 @@ bind_slot(bool rb_resize, Texture **attach, RenderTexturePlane slot, GLenum atta
if ((_tex[slot] == tex)&& if ((_tex[slot] == tex)&&
(tex->get_x_size() == _rb_size_x)&& (tex->get_x_size() == _rb_size_x)&&
(tex->get_y_size() == _rb_size_y)) { (tex->get_y_size() == _rb_size_y)) {
tex->set_pad_size(_rb_size_x - _x_size, _rb_size_y - _y_size);
return; return;
} }

View File

@ -232,6 +232,7 @@ make_output(const string &name,
if (retry == 0) { if (retry == 0) {
if (((flags&BF_require_parasite)!=0)|| if (((flags&BF_require_parasite)!=0)||
((flags&BF_refuse_window)!=0)|| ((flags&BF_refuse_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)|| ((flags&BF_size_track_host)!=0)||
((flags&BF_rtt_cumulative)!=0)|| ((flags&BF_rtt_cumulative)!=0)||
((flags&BF_can_bind_color)!=0)|| ((flags&BF_can_bind_color)!=0)||
@ -283,6 +284,7 @@ make_output(const string &name,
if ((!support_rtt)|| if ((!support_rtt)||
((flags&BF_require_parasite)!=0)|| ((flags&BF_require_parasite)!=0)||
((flags&BF_require_window)!=0)|| ((flags&BF_require_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)|| ((flags&BF_size_track_host)!=0)||
((flags&BF_rtt_cumulative)!=0)|| ((flags&BF_rtt_cumulative)!=0)||
((flags&BF_can_bind_every)!=0)) { ((flags&BF_can_bind_every)!=0)) {

View File

@ -95,6 +95,7 @@ make_output(const string &name,
if ((!support_render_texture)|| if ((!support_render_texture)||
((flags&BF_require_parasite)!=0)|| ((flags&BF_require_parasite)!=0)||
((flags&BF_require_window)!=0)|| ((flags&BF_require_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)|| ((flags&BF_size_track_host)!=0)||
((flags&BF_can_bind_every)!=0)|| ((flags&BF_can_bind_every)!=0)||
((flags&BF_rtt_cumulative)!=0)) { ((flags&BF_rtt_cumulative)!=0)) {

View File

@ -230,6 +230,7 @@ make_output(const string &name,
if (retry == 0) { if (retry == 0) {
if (((flags&BF_require_parasite)!=0)|| if (((flags&BF_require_parasite)!=0)||
((flags&BF_refuse_window)!=0)|| ((flags&BF_refuse_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)|| ((flags&BF_size_track_host)!=0)||
((flags&BF_can_bind_color)!=0)|| ((flags&BF_can_bind_color)!=0)||
((flags&BF_can_bind_every)!=0)) { ((flags&BF_can_bind_every)!=0)) {
@ -261,6 +262,7 @@ make_output(const string &name,
if ((!support_render_texture)|| if ((!support_render_texture)||
((flags&BF_require_parasite)!=0)|| ((flags&BF_require_parasite)!=0)||
((flags&BF_require_window)!=0)|| ((flags&BF_require_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)|| ((flags&BF_size_track_host)!=0)||
((flags&BF_can_bind_every)!=0)) { ((flags&BF_can_bind_every)!=0)) {
return NULL; return NULL;

View File

@ -162,14 +162,7 @@ bind_texture_to_pbuffer() {
_pbuffer_bound->release(wglgsg->get_prepared_objects()); _pbuffer_bound->release(wglgsg->get_prepared_objects());
_pbuffer_bound = 0; _pbuffer_bound = 0;
} }
int tex_x = _x_size; tex->set_size_padded(_x_size, _y_size);
int tex_y = _y_size;
if (!wglgsg->get_supports_tex_non_pow2()) {
tex_x = Texture::up_to_power_2(tex_x);
tex_y = Texture::up_to_power_2(tex_y);
}
tex->set_x_size(tex_x);
tex->set_y_size(tex_y);
if (tex->get_match_framebuffer_format()) { if (tex->get_match_framebuffer_format()) {
if (_fb_properties.get_alpha_bits()) { if (_fb_properties.get_alpha_bits()) {
tex->set_format(Texture::F_rgba); tex->set_format(Texture::F_rgba);
@ -421,7 +414,7 @@ rebuild_bitplanes() {
// Determine what pbuffer attributes are needed // Determine what pbuffer attributes are needed
// for currently-applicable textures. // for currently-applicable textures.
if (_creation_flags & GraphicsPipe::BF_size_track_host) { if ((_host != 0)&&(_creation_flags & GraphicsPipe::BF_size_track_host)) {
if ((_host->get_x_size() != _x_size)|| if ((_host->get_x_size() != _x_size)||
(_host->get_y_size() != _y_size)) { (_host->get_y_size() != _y_size)) {
set_size_and_recalc(_host->get_x_size(), set_size_and_recalc(_host->get_x_size(),
@ -430,7 +423,7 @@ rebuild_bitplanes() {
} }
int desired_x = _x_size; int desired_x = _x_size;
int desired_y = _y_size; int desired_y = _y_size;
if ((bindtexture != 0)&&(!wglgsg->get_supports_tex_non_pow2())) { if ((bindtexture != 0)&&(Texture::get_textures_power_2() != ATS_none)) {
desired_x = Texture::up_to_power_2(desired_x); desired_x = Texture::up_to_power_2(desired_x);
desired_y = Texture::up_to_power_2(desired_y); desired_y = Texture::up_to_power_2(desired_y);
} }

View File

@ -138,6 +138,7 @@ make_output(const string &name,
if (retry == 0) { if (retry == 0) {
if (((flags&BF_require_parasite)!=0)|| if (((flags&BF_require_parasite)!=0)||
((flags&BF_refuse_window)!=0)|| ((flags&BF_refuse_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)|| ((flags&BF_size_track_host)!=0)||
((flags&BF_rtt_cumulative)!=0)|| ((flags&BF_rtt_cumulative)!=0)||
((flags&BF_can_bind_color)!=0)|| ((flags&BF_can_bind_color)!=0)||