GraphicsEngine
-
class GraphicsEngine
Bases:
ReferenceCount
This class is the main interface to controlling the render process. There is typically only one GraphicsEngine in an application, and it synchronizes rendering to all all of the active windows; although it is possible to have multiple GraphicsEngine objects if multiple synchronicity groups are required.
The GraphicsEngine is responsible for managing the various cull and draw threads. The application simply calls engine->render_frame() and considers it done.
Inheritance diagram
-
explicit GraphicsEngine(Pipeline *pipeline = nullptr)
Creates a new
GraphicsEngine
object. The Pipeline is normally left to default to NULL, which indicates the global render pipeline, but it may be any Pipeline you choose.
-
bool add_window(GraphicsOutput *window, int sort)
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 asmake_output
normally does this under the hood; it may be useful in esoteric cases in which a custom window object is used.This can be called during the rendering loop, unlike
make_output()
; the window will be opened before the next frame begins rendering. Because it doesn’t callopen_windows()
, however, it’s not guaranteed that the window will succeed opening even if it returns true.
-
void dispatch_compute(LVecBase3i const &work_groups, ShaderAttrib const *sattr, GraphicsStateGuardian *gsg)
Asks the indicated
GraphicsStateGuardian
to dispatch the compute shader in the givenShaderAttrib
using the given work group counts. This can act as an interface for running a one-off compute shader, without having to store it in the scene graph using aComputeNode
.Since this requires a round-trip to the draw thread, it may require waiting for the current thread to finish rendering if it is called in a multithreaded environment. However, you can call this several consecutive times on different textures for little additional cost.
The return value is true if the operation is successful, false otherwise.
-
bool extract_texture_data(Texture *tex, GraphicsStateGuardian *gsg)
Asks the indicated
GraphicsStateGuardian
to retrieve the texture memory image of the indicated texture and store it in the texture’s ram_image field. The image can then be written to disk viaTexture::write()
, or otherwise manipulated on the CPU.This is useful for retrieving the contents of a texture that has been somehow generated on the graphics card, instead of having been loaded the normal way via
Texture::read()
orTexture::load()
. It is particularly useful for getting the data associated with a compressed texture image.Since this requires a round-trip to the draw thread, it may require waiting for the current thread to finish rendering if it is called in a multithreaded environment. However, you can call this several consecutive times on different textures for little additional cost.
If the texture has not yet been loaded to the GSG in question, it will be loaded immediately.
The return value is true if the operation is successful, false otherwise.
-
void flip_frame(void)
Waits for all the threads that started drawing their last frame to finish drawing, and then flips all the windows. It is not usually necessary to call this explicitly, unless you need to see the previous frame right away.
-
bool get_auto_flip(void) const
Returns the current setting for the auto-flip flag. See
set_auto_flip
.
-
Loader *get_default_loader(void) const
Returns the Loader object that will be assigned to every GSG created with this
GraphicsEngine
. SeeGraphicsStateGuardian::set_loader()
.
-
static GraphicsEngine *get_global_ptr(void)
-
int get_num_windows(void) const
Returns the number of windows (or buffers) managed by the engine.
-
bool get_portal_cull(void) const
Returns the current setting for the portal culling flag.
-
ReMutex const &get_render_lock(void) const
Returns a
ReMutex
object that is held by theGraphicsEngine
during the entire call torender_frame()
. While you hold this lock you can be confident that no part of the frame will be rendered (at least by the app thread).
-
GraphicsThreadingModel get_threading_model(void) const
Returns the threading model that will be applied to future objects. See
set_threading_model()
.
-
GraphicsOutput *get_window(int n) const
Returns the nth window or buffers managed by the engine, in sorted order.
-
bool is_empty(void) const
Returns true if there are no windows or buffers managed by the engine, false if there is at least one.
-
GraphicsOutput *make_buffer(GraphicsOutput *host, std::string const &name, int sort, int x_size, int y_size)
-
GraphicsOutput *make_buffer(GraphicsStateGuardian *gsg, std::string const &name, int sort, int x_size, int y_size)
Syntactic shorthand versions of
make_output
Syntactic shorthand for
make_output
. This is the preferred way to create an offscreen buffer, when you already have an onscreen window or another buffer to start with. For the first parameter, pass an existingGraphicsOutput
object, e.g. the main window; this allows the buffer to adapt itself to that window’s framebuffer properties, and allows maximum sharing of resources.Syntactic shorthand for
make_output
. This flavor accepts a GSG rather than aGraphicsOutput
as the first parameter, which is too limiting and disallows the possibility of creating aParasiteBuffer
if the user’s graphics hardware prefers that. It also attempts to request specific framebuffer properties and may therefore do a poorer job of sharing the GSG between the old buffer and the new.For these reasons, this variant is a poor choice unless you are creating an offscreen buffer for the first time, without an onscreen window already in existence. If you already have an onscreen window, you should use the other flavor of make_buffer() instead, which accepts a
GraphicsOutput
as the first parameter.
-
GraphicsOutput *make_output(GraphicsPipe *pipe, std::string const &name, int sort, FrameBufferProperties const &fb_prop, WindowProperties const &win_prop, int flags, GraphicsStateGuardian *gsg = nullptr, GraphicsOutput *host = nullptr)
-
GraphicsOutput *make_parasite(GraphicsOutput *host, std::string const &name, int sort, int x_size, int y_size)
Syntactic shorthand for
make_buffer
.
-
void open_windows(void)
Fully opens (or closes) any windows that have recently been requested open or closed, without rendering any frames. It is not necessary to call this explicitly, since windows will be automatically opened or closed when the next frame is rendered, but you may call this if you want your windows now without seeing a frame go by.
-
void ready_flip(void)
Waits for all the threads that started drawing their last frame to finish drawing. Returns when all threads have actually finished drawing, as opposed to ‘sync_frame’ we seems to return once all draw calls have been submitted. Calling ‘flip_frame’ after this function should immediately cause a buffer flip. This function will only work in opengl right now, for all other graphics pipelines it will simply return immediately. In opengl it’s a bit of a hack: it will attempt to read a single pixel from the frame buffer to force the graphics card to finish drawing before it returns
-
void remove_all_windows(void)
Removes and closes all windows from the engine. This also cleans up and terminates any threads that have been started to service those windows.
-
bool remove_window(GraphicsOutput *window)
Removes the indicated window or offscreen buffer from the set of windows that will be processed when
render_frame()
is called. This also closes the window if it is open, and removes the window from itsGraphicsPipe
, allowing the window to be destructed if there are no other references to it. (However, the window may not be actually closed until next frame, if it is controlled by a sub-thread.)The return value is true if the window was removed, false if it was not found.
Unlike
remove_all_windows()
, this function does not terminate any of the threads that may have been started to service this window; they are left running (since you might open a new window later on these threads). If your intention is to clean up before shutting down, it is better to callremove_all_windows()
then to call remove_window() one at a time.
-
void render_frame(void)
Renders the next frame in all the registered windows, and flips all of the frame buffers.
-
void reset_all_windows(bool swapchain)
Resets the framebuffer of the current window. This is currently used by DirectX 8 only. It calls a reset_window function on each active window to release/create old/new framebuffer
-
void set_auto_flip(bool auto_flip)
Set this flag true to indicate the
GraphicsEngine
should automatically cause windows to sync and flip as soon as they have finished drawing, rather than waiting for all of the windows to finish drawing first so they can flip together.This only affects the timing of when the flip occurs. If this is true (the default), the flip occurs before
render_frame()
returns. If this is false, the flip occurs wheneverflip_frame()
is called, or at the beginning of the next call torender_frame()
, ifflip_frame()
is never called.
-
void set_default_loader(Loader *loader)
Sets the Loader object that will be assigned to every GSG created with this
GraphicsEngine
. SeeGraphicsStateGuardian::set_loader()
.
-
void set_portal_cull(bool value)
Set this flag true to indicate the
GraphicsEngine
should start portal culling
-
void set_threading_model(GraphicsThreadingModel const &threading_model)
Specifies how future objects created via make_gsg(),
make_buffer()
, andmake_output()
will be threaded. This does not affect any already-created objects.
-
void sync_frame(void)
Waits for all the threads that started drawing their last frame to finish drawing. The windows are not yet flipped when this returns; see also
flip_frame()
. It is not usually necessary to call this explicitly, unless you need to see the previous frame right away.
-
explicit GraphicsEngine(Pipeline *pipeline = nullptr)