mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 16:58:40 -04:00
Changes to support a custom GraphicsWindow derivation
This commit is contained in:
parent
9b747b525e
commit
94e5bbf579
@ -476,6 +476,42 @@ make_output(GraphicsPipe *pipe,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsEngine::add_window
|
||||
// Access: Published
|
||||
// Description: This can be used to add a newly-created
|
||||
// GraphicsOutput object (and its GSG) to the engine's
|
||||
// list of windows, and requests that it be opened.
|
||||
// This shouldn't be called by user code as
|
||||
// make_output normally does this under the hood; it
|
||||
// may be useful in esoteric cases in which a custom
|
||||
// window object is used.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool GraphicsEngine::
|
||||
add_window(GraphicsOutput *window, int sort) {
|
||||
nassertr(window != NULL, false);
|
||||
|
||||
GraphicsThreadingModel threading_model = get_threading_model();
|
||||
nassertr(this == window->get_engine(), false);
|
||||
|
||||
window->_sort = sort;
|
||||
do_add_window(window, threading_model);
|
||||
|
||||
open_windows();
|
||||
if (window->is_valid()) {
|
||||
do_add_gsg(window->get_gsg(), window->get_pipe(), threading_model);
|
||||
|
||||
display_cat.info()
|
||||
<< "Added output of type " << window->get_type() << "\n";
|
||||
|
||||
return true;
|
||||
|
||||
} else {
|
||||
remove_window(window);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsEngine::remove_window
|
||||
// Access: Published
|
||||
@ -2107,6 +2143,8 @@ do_add_window(GraphicsOutput *window,
|
||||
void GraphicsEngine::
|
||||
do_add_gsg(GraphicsStateGuardian *gsg, GraphicsPipe *pipe,
|
||||
const GraphicsThreadingModel &threading_model) {
|
||||
nassertv(gsg != NULL);
|
||||
|
||||
ReMutexHolder holder(_lock);
|
||||
nassertv(gsg->get_pipe() == pipe && gsg->get_engine() == this);
|
||||
gsg->_threading_model = threading_model;
|
||||
|
@ -80,7 +80,7 @@ PUBLISHED:
|
||||
const WindowProperties &win_prop,
|
||||
int flags, GraphicsStateGuardian *gsg = NULL,
|
||||
GraphicsOutput *host = NULL);
|
||||
|
||||
|
||||
// Syntactic shorthand versions of make_output
|
||||
INLINE GraphicsOutput *make_buffer(GraphicsOutput *host,
|
||||
const string &name, int sort,
|
||||
@ -91,7 +91,8 @@ PUBLISHED:
|
||||
INLINE GraphicsOutput *make_parasite(GraphicsOutput *host,
|
||||
const string &name, int sort,
|
||||
int x_size, int y_size);
|
||||
|
||||
|
||||
bool add_window(GraphicsOutput *window, int sort);
|
||||
bool remove_window(GraphicsOutput *window);
|
||||
void remove_all_windows();
|
||||
void reset_all_windows(bool swapchain);
|
||||
@ -104,7 +105,7 @@ PUBLISHED:
|
||||
BLOCKING void render_frame();
|
||||
BLOCKING void open_windows();
|
||||
BLOCKING void sync_frame();
|
||||
BLOCKING void ready_flip();
|
||||
BLOCKING void ready_flip();
|
||||
BLOCKING void flip_frame();
|
||||
|
||||
bool extract_texture_data(Texture *tex, GraphicsStateGuardian *gsg);
|
||||
@ -130,7 +131,7 @@ public:
|
||||
public:
|
||||
static void do_cull(CullHandler *cull_handler, SceneSetup *scene_setup,
|
||||
GraphicsStateGuardian *gsg, Thread *current_thread);
|
||||
|
||||
|
||||
private:
|
||||
typedef ov_set< PT(GraphicsOutput), IndirectLess<GraphicsOutput> > Windows;
|
||||
typedef pset< PT(GraphicsStateGuardian) > GSGs;
|
||||
@ -158,7 +159,7 @@ private:
|
||||
void do_flip_frame(Thread *current_thread);
|
||||
INLINE void close_gsg(GraphicsPipe *pipe, GraphicsStateGuardian *gsg);
|
||||
|
||||
PT(SceneSetup) setup_scene(GraphicsStateGuardian *gsg,
|
||||
PT(SceneSetup) setup_scene(GraphicsStateGuardian *gsg,
|
||||
DisplayRegionPipelineReader *dr);
|
||||
void do_draw(CullResult *cull_result, SceneSetup *scene_setup,
|
||||
GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread);
|
||||
@ -281,7 +282,7 @@ private:
|
||||
Windows _cull; // cull stage
|
||||
Windows _cdraw; // cull-and-draw-together stage
|
||||
Windows _draw; // draw stage
|
||||
Windows _window; // window stage, i.e. process windowing events
|
||||
Windows _window; // window stage, i.e. process windowing events
|
||||
|
||||
// These are not kept sorted.
|
||||
Windows _pending_close; // moved from _window, pending close.
|
||||
|
@ -82,11 +82,25 @@ GraphicsPipe::
|
||||
// performed: typically either the app thread (e.g. X)
|
||||
// or the draw thread (Windows).
|
||||
////////////////////////////////////////////////////////////////////
|
||||
GraphicsPipe::PreferredWindowThread
|
||||
GraphicsPipe::PreferredWindowThread
|
||||
GraphicsPipe::get_preferred_window_thread() const {
|
||||
return PWT_draw;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsPipe::make_callback_gsg
|
||||
// Access: Public, Virtual
|
||||
// Description: This is called when make_output() is used to create a
|
||||
// CallbackGraphicsWindow. If the GraphicsPipe can
|
||||
// construct a GSG that's not associated with any
|
||||
// particular window object, do so now, assuming the
|
||||
// correct graphics context has been set up externally.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
PT(GraphicsStateGuardian) GraphicsPipe::
|
||||
make_callback_gsg(GraphicsEngine *engine) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsPipe::make_device
|
||||
// Access: Public, Virtual
|
||||
@ -95,7 +109,7 @@ GraphicsPipe::get_preferred_window_thread() const {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
PT(GraphicsDevice) GraphicsPipe::
|
||||
make_device(void *scrn) {
|
||||
display_cat.error()
|
||||
display_cat.error()
|
||||
<< "make_device() unimplemented by " << get_type() << "\n";
|
||||
return NULL;
|
||||
}
|
||||
@ -138,20 +152,6 @@ make_output(const string &name,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsPipe::make_callback_gsg
|
||||
// Access: Protected, Virtual
|
||||
// Description: This is called when make_output() is used to create a
|
||||
// CallbackGraphicsWindow. If the GraphicsPipe can
|
||||
// construct a GSG that's not associated with any
|
||||
// particular window object, do so now, assuming the
|
||||
// correct graphics context has been set up externally.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
PT(GraphicsStateGuardian) GraphicsPipe::
|
||||
make_callback_gsg(GraphicsEngine *engine) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsPipe::get_display_information
|
||||
// Access: Published
|
||||
|
@ -101,7 +101,7 @@ PUBLISHED:
|
||||
|
||||
DisplayInformation *get_display_information();
|
||||
virtual void lookup_cpu_data();
|
||||
|
||||
|
||||
virtual string get_interface_name() const=0;
|
||||
|
||||
public:
|
||||
@ -114,9 +114,11 @@ public:
|
||||
INLINE GraphicsDevice *get_device() const;
|
||||
virtual PT(GraphicsDevice) make_device(void *scrn = NULL);
|
||||
|
||||
virtual PT(GraphicsStateGuardian) make_callback_gsg(GraphicsEngine *engine);
|
||||
|
||||
protected:
|
||||
virtual void close_gsg(GraphicsStateGuardian *gsg);
|
||||
|
||||
|
||||
virtual PT(GraphicsOutput) make_output(const string &name,
|
||||
const FrameBufferProperties &fb_prop,
|
||||
const WindowProperties &win_prop,
|
||||
@ -126,8 +128,7 @@ protected:
|
||||
GraphicsOutput *host,
|
||||
int retry,
|
||||
bool &precertify);
|
||||
virtual PT(GraphicsStateGuardian) make_callback_gsg(GraphicsEngine *engine);
|
||||
|
||||
|
||||
LightMutex _lock;
|
||||
|
||||
bool _is_valid;
|
||||
@ -135,7 +136,7 @@ protected:
|
||||
int _display_width;
|
||||
int _display_height;
|
||||
PT(GraphicsDevice) _device;
|
||||
|
||||
|
||||
DisplayInformation *_display_information;
|
||||
|
||||
static const int strip_properties[];
|
||||
|
Loading…
x
Reference in New Issue
Block a user