171 lines
6.0 KiB
C++
171 lines
6.0 KiB
C++
// Filename: graphicsBuffer.cxx
|
|
// Created by: drose (06Feb04)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
//
|
|
// All use of this software is subject to the terms of the revised BSD
|
|
// license. You should have received a copy of this license along
|
|
// with this source code in a file named "LICENSE."
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#include "graphicsBuffer.h"
|
|
|
|
TypeHandle GraphicsBuffer::_type_handle;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: GraphicsBuffer::Constructor
|
|
// Access: Protected
|
|
// Description: Normally, the GraphicsBuffer constructor is not
|
|
// called directly; these are created instead via the
|
|
// GraphicsEngine::make_buffer() function.
|
|
////////////////////////////////////////////////////////////////////
|
|
GraphicsBuffer::
|
|
GraphicsBuffer(GraphicsEngine *engine, GraphicsPipe *pipe,
|
|
const string &name,
|
|
const FrameBufferProperties &fb_prop,
|
|
const WindowProperties &win_prop, int flags,
|
|
GraphicsStateGuardian *gsg,
|
|
GraphicsOutput *host) :
|
|
GraphicsOutput(engine, pipe, name, fb_prop, win_prop, flags, gsg, host, false)
|
|
{
|
|
#ifdef DO_MEMORY_USAGE
|
|
MemoryUsage::update_type(this, this);
|
|
#endif
|
|
|
|
if (display_cat.is_debug()) {
|
|
display_cat.debug()
|
|
<< "Creating new offscreen buffer " << get_name() << "\n";
|
|
}
|
|
|
|
_overlay_display_region->compute_pixels(_size.get_x(), _size.get_y());
|
|
_open_request = OR_none;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: GraphicsBuffer::Destructor
|
|
// Access: Published, Virtual
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
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
|
|
// Access: Public, Virtual
|
|
// Description: This is called by the GraphicsEngine to request that
|
|
// the buffer (or whatever) open itself or, in general,
|
|
// make itself valid, at the next call to
|
|
// process_events().
|
|
////////////////////////////////////////////////////////////////////
|
|
void GraphicsBuffer::
|
|
request_open() {
|
|
_open_request = OR_open;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: GraphicsBuffer::request_close
|
|
// Access: Public, Virtual
|
|
// Description: This is called by the GraphicsEngine to request that
|
|
// the buffer (or whatever) close itself or, in general,
|
|
// make itself invalid, at the next call to
|
|
// process_events(). By that time we promise the gsg
|
|
// pointer will be cleared.
|
|
////////////////////////////////////////////////////////////////////
|
|
void GraphicsBuffer::
|
|
request_close() {
|
|
_open_request = OR_none;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: GraphicsBuffer::set_close_now
|
|
// Access: Public, Virtual
|
|
// Description: This is called by the GraphicsEngine to insist that
|
|
// the buffer be closed immediately. This is only
|
|
// called from the buffer thread.
|
|
////////////////////////////////////////////////////////////////////
|
|
void GraphicsBuffer::
|
|
set_close_now() {
|
|
_open_request = OR_none;
|
|
close_buffer();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: GraphicsBuffer::process_events
|
|
// Access: Public, Virtual
|
|
// Description: Honor any requests recently made via request_open()
|
|
// or request_close().
|
|
//
|
|
// This function is called only within the window
|
|
// thread.
|
|
////////////////////////////////////////////////////////////////////
|
|
void GraphicsBuffer::
|
|
process_events() {
|
|
// Save the current request and reset it immediately, in case we end
|
|
// up calling recursively back into this function.
|
|
OpenRequest this_request = _open_request;
|
|
_open_request = OR_none;
|
|
|
|
switch (this_request) {
|
|
case OR_none:
|
|
return;
|
|
|
|
case OR_open:
|
|
if (open_buffer()) {
|
|
_is_valid = true;
|
|
set_inverted(_gsg->get_copy_texture_inverted());
|
|
}
|
|
break;
|
|
|
|
case OR_close:
|
|
close_buffer();
|
|
break;
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: GraphicsBuffer::close_buffer
|
|
// Access: Protected, Virtual
|
|
// Description: Closes the buffer right now. Called from the window
|
|
// thread.
|
|
////////////////////////////////////////////////////////////////////
|
|
void GraphicsBuffer::
|
|
close_buffer() {
|
|
display_cat.info()
|
|
<< "Closing " << get_type() << "\n";
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: GraphicsBuffer::open_buffer
|
|
// Access: Protected, Virtual
|
|
// Description: Opens the buffer right now. Called from the window
|
|
// thread. Returns true if the buffer is successfully
|
|
// opened, or false if there was a problem.
|
|
////////////////////////////////////////////////////////////////////
|
|
bool GraphicsBuffer::
|
|
open_buffer() {
|
|
return false;
|
|
}
|