15 #include "wglGraphicsBuffer.h"
16 #include "wglGraphicsPipe.h"
17 #include "config_wgldisplay.h"
19 #include "pStatTimer.h"
39 GraphicsBuffer(engine, pipe, name, fb_prop, win_prop, flags, gsg, host)
41 _pbuffer = (HPBUFFERARB)0;
47 _screenshot_buffer_type = _draw_buffer_type;
56 ~wglGraphicsBuffer() {
71 begin_frame_spam(mode);
77 DCAST_INTO_R(wglgsg, _gsg,
false);
84 if (_fb_properties.is_single_buffered()) {
85 wglgsg->_wglReleaseTexImageARB(_pbuffer, WGL_FRONT_LEFT_ARB);
87 wglgsg->_wglReleaseTexImageARB(_pbuffer, WGL_BACK_LEFT_ARB);
90 if (!rebuild_bitplanes()) {
91 wglGraphicsPipe::wgl_make_current(0, 0, &_make_current_pcollector);
95 wglGraphicsPipe::wgl_make_current(_pbuffer_dc, context,
96 &_make_current_pcollector);
98 if (mode == FM_render) {
100 for (
size_t i = 0; i != cdata->_textures.size(); ++i) {
101 const RenderTexture &rt = cdata->_textures[i];
102 RenderTextureMode rtm_mode = rt._rtm_mode;
103 RenderTexturePlane plane = rt._plane;
104 if (rtm_mode == RTM_bind_or_copy && plane != RTP_color) {
105 CDWriter cdataw(_cycler, cdata,
false);
106 nassertr(cdata->_textures.size() == cdataw->_textures.size(),
false);
107 cdataw->_textures[i]._rtm_mode = RTM_copy_texture;
110 clear_cube_map_selection();
114 return _gsg->begin_frame(current_thread);
126 end_frame_spam(mode);
129 if (mode == FM_render) {
131 bind_texture_to_pbuffer();
134 _gsg->end_frame(current_thread);
136 if (mode == FM_render) {
138 clear_cube_map_selection();
148 void wglGraphicsBuffer::
149 bind_texture_to_pbuffer() {
151 DCAST_INTO_V(wglgsg, _gsg);
157 CDLockedReader cdata(_cycler);
158 for (
size_t i = 0; i != cdata->_textures.size(); ++i) {
159 const RenderTexture &rt = cdata->_textures[i];
160 RenderTexturePlane plane = rt._plane;
161 if (plane == RTP_color) {
167 if (tex_index >= 0) {
168 const RenderTexture &rt = cdata->_textures[tex_index];
170 if ((_pbuffer_bound != 0)&&(_pbuffer_bound != tex)) {
171 _pbuffer_bound->release(wglgsg->get_prepared_objects());
177 if (_fb_properties.get_alpha_bits()) {
187 if (target == GL_NONE) {
188 CDWriter cdataw(_cycler, cdata,
false);
189 nassertv(cdata->_textures.size() == cdataw->_textures.size());
190 cdataw->_textures[tex_index]._rtm_mode = RTM_copy_texture;
193 GLP(BindTexture)(target, gtc->_index);
194 if (_fb_properties.is_single_buffered()) {
195 wglgsg->_wglBindTexImageARB(_pbuffer, WGL_FRONT_LEFT_ARB);
197 wglgsg->_wglBindTexImageARB(_pbuffer, WGL_BACK_LEFT_ARB);
199 _pbuffer_bound = tex;
201 if (_pbuffer_bound != 0) {
202 _pbuffer_bound->
release(wglgsg->get_prepared_objects());
220 DCAST_INTO_V(wglgsg, _gsg);
222 nassertv(wglgsg->_wglSetPbufferAttribARB != NULL);
224 static const int max_attrib_list = 64;
225 int iattrib_list[max_attrib_list];
228 iattrib_list[ni++] = WGL_CUBE_MAP_FACE_ARB;
229 iattrib_list[ni++] = WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + page;
232 nassertv(ni <= max_attrib_list);
233 iattrib_list[ni] = 0;
235 wglgsg->_wglSetPbufferAttribARB(_pbuffer, iattrib_list);
257 while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
277 DCAST_INTO_R(wglgsg, _gsg,
false);
287 void wglGraphicsBuffer::
291 DCAST_INTO_V(wglgsg, _gsg);
308 bool wglGraphicsBuffer::
315 _fb_properties.set_back_buffers(0);
316 _draw_buffer_type = RenderBuffer::T_front;
317 _screenshot_buffer_type = RenderBuffer::T_front;
330 DCAST_INTO_R(wglgsg, _gsg,
false);
343 if (twindow_dc == 0) {
353 wglGraphicsPipe::wgl_make_current(twindow_dc, context,
354 &_make_current_pcollector);
355 wglgsg->reset_if_new();
356 wglgsg->report_my_gl_errors();
358 (_fb_properties,wglgsg->get_gl_renderer())) {
368 if (!rebuild_bitplanes()) {
369 wglGraphicsPipe::wgl_make_current(0, 0, &_make_current_pcollector);
386 void wglGraphicsBuffer::
393 DCAST_INTO_V(wglgsg, _gsg);
395 if (_pbuffer_bound != 0) {
396 _pbuffer_bound->release(wglgsg->get_prepared_objects());
399 wglGraphicsPipe::wgl_make_current(0, 0, NULL);
401 wglgsg->_wglReleasePbufferDCARB(_pbuffer, _pbuffer_dc);
404 wglgsg->_wglDestroyPbufferARB(_pbuffer);
406 _pbuffer = (HPBUFFERARB)0;
407 _pbuffer_dc = (HDC)0;
408 _pbuffer_mipmap =
false;
411 _pbuffer_type = Texture::TT_2d_texture;
422 bool wglGraphicsBuffer::
423 rebuild_bitplanes() {
425 DCAST_INTO_R(wglgsg, _gsg,
false);
427 if (!wglgsg->_supports_pbuffer) {
428 wgldisplay_cat.info()
429 <<
"PBuffers not supported by GL implementation.\n";
448 wglgsg->_wglQueryPbufferARB(_pbuffer, WGL_PBUFFER_LOST_ARB, &flag);
457 if ((_host != 0)&&(_creation_flags & GraphicsPipe::BF_size_track_host)) {
458 if (_host->get_size() != _size) {
460 _host->get_y_size());
469 bool desired_mipmap =
false;
470 Texture::TextureType desired_type = Texture::TT_2d_texture;
471 if (bindtexture != 0) {
476 if ((_pbuffer != 0)&&
477 (_pbuffer_sizex == desired_x)&&
478 (_pbuffer_sizey == desired_y)&&
479 (_pbuffer_mipmap == desired_mipmap)&&
480 (_pbuffer_type == desired_type)) {
493 static const int max_attrib_list = 64;
494 int iattrib_list[max_attrib_list];
497 if (_fb_properties.get_alpha_bits()) {
498 iattrib_list[ni++] = WGL_TEXTURE_FORMAT_ARB;
499 iattrib_list[ni++] = WGL_TEXTURE_RGBA_ARB;
501 iattrib_list[ni++] = WGL_TEXTURE_FORMAT_ARB;
502 iattrib_list[ni++] = WGL_TEXTURE_RGB_ARB;
505 if (desired_mipmap) {
506 iattrib_list[ni++] = WGL_MIPMAP_TEXTURE_ARB;
507 iattrib_list[ni++] = 1;
510 switch (desired_type) {
511 case Texture::TT_cube_map:
512 iattrib_list[ni++] = WGL_TEXTURE_TARGET_ARB;
513 iattrib_list[ni++] = WGL_TEXTURE_CUBE_MAP_ARB;
516 case Texture::TT_1d_texture:
517 iattrib_list[ni++] = WGL_TEXTURE_TARGET_ARB;
518 iattrib_list[ni++] = WGL_TEXTURE_1D_ARB;
522 iattrib_list[ni++] = WGL_TEXTURE_TARGET_ARB;
523 iattrib_list[ni++] = WGL_TEXTURE_2D_ARB;
527 nassertr(ni <= max_attrib_list,
false);
528 iattrib_list[ni] = 0;
531 if (twindow_dc == 0) {
539 wglGraphicsPipe::wgl_make_current(twindow_dc, context,
540 &_make_current_pcollector);
542 _pbuffer = wglgsg->_wglCreatePbufferARB(twindow_dc, pfnum,
543 desired_x, desired_y, iattrib_list);
546 wgldisplay_cat.info()
547 <<
"Attempt to create pbuffer failed.\n";
551 _pbuffer_dc = wglgsg->_wglGetPbufferDCARB(_pbuffer);
552 _pbuffer_mipmap = desired_mipmap;
553 _pbuffer_type = desired_type;
554 _pbuffer_sizex = desired_x;
555 _pbuffer_sizey = desired_y;
565 void wglGraphicsBuffer::
569 if (!GetMessage(&msg, NULL, 0, 0)) {
576 TranslateMessage(&msg);
578 DispatchMessage(&msg);
Format get_format() const
Returns the format of the texture, which represents both the semantic meaning of the texels and...
virtual bool begin_frame(FrameMode mode, Thread *current_thread)
This function will be called within the draw thread before beginning rendering for a given frame...
HDC get_twindow_dc()
Returns the DC associated with the temporary, invisible window that was created with the gsg to query...
void set_size_and_recalc(int x, int y)
Changes the x_size and y_size, then recalculates structures that depend on size.
virtual Texture * get_texture(int i=0) const
Returns the nth texture into which the GraphicsOutput renders.
virtual void end_frame(FrameMode mode, Thread *current_thread)
This function will be called within the draw thread after rendering is completed for a given frame...
bool pfnum_supports_pbuffer() const
Returns true if the gsg's pixel format is capable of supporting a pbuffer.
bool get_supports_wgl_render_texture() const
Returns true if this particular GSG can render from a wglGraphicsBuffer directly into a texture...
Represents a texture object, which is typically a single 2-d image but may also represent a 1-d or 3-...
void set_format(Format format)
Changes the format value for the texture components.
const FrameBufferProperties & get_fb_properties() const
Returns the properties of the pixel format that was chosen for this gsg.
This is a special class object that holds all the information returned by a particular GSG to indicat...
bool get_match_framebuffer_format() const
Returns true if the special flag was set that indicates to the GSG that the Texture's format should b...
int get_y_size() const
Returns the visible height of the window or buffer, if it is known.
virtual bool get_supports_render_texture() const
Returns true if this particular GraphicsOutput can render directly into a texture, or false if it must always copy-to-texture at the end of each frame to achieve this effect.
bool subsumes(const FrameBufferProperties &other) const
Returns true if this set of properties makes strictly greater or equal demands of the framebuffer tha...
bool uses_mipmaps() const
Returns true if the minfilter settings on this texture indicate the use of mipmapping, false otherwise.
A tiny specialization on GLGraphicsStateGuardian to add some wgl-specific information.
bool verify_hardware_software(const FrameBufferProperties &props, const string &renderer) const
Validates that the properties represent the desired kind of renderer (hardware or software)...
int get_pfnum() const
Returns the pixel format number chosen for windows that use this context.
bool release(PreparedGraphicsObjects *prepared_objects)
Frees the texture context only on the indicated object, if it exists there.
virtual void process_events()
Honor any requests recently made via request_open() or request_close().
void set_size_padded(int x=1, int y=1, int z=1)
Changes the size of the texture, padding if necessary, and setting the pad region as well...
static AutoTextureScale get_textures_power_2()
This flag returns ATS_none, ATS_up, or ATS_down and controls the scaling of textures in general...
A container for the various kinds of properties we might ask to have on a graphics window before we o...
An offscreen buffer for rendering into.
HGLRC get_context(HDC hdc)
Returns the GL context associated with the GSG.
void choose_pixel_format(const FrameBufferProperties &properties, bool need_pbuffer)
Selects a pixel format for all the windows and buffers that use this gsg.
virtual void process_events()
Do whatever processing is necessary to ensure that the window responds to user events.
An object to create GraphicsOutputs that share a particular 3-D API.
This template class calls PipelineCycler::read() in the constructor and PipelineCycler::release_read(...
This template class calls PipelineCycler::write() in the constructor and PipelineCycler::release_writ...
RenderTextureMode get_rtm_mode(int i=0) const
Returns the RenderTextureMode associated with the nth render-texture.
TextureType get_texture_type() const
Returns the overall interpretation of the texture.
This is a base class for the various different classes that represent the result of a frame of render...
TextureContext * prepare_now(int view, PreparedGraphicsObjects *prepared_objects, GraphicsStateGuardianBase *gsg)
Creates a context for the texture on the particular GSG, if it does not already exist.
int count_textures() const
If the GraphicsOutput is set to render into a texture, returns the number of textures that are being ...
int get_x_size() const
Returns the visible width of the window or buffer, if it is known.
static int up_to_power_2(int value)
Returns the smallest power of 2 greater than or equal to value.
A thread; that is, a lightweight process.
Encapsulates all the communication with a particular instance of a given rendering backend...
virtual void select_target_tex_page(int page)
Called internally when the window is in render-to-a-texture mode and we are in the process of renderi...
This class is the main interface to controlling the render process.
const FrameBufferProperties & get_fb_properties() const
Returns the framebuffer properties of the window.
TypeHandle is the identifier used to differentiate C++ class types.
A container for the various kinds of properties we might ask to have on a graphics frameBuffer before...