Core Graphics API
=================

.. code:: cpp

   #include <graphics/graphics.h>


Graphics Enumerations
---------------------

.. type:: enum gs_draw_mode

   Draw mode.  Can be one of the following values:

   - GS_POINTS    - Draws points
   - GS_LINES     - Draws individual lines
   - GS_LINESTRIP - Draws a line strip
   - GS_TRIS      - Draws individual triangles
   - GS_TRISTRIP  - Draws a triangle strip

.. type:: enum gs_color_format

   Color format.  Can be one of the following values:

   - GS_UNKNOWN     - Unknown format
   - GS_A8          - 8 bit alpha channel only
   - GS_R8          - 8 bit red channel only
   - GS_RGBA        - RGBA, 8 bits per channel
   - GS_BGRX        - BGRX, 8 bits per channel
   - GS_BGRA        - BGRA, 8 bits per channel
   - GS_R10G10B10A2 - RGBA, 10 bits per channel except alpha, which is 2
     bits
   - GS_RGBA16      - RGBA, 16 bits per channel
   - GS_R16         - 16 bit red channel only
   - GS_RGBA16F     - RGBA, 16 bit floating point per channel
   - GS_RGBA32F     - RGBA, 32 bit floating point per channel
   - GS_RG16F       - 16 bit floating point red and green channels only
   - GS_RG32F       - 32 bit floating point red and green channels only
   - GS_R16F        - 16 bit floating point red channel only
   - GS_R32F        - 32 bit floating point red channel only
   - GS_DXT1        - Compressed DXT1
   - GS_DXT3        - Compressed DXT3
   - GS_DXT5        - Compressed DXT5
   - GS_RGBA_UNORM  - RGBA, 8 bits per channel, no SRGB aliasing
   - GS_BGRX_UNORM  - BGRX, 8 bits per channel, no SRGB aliasing
   - GS_BGRA_UNORM  - BGRA, 8 bits per channel, no SRGB aliasing

.. type:: enum gs_zstencil_format

   Z-Stencil buffer format.  Can be one of the following values:

   - GS_ZS_NONE    - No Z-stencil buffer
   - GS_Z16        - 16 bit Z buffer
   - GS_Z24_S8     - 24 bit Z buffer, 8 bit stencil
   - GS_Z32F       - 32 bit floating point Z buffer
   - GS_Z32F_S8X24 - 32 bit floating point Z buffer, 8 bit stencil

.. type:: enum gs_index_type

   Index buffer type.  Can be one of the following values:

   - GS_UNSIGNED_SHORT - 16 bit index
   - GS_UNSIGNED_LONG  - 32 bit index

.. type:: enum gs_cull_mode

   Cull mode.  Can be one of the following values:

   - GS_BACK    - Cull back faces
   - GS_FRONT   - Cull front faces
   - GS_NEITHER - Cull neither

.. type:: enum gs_blend_type

   Blend type.  Can be one of the following values:

   - GS_BLEND_ZERO
   - GS_BLEND_ONE
   - GS_BLEND_SRCCOLOR
   - GS_BLEND_INVSRCCOLOR
   - GS_BLEND_SRCALPHA
   - GS_BLEND_INVSRCALPHA
   - GS_BLEND_DSTCOLOR
   - GS_BLEND_INVDSTCOLOR
   - GS_BLEND_DSTALPHA
   - GS_BLEND_INVDSTALPHA
   - GS_BLEND_SRCALPHASAT

.. type:: enum gs_depth_test

   Depth test type.  Can be one of the following values:

   - GS_NEVER
   - GS_LESS
   - GS_LEQUAL
   - GS_EQUAL
   - GS_GEQUAL
   - GS_GREATER
   - GS_NOTEQUAL
   - GS_ALWAYS

.. type:: enum gs_stencil_side

   Stencil side.  Can be one of the following values:

   - GS_STENCIL_FRONT=1
   - GS_STENCIL_BACK
   - GS_STENCIL_BOTH

.. type:: enum gs_stencil_op_type

   Stencil operation type.  Can be one of the following values:

   - GS_KEEP
   - GS_ZERO
   - GS_REPLACE
   - GS_INCR
   - GS_DECR
   - GS_INVERT

.. type:: enum gs_cube_sides

   Cubemap side.  Can be one of the following values:

   - GS_POSITIVE_X
   - GS_NEGATIVE_X
   - GS_POSITIVE_Y
   - GS_NEGATIVE_Y
   - GS_POSITIVE_Z
   - GS_NEGATIVE_Z

.. type:: enum gs_sample_filter

   Sample filter type.  Can be one of the following values:

   - GS_FILTER_POINT
   - GS_FILTER_LINEAR
   - GS_FILTER_ANISOTROPIC
   - GS_FILTER_MIN_MAG_POINT_MIP_LINEAR
   - GS_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT
   - GS_FILTER_MIN_POINT_MAG_MIP_LINEAR
   - GS_FILTER_MIN_LINEAR_MAG_MIP_POINT
   - GS_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR
   - GS_FILTER_MIN_MAG_LINEAR_MIP_POINT

.. type:: enum gs_address_mode

   Address mode.  Can be one of the following values:

   - GS_ADDRESS_CLAMP
   - GS_ADDRESS_WRAP
   - GS_ADDRESS_MIRROR
   - GS_ADDRESS_BORDER
   - GS_ADDRESS_MIRRORONCE

.. type:: enum gs_texture_type

   Texture type.  Can be one of the following values:

   - GS_TEXTURE_2D
   - GS_TEXTURE_3D
   - GS_TEXTURE_CUBE


Graphics Structures
-------------------

.. type:: struct gs_monitor_info
.. member:: int gs_monitor_info.rotation_degrees
.. member:: long gs_monitor_info.x
.. member:: long gs_monitor_info.y
.. member:: long gs_monitor_info.cx
.. member:: long gs_monitor_info.cy

---------------------

.. type:: struct gs_tvertarray
.. member:: size_t gs_tvertarray.width
.. member:: void *gs_tvertarray.array

---------------------

.. type:: struct gs_vb_data
.. member:: size_t gs_vb_data.num
.. member:: struct vec3 *gs_vb_data.points
.. member:: struct vec3 *gs_vb_data.normals
.. member:: struct vec3 *gs_vb_data.tangents
.. member:: uint32_t *gs_vb_data.colors
.. member:: size_t gs_vb_data.num_tex
.. member:: struct gs_tvertarray *gs_vb_data.tvarray

---------------------

.. type:: struct gs_sampler_info
.. member:: enum gs_sample_filter gs_sampler_info.filter
.. member:: enum gs_address_mode gs_sampler_info.address_u
.. member:: enum gs_address_mode gs_sampler_info.address_v
.. member:: enum gs_address_mode gs_sampler_info.address_w
.. member:: int gs_sampler_info.max_anisotropy
.. member:: uint32_t gs_sampler_info.border_color

---------------------

.. type:: struct gs_display_mode
.. member:: uint32_t gs_display_mode.width
.. member:: uint32_t gs_display_mode.height
.. member:: uint32_t gs_display_mode.bits
.. member:: uint32_t gs_display_mode.freq

---------------------

.. type:: struct gs_rect
.. member:: int gs_rect.x
.. member:: int gs_rect.y
.. member:: int gs_rect.cx
.. member:: int gs_rect.cy

---------------------

.. type:: struct gs_window

   A window structure.  This structure is used with a native widget.

.. member:: void                    *gs_window.hwnd

   (Windows only) an HWND widget.

.. member:: id  gs_window.view

   (Mac only) A view ID.

.. member:: uint32_t gs_window.id
            void* gs_window.display

   (Linux only) Window ID and display

---------------------

.. type:: struct gs_init_data

   Swap chain initialization data.

.. member:: struct gs_window        gs_init_data.window
.. member:: uint32_t                gs_init_data.cx
.. member:: uint32_t                gs_init_data.cy
.. member:: uint32_t                gs_init_data.num_backbuffers
.. member:: enum gs_color_format    gs_init_data.format
.. member:: enum gs_zstencil_format gs_init_data.zsformat
.. member:: uint32_t                gs_init_data.adapter

---------------------


Initialization Functions
------------------------

.. function:: void gs_enum_adapters(bool (*callback)(void *param, const char *name, uint32_t id), void *param)

   Enumerates adapters (this really only applies on windows).

   :param callback: Enumeration callback
   :param param:    Private data passed to the callback

---------------------

.. function:: int gs_create(graphics_t **graphics, const char *module, uint32_t adapter)

   Creates a graphics context

   :param graphics: Pointer to receive the graphics context
   :param module:   Module name
   :param adapter:  Adapter index
   :return:         Can return one of the following values:

                    - GS_SUCCESS
                    - GS_ERROR_FAIL
                    - GS_ERROR_MODULE_NOT_FOUND
                    - GS_ERROR_NOT_SUPPORTED

---------------------

.. function:: void gs_destroy(graphics_t *graphics)

   Destroys a graphics context

   :param graphics: Graphics context

---------------------

.. function:: void gs_enter_context(graphics_t *graphics)

   Enters and locks the graphics context

   :param graphics: Graphics context

---------------------

.. function:: void gs_leave_context(void)

   Leaves and unlocks the graphics context

   :param graphics: Graphics context

---------------------

.. function:: graphics_t *gs_get_context(void)

   :return: The currently locked graphics context for this thread

---------------------


Matrix Stack Functions
----------------------

.. function:: void gs_matrix_push(void)

   Pushes the matrix stack and duplicates the current matrix.

---------------------

.. function:: void gs_matrix_pop(void)

   Pops the current matrix from the matrix stack.

---------------------

.. function:: void gs_matrix_identity(void)

   Sets the current matrix to an identity matrix.

---------------------

.. function:: void gs_matrix_transpose(void)

   Transposes the current matrix.

---------------------

.. function:: void gs_matrix_set(const struct matrix4 *matrix)

   Sets the current matrix.

   :param matrix: The matrix to set

---------------------

.. function:: void gs_matrix_get(struct matrix4 *dst)

   Gets the current matrix

   :param dst: Destination matrix

---------------------

.. function:: void gs_matrix_mul(const struct matrix4 *matrix)

   Multiplies the current matrix

   :param matrix: Matrix to multiply the current stack matrix with

---------------------

.. function:: void gs_matrix_rotquat(const struct quat *rot)

   Multiplies the current matrix with a quaternion

   :param rot: Quaternion to multiple the current matrix stack with

---------------------

.. function:: void gs_matrix_rotaa(const struct axisang *rot)
              void gs_matrix_rotaa4f(float x, float y, float z, float angle)

   Multiplies the current matrix with an axis angle

   :param rot: Axis angle to multiple the current matrix stack with

---------------------

.. function:: void gs_matrix_translate(const struct vec3 *pos)
              void gs_matrix_translate3f(float x, float y, float z)

   Translates the current matrix

   :param pos: Vector to translate the current matrix stack with

---------------------

.. function:: void gs_matrix_scale(const struct vec3 *scale)
              void gs_matrix_scale3f(float x, float y, float z)

   Scales the current matrix

   :param scale: Scale value to scale the current matrix stack with

---------------------


Draw Functions
--------------

.. function:: gs_effect_t *gs_get_effect(void)

   :return: The currently active effect, or *NULL* if none active

---------------------

.. function:: void gs_draw_sprite(gs_texture_t *tex, uint32_t flip, uint32_t width, uint32_t height)

   Draws a 2D sprite.  Sets the "image" parameter of the current effect
   to the texture and renders a quad.

   If width or height is 0, the width or height of the texture will be
   used.  The flip value specifies whether the texture should be flipped
   on the U or V axis with GS_FLIP_U and GS_FLIP_V.

   :param tex:    Texture to draw
   :param flip:   Can be 0 or a bitwise-OR combination of one of the
                  following values:

                  - GS_FLIP_U - Flips the texture horizontally
                  - GS_FLIP_V - Flips the texture vertically

   :param width:  Width
   :param height: Height

---------------------

.. function:: void gs_draw_sprite_subregion(gs_texture_t *tex, uint32_t flip, uint32_t x, uint32_t y, uint32_t cx, uint32_t cy)

   Draws a subregion of a 2D sprite.  Sets the "image" parameter of the
   current effect to the texture and renders a quad.

   :param tex:    Texture to draw
   :param flip:   Can be 0 or a bitwise-OR combination of one of the
                  following values:

                  - GS_FLIP_U - Flips the texture horizontally
                  - GS_FLIP_V - Flips the texture vertically

   :param x:      X value within subregion
   :param y:      Y value within subregion
   :param cx:     CX value of subregion
   :param cy:     CY value of subregion

---------------------

.. function:: void gs_reset_viewport(void)

    Sets the viewport to current swap chain size

---------------------

.. function:: void gs_set_2d_mode(void)

    Sets the projection matrix to a default screen-sized orthographic
    mode

---------------------

.. function:: void gs_set_3d_mode(double fovy, double znear, double zfar)

    Sets the projection matrix to a default screen-sized perspective
    mode

    :param fovy:  Field of view (in degrees)
    :param znear: Near plane
    :param zfar:  Far plane

---------------------

.. function:: void gs_viewport_push(void)

   Pushes/stores the current viewport

---------------------

.. function:: void gs_viewport_pop(void)

   Pops/recalls the last pushed viewport

---------------------

.. function:: void gs_perspective(float fovy, float aspect, float znear, float zfar)

   Sets the projection matrix to a perspective mode

   :param fovy:   Field of view (in degrees)
   :param aspect: Aspect ratio
   :param znear:  Near plane
   :param zfar:   Far plane

---------------------

.. function:: void gs_blend_state_push(void)

   Pushes/stores the current blend state

---------------------

.. function:: void gs_blend_state_pop(void)

   Pops/restores the last blend state

---------------------

.. function:: void gs_reset_blend_state(void)

   Sets the blend state to the default value: source alpha and invert
   source alpha.

---------------------


Swap Chains
-----------

.. function:: gs_swapchain_t *gs_swapchain_create(const struct gs_init_data *data)

   Creates a swap chain (display view on a native widget)

   :param data: Swap chain initialization data
   :return:     New swap chain object, or *NULL* if failed

---------------------

.. function:: void     gs_swapchain_destroy(gs_swapchain_t *swapchain)

   Destroys a swap chain

---------------------

.. function:: void gs_resize(uint32_t cx, uint32_t cy)

   Resizes the currently active swap chain

   :param cx: New width
   :param cy: New height

---------------------

.. function:: void gs_get_size(uint32_t *cx, uint32_t *cy)

   Gets the size of the currently active swap chain

   :param cx: Pointer to receive width
   :param cy: Pointer to receive height

---------------------

.. function:: uint32_t gs_get_width(void)

   Gets the width of the currently active swap chain

---------------------

.. function:: uint32_t gs_get_height(void)

   Gets the height of the currently active swap chain

---------------------


Resource Loading
----------------

.. function:: void gs_load_vertexbuffer(gs_vertbuffer_t *vertbuffer)

   Loads a vertex buffer

   :param vertbuffer: Vertex buffer to load, or NULL to unload

---------------------

.. function:: void gs_load_indexbuffer(gs_indexbuffer_t *indexbuffer)

   Loads a index buffer

   :param indexbuffer: Index buffer to load, or NULL to unload

---------------------

.. function:: void gs_load_texture(gs_texture_t *tex, int unit)

   Loads a texture (this is usually not called manually)

   :param tex:  Texture to load, or NULL to unload
   :param unit: Texture unit to load texture for

---------------------

.. function:: void gs_load_samplerstate(gs_samplerstate_t *samplerstate, int unit)

   Loads a sampler state (this is usually not called manually)

   :param samplerstate: Sampler state to load, or NULL to unload
   :param unit:         Texture unit to load sampler state for

---------------------

.. function:: void gs_load_swapchain(gs_swapchain_t *swapchain)

   Loads a swapchain

   :param swapchain: Swap chain to load, or NULL to unload

---------------------


Draw Functions
--------------

.. function:: gs_texture_t  *gs_get_render_target(void)

   :return: The currently active render target

---------------------

.. function:: gs_zstencil_t *gs_get_zstencil_target(void)

   :return: The currently active Z-stencil target

---------------------

.. function:: void gs_set_render_target(gs_texture_t *tex, gs_zstencil_t *zstencil)

   Sets the active render target

   :param tex:      Texture to set as the active render target
   :param zstencil: Z-stencil to use as the active render target

---------------------

.. function:: void gs_set_cube_render_target(gs_texture_t *cubetex, int side, gs_zstencil_t *zstencil)

   Sets a cubemap side as the active render target

   :param cubetex:  Cubemap
   :param side:     Cubemap side
   :param zstencil: Z-stencil buffer, or *NULL* if none

---------------------

.. function:: void gs_copy_texture(gs_texture_t *dst, gs_texture_t *src)

   Copies a texture

   :param dst: Destination texture
   :param src: Source texture

---------------------

.. function:: void gs_stage_texture(gs_stagesurf_t *dst, gs_texture_t *src)

   Copies a texture to a staging surface and copies it to RAM.  Ideally
   best to give this a frame to process to prevent stalling.

   :param dst: Staging surface
   :param src: Texture to stage

---------------------

.. function:: void gs_begin_scene(void)
              void gs_end_scene(void)

   Begins/ends a scene (this is automatically called by libobs, there's
   no need to call this manually).

---------------------

.. function:: void gs_draw(enum gs_draw_mode draw_mode, uint32_t start_vert, uint32_t num_verts)

   Draws a primitive or set of primitives.

   :param draw_mode:  The primitive draw mode to use
   :param start_vert: Starting vertex index
   :param num_verts:  Number of vertices

---------------------

.. function:: void gs_clear(uint32_t clear_flags, const struct vec4 *color, float depth, uint8_t stencil)

   Clears color/depth/stencil buffers.

   :param clear_flags: Flags to clear with.  Can be one of the following
                       values:

                       - GS_CLEAR_COLOR   - Clears color buffer
                       - GS_CLEAR_DEPTH   - Clears depth buffer
                       - GS_CLEAR_STENCIL - Clears stencil buffer

   :param color:       Color value to clear the color buffer with
   :param depth:       Depth value to clear the depth buffer with
   :param stencil:     Stencil value to clear the stencil buffer with

---------------------

.. function:: void gs_present(void)

   Displays what was rendered on to the current render target

---------------------

.. function:: void gs_flush(void)

   Flushes GPU calls

---------------------

.. function:: void gs_set_cull_mode(enum gs_cull_mode mode)

   Sets the current cull mode.

   :param mode: Cull mode

---------------------

.. function:: enum gs_cull_mode gs_get_cull_mode(void)

   :return: The current cull mode

---------------------

.. function:: void gs_enable_blending(bool enable)

   Enables/disables blending

   :param enable: *true* to enable, *false* to disable

---------------------

.. function:: void gs_enable_depth_test(bool enable)

   Enables/disables depth testing

   :param enable: *true* to enable, *false* to disable

---------------------

.. function:: void gs_enable_stencil_test(bool enable)

   Enables/disables stencil testing

   :param enable: *true* to enable, *false* to disable

---------------------

.. function:: void gs_enable_stencil_write(bool enable)

   Enables/disables stencil writing

   :param enable: *true* to enable, *false* to disable

---------------------

.. function:: void gs_enable_color(bool red, bool green, bool blue, bool alpha)

   Enables/disables specific color channels

   :param red:   *true* to enable red channel, *false* to disable
   :param green: *true* to enable green channel, *false* to disable
   :param blue:  *true* to enable blue channel, *false* to disable
   :param alpha: *true* to enable alpha channel, *false* to disable

---------------------

.. function:: void gs_blend_function(enum gs_blend_type src, enum gs_blend_type dest)

   Sets the blend function

   :param src:  Blend type for the source
   :param dest: Blend type for the destination

---------------------

.. function:: void gs_blend_function_separate(enum gs_blend_type src_c, enum gs_blend_type dest_c, enum gs_blend_type src_a, enum gs_blend_type dest_a)

   Sets the blend function for RGB and alpha separately

   :param src_c:  Blend type for the source RGB
   :param dest_c: Blend type for the destination RGB
   :param src_a:  Blend type for the source alpha
   :param dest_a: Blend type for the destination alpha

---------------------

.. function:: void gs_depth_function(enum gs_depth_test test)

   Sets the depth function

   :param test: Sets the depth test type

---------------------

.. function:: void gs_stencil_function(enum gs_stencil_side side, enum gs_depth_test test)

   Sets the stencil function

   :param side: Stencil side
   :param test: Depth test

---------------------

.. function:: void gs_stencil_op(enum gs_stencil_side side, enum gs_stencil_op_type fail, enum gs_stencil_op_type zfail, enum gs_stencil_op_type zpass)

   Sets the stencil operation

   :param side:  Stencil side
   :param fail:  Operation to perform on stencil test failure
   :param zfail: Operation to perform on depth test failure
   :param zpass: Operation to perform on depth test success

---------------------

.. function:: void gs_set_viewport(int x, int y, int width, int height)

   Sets the current viewport

   :param x:      X position relative to upper left
   :param y:      Y position relative to upper left
   :param width:  Width of the viewport
   :param height: Height of the viewport

---------------------

.. function:: void gs_get_viewport(struct gs_rect *rect)

   Gets the current viewport

   :param rect: Pointer to receive viewport rectangle

---------------------

.. function:: void gs_set_scissor_rect(const struct gs_rect *rect)

   Sets or clears the current scissor rectangle

   :rect: Scissor rectangle, or *NULL* to clear

---------------------

.. function:: void gs_ortho(float left, float right, float top, float bottom, float znear, float zfar)

   Sets the projection matrix to an orthographic matrix

---------------------

.. function:: void gs_frustum(float left, float right, float top, float bottom, float znear, float zfar)

   Sets the projection matrix to a frustum matrix

---------------------

.. function:: void gs_projection_push(void)

   Pushes/stores the current projection matrix

---------------------

.. function:: void gs_projection_pop(void)

   Pops/restores the last projection matrix pushed

---------------------


Texture Functions
-----------------

.. function:: gs_texture_t *gs_texture_create(uint32_t width, uint32_t height, enum gs_color_format color_format, uint32_t levels, const uint8_t **data, uint32_t flags)

   Creates a texture.

   :param width:        Width
   :param height:       Height
   :param color_format: Color format
   :param levels:       Number of total texture levels.  Set to 1 if no
                        mip-mapping
   :param data:         Pointer to array of texture data pointers
   :param flags:        Can be 0 or a bitwise-OR combination of one or
                        more of the following value:
                        
                        - GS_BUILD_MIPMAPS - Automatically builds
                          mipmaps (Note: not fully tested)
                        - GS_DYNAMIC - Dynamic
                        - GS_RENDER_TARGET - Render target

   :return:             A new texture object

---------------------

.. function:: gs_texture_t *gs_texture_create_from_file(const char *file)

   Creates a texture from a file.  Note that this isn't recommended for
   animated gifs -- instead use the :ref:`image_file_helper`.

   :param file: Image file to open

---------------------

.. function:: void     gs_texture_destroy(gs_texture_t *tex)

   Destroys a texture

   :param tex: Texture object

---------------------

.. function:: uint32_t gs_texture_get_width(const gs_texture_t *tex)

   Gets the texture's width

   :param tex: Texture object
   :return:    The texture's width

---------------------

.. function:: uint32_t gs_texture_get_height(const gs_texture_t *tex)

   Gets the texture's height

   :param tex: Texture object
   :return:    The texture's height

---------------------

.. function:: enum gs_color_format gs_texture_get_color_format(const gs_texture_t *tex)

   Gets the texture's color format

   :param tex: Texture object
   :return:    The texture's color format

---------------------

.. function:: bool     gs_texture_map(gs_texture_t *tex, uint8_t **ptr, uint32_t *linesize)

   Maps a texture.

   :param tex:      Texture object
   :param ptr:      Pointer to receive the pointer to the texture data
                    to write to
   :param linesize: Pointer to receive the line size (pitch) of the
                    texture

---------------------

.. function:: void     gs_texture_unmap(gs_texture_t *tex)

   Unmaps a texture.

   :param tex: Texture object

---------------------

.. function:: void gs_texture_set_image(gs_texture_t *tex, const uint8_t *data, uint32_t linesize, bool invert)

   Sets the image of a dynamic texture

   :param tex:      Texture object
   :param data:     Data to set as the image
   :param linesize: Line size (pitch) of the data
   :param invert:   *true* to invert vertically, *false* otherwise

---------------------

.. function:: gs_texture_t *gs_texture_create_from_dmabuf(unsigned int width, unsigned int height, uint32_t drm_format, enum gs_color_format color_format, uint32_t n_planes, const int *fds, const uint32_t *strides, const uint32_t *offsets, const uint64_t *modifiers)

   **Linux only:** Creates a texture from DMA-BUF metadata.

   Exchanging DMA-BUFs is a verbose process because of its multiplanar nature.
   For example, YUV can have each plane as a color channel, or a monitor buffer
   can have the cursor stored in a separate plane.

   This function treats the OBS Studio format and the DRM format separately.
   This allows creating textures from DMA-BUFs with unsupported formats (e.g.
   YUV) and perform the color format conversion using shaders. However, be
   careful to always try and match the formats correctly, otherwise textures
   can fail to be created or rendered.

   :param width:        Width of the texture
   :param height:       Height of the texture
   :param drm_format:   DRM format of the DMA-BUF buffer
   :param color_format: Color format compatible with OBS Studio
   :param n_planes:     Number of planes of the DMA-BUF
   :param fds:          Array of size *n_planes* with the file descriptor of each plane
   :param strides:      Array of size *n_planes* with the stride of each plane
   :param offsets:      Array of size *n_planes* with the offset of each plane
   :param modifiers:    Array of size *n_planes* with the modifier of each plane
   :return:             A texture object on success, or *NULL* on failure
   :rtype:              gs_texture_t*

---------------------

.. function:: gs_texture_t *gs_texture_create_from_iosurface(void *iosurf)

   **Mac only:** Creates a texture from an IOSurface.

   :param iosurf: IOSurface object

---------------------

.. function:: bool     gs_texture_rebind_iosurface(gs_texture_t *texture, void *iosurf)

   **Mac only:** Rebinds a texture to another IOSurface

   :param texture: Texture object
   :param iosuf:   IOSurface object

---------------------

.. function:: gs_texture_t *gs_texture_create_gdi(uint32_t width, uint32_t height)

   **Windows only:** Creates a GDI-interop texture

   :param width:  Width
   :param height: Height

---------------------

.. function:: void *gs_texture_get_dc(gs_texture_t *gdi_tex)

   **Windows only:** Gets the HDC of a GDI-interop texture.  Call
   :c:func:`gs_texture_release_dc()` to release the HDC.

   :param gdi_tex: GDI-interop texture object
   :return:        HDC object

---------------------

.. function:: void gs_texture_release_dc(gs_texture_t *gdi_tex)

   **Windows only:** Releases the HDC of the GDI-interop texture.

   :param gdi_tex: GDI-interop texture object

---------------------

.. function:: gs_texture_t *gs_texture_open_shared(uint32_t handle)

   **Windows only:** Creates a texture from a shared texture handle.

   :param handle: Shared texture handle
   :return:       A texture object

---------------------

.. function:: bool gs_gdi_texture_available(void)

   **Windows only:** Returns whether GDI-interop textures are available.

   :return: *true* if available, *false* otherwise

---------------------

.. function:: bool gs_shared_texture_available(void)

   **Windows only:** Returns whether shared textures are available.

   :return: *true* if available, *false* otherwise

---------------------


Cube Texture Functions
----------------------

.. function:: gs_texture_t *gs_cubetexture_create(uint32_t size, enum gs_color_format color_format, uint32_t levels, const uint8_t **data, uint32_t flags)

   Creates a cubemap texture.

   :param size:         Width/height/depth value
   :param color_format: Color format
   :param levels:       Number of texture levels
   :param data:         Pointer to array of texture data pointers
   :param flags:        Can be 0 or a bitwise-OR combination of one or
                        more of the following value:
                        
                        - GS_BUILD_MIPMAPS - Automatically builds
                          mipmaps (Note: not fully tested)
                        - GS_DYNAMIC - Dynamic
                        - GS_RENDER_TARGET - Render target

   :return:             A new cube texture object

---------------------

.. function:: void     gs_cubetexture_destroy(gs_texture_t *cubetex)

   Destroys a cube texture.

   :param cubetex: Cube texture object

---------------------

.. function:: uint32_t gs_cubetexture_get_size(const gs_texture_t *cubetex)

   Get the width/height/depth value of a cube texture.

   :param cubetex: Cube texture object
   :return:        The width/height/depth value of the cube texture

---------------------

.. function:: enum gs_color_format gs_cubetexture_get_color_format(const gs_texture_t *cubetex)

   Gets the color format of a cube texture.

   :param cubetex: Cube texture object
   :return:        The color format of the cube texture

---------------------

.. function:: void gs_cubetexture_set_image(gs_texture_t *cubetex, uint32_t side, const void *data, uint32_t linesize, bool invert)

   Sets an image of a cube texture side.

   :param cubetex:  Cube texture object
   :param side:     Side
   :param data:     Texture data to set
   :param linesize: Line size (pitch) of the texture data
   :param invert:   *true* to invert texture data, *false* otherwise

---------------------


Staging Surface Functions
-------------------------

Staging surfaces are used to efficiently copy textures from VRAM to RAM.

.. function:: gs_stagesurf_t *gs_stagesurface_create(uint32_t width, uint32_t height, enum gs_color_format color_format)

   Creates a staging surface.

   :param width:        Width
   :param height:       Height
   :param color_format: Color format
   :return:             The staging surface object

---------------------

.. function:: void     gs_stagesurface_destroy(gs_stagesurf_t *stagesurf)

   Destroys a staging surface.

   :param stagesurf: Staging surface object

---------------------

.. function:: uint32_t gs_stagesurface_get_width(const gs_stagesurf_t *stagesurf)
              uint32_t gs_stagesurface_get_height(const gs_stagesurf_t *stagesurf)

   Gets the width/height of a staging surface object.

   :param stagesurf: Staging surface object
   :return:          Width/height of the staging surface

---------------------

.. function:: enum gs_color_format gs_stagesurface_get_color_format(const gs_stagesurf_t *stagesurf)

   Gets the color format of a staging surface object.

   :param stagesurf: Staging surface object
   :return:          Color format of the staging surface

---------------------

.. function:: bool     gs_stagesurface_map(gs_stagesurf_t *stagesurf, uint8_t **data, uint32_t *linesize)

   Maps the staging surface texture (for reading).  Call
   :c:func:`gs_stagesurface_unmap()` to unmap when complete.

   :param stagesurf: Staging surface object
   :param data:      Pointer to receive texture data pointer
   :param linesize:  Pointer to receive line size (pitch) of the texture
                     data
   :return:          *true* if map successful, *false* otherwise

---------------------

.. function:: void     gs_stagesurface_unmap(gs_stagesurf_t *stagesurf)

   Unmaps a staging surface.

   :param stagesurf: Staging surface object

---------------------


Z-Stencil Functions
-------------------

.. function:: gs_zstencil_t *gs_zstencil_create(uint32_t width, uint32_t height, enum gs_zstencil_format format)

   Creates a Z-stencil surface object.

   :param width:  Width
   :param height: Height
   :param format: Format
   :return:       New Z-stencil surface object, or *NULL* if failed

---------------------

.. function:: void     gs_zstencil_destroy(gs_zstencil_t *zstencil)

   Destroys a Z-stencil buffer.

   :param zstencil: Z-stencil surface object

---------------------


Sampler State Functions
-----------------------

.. function:: gs_samplerstate_t *gs_samplerstate_create(const struct gs_sampler_info *info)

   Creates a sampler state object.

   :param info: Sampler state information
   :return:     New sampler state object

---------------------

.. function:: void     gs_samplerstate_destroy(gs_samplerstate_t *samplerstate)

   Destroys a sampler state object.

   :param samplerstate: Sampler state object

---------------------


Vertex Buffer Functions
-----------------------

.. function:: gs_vertbuffer_t *gs_vertexbuffer_create(struct gs_vb_data *data, uint32_t flags)

   Creates a vertex buffer.

   :param data:  Vertex buffer data to create vertex buffer with.  The
                 structure should be created with gs_vbdata_create(),
                 and then buffers in this structure should be allocated
                 with :c:func:`bmalloc()`, :c:func:`bzalloc()`, or
                 :c:func:`brealloc()`.  The ownership of the gs_vb_data
                 pointer is then passed to the function, and they should
                 not be destroyed by the caller once passed

   :param flags: Creation flags.  Can be 0 or a bitwise-OR combination
                 of any of the following values:

                 - GS_DYNAMIC - Can be dynamically updated in real time.
                 - GS_DUP_BUFFER - Do not pass buffer ownership of the
                   structure or the buffer pointers within the
                   structure.

   :return:      A new vertex buffer object, or *NULL* if failed

---------------------

.. function:: void     gs_vertexbuffer_destroy(gs_vertbuffer_t *vertbuffer)

   Destroys a vertex buffer object.

   :param vertbuffer: Vertex buffer object

---------------------

.. function:: void     gs_vertexbuffer_flush(gs_vertbuffer_t *vertbuffer)

   Flushes a vertex buffer to its interval vertex data object.  To
   modify its internal vertex data, call
   :c:func:`gs_vertexbuffer_get_data()`.

   Can only be used with dynamic vertex buffer objects.

   :param vertbuffer: Vertex buffer object

---------------------

.. function:: void     gs_vertexbuffer_flush_direct(gs_vertbuffer_t *vertbuffer, const struct gs_vb_data *data)

   Directly flushes a vertex buffer to the specified vertex buffer data.
   .

   Can only be used with dynamic vertex buffer objects.

   :param vertbuffer: Vertex buffer object
   :param data:       Vertex buffer data to flush.  Components that
                      don't need to be flushed can be left *NULL*

---------------------

.. function:: struct gs_vb_data *gs_vertexbuffer_get_data(const gs_vertbuffer_t *vertbuffer)

   Gets the vertex buffer data associated with a vertex buffer object.
   This data can be changed and vertex buffer can be updated with
   :c:func:`gs_vertexbuffer_flush()`.

   Can only be used with dynamic vertex buffer objects.

   :param vertbuffer: Vertex buffer object
   :return:           Vertex buffer data structure

---------------------


Index Buffer Functions
----------------------

.. function:: gs_indexbuffer_t *gs_indexbuffer_create(enum gs_index_type type, void *indices, size_t num, uint32_t flags)

   Creates an index buffer.

   :param type:    Index buffer type
   :param indices: Index buffer data.  This buffer must be allocated
                   with :c:func:`bmalloc()`, :c:func:`bzalloc()`, or
                   :c:func:`bralloc()`, and ownership of this buffer is
                   passed to the index buffer object.
   :param num:     Number of indices in the buffer

   :param flags:   Creation flags.  Can be 0 or a bitwise-OR combination
                   of any of the following values:

                   - GS_DYNAMIC - Can be dynamically updated in real time.
                   - GS_DUP_BUFFER - Do not pass buffer ownership

   :return:        A new index buffer object, or *NULL* if failed

---------------------

.. function:: void     gs_indexbuffer_destroy(gs_indexbuffer_t *indexbuffer)

   Destroys an index buffer object.

   :param indexbuffer: Index buffer object

---------------------

.. function:: void     gs_indexbuffer_flush(gs_indexbuffer_t *indexbuffer)

   Flushes a index buffer to its interval index data object.  To modify
   its internal index data, call :c:func:`gs_indexbuffer_get_data()`.

   Can only be used with dynamic index buffer objects.

   :param indexbuffer: Index buffer object

---------------------

.. function:: void     gs_indexbuffer_flush_direct(gs_indexbuffer_t *indexbuffer, const void *data)

   Flushes a index buffer to the specified index buffer data.

   Can only be used with dynamic index buffer objects.

   :param indexbuffer: Index buffer object
   :param data:        Index buffer data to flush

---------------------

.. function:: void     *gs_indexbuffer_get_data(const gs_indexbuffer_t *indexbuffer)

   Gets the index buffer data associated with a index buffer object.
   This data can be changed and index buffer can be updated with
   :c:func:`gs_indexbuffer_flush()`.

   Can only be used with dynamic index buffer objects.

   :param vertbuffer: Index buffer object
   :return:           Index buffer data pointer

---------------------

.. function:: size_t   gs_indexbuffer_get_num_indices(const gs_indexbuffer_t *indexbuffer)

   Gets the number of indices associated with this index buffer.

   :param indexbuffer: Index buffer object
   :return:            Number of indices the vertex buffer object has

---------------------

.. function:: enum gs_index_type gs_indexbuffer_get_type(const gs_indexbuffer_t *indexbuffer)

   Gets the type of index buffer.

   :param indexbuffer: Index buffer object
   :return:            Index buffer type

---------------------


Display Duplicator (Windows Only)
---------------------------------

.. function:: gs_duplicator_t *gs_duplicator_create(int monitor_idx)

---------------------

.. function:: void gs_duplicator_destroy(gs_duplicator_t *duplicator)

---------------------

.. function:: bool gs_duplicator_update_frame(gs_duplicator_t *duplicator)

---------------------

.. function:: gs_texture_t *gs_duplicator_get_texture(gs_duplicator_t *duplicator)

---------------------

.. function:: bool gs_get_duplicator_monitor_info(int monitor_idx, struct gs_monitor_info *monitor_info)

---------------------


Render Helper Functions
-----------------------

.. function:: void gs_render_start(bool b_new)

---------------------

.. function:: void gs_render_stop(enum gs_draw_mode mode)

---------------------

.. function:: gs_vertbuffer_t *gs_render_save(void)

---------------------

.. function:: void gs_vertex2f(float x, float y)

---------------------

.. function:: void gs_vertex3f(float x, float y, float z)

---------------------

.. function:: void gs_normal3f(float x, float y, float z)

---------------------

.. function:: void gs_color(uint32_t color)

---------------------

.. function:: void gs_texcoord(float x, float y, int unit)

---------------------

.. function:: void gs_vertex2v(const struct vec2 *v)

---------------------

.. function:: void gs_vertex3v(const struct vec3 *v)

---------------------

.. function:: void gs_normal3v(const struct vec3 *v)

---------------------

.. function:: void gs_color4v(const struct vec4 *v)

---------------------

.. function:: void gs_texcoord2v(const struct vec2 *v, int unit)

---------------------


Graphics Types
--------------

.. type:: typedef struct gs_duplicator       gs_duplicator_t
.. type:: typedef struct gs_texture          gs_texture_t
.. type:: typedef struct gs_stage_surface    gs_stagesurf_t
.. type:: typedef struct gs_zstencil_buffer  gs_zstencil_t
.. type:: typedef struct gs_vertex_buffer    gs_vertbuffer_t
.. type:: typedef struct gs_index_buffer     gs_indexbuffer_t
.. type:: typedef struct gs_sampler_state    gs_samplerstate_t
.. type:: typedef struct gs_swap_chain       gs_swapchain_t
.. type:: typedef struct gs_texture_render   gs_texrender_t
.. type:: typedef struct gs_shader           gs_shader_t
.. type:: typedef struct gs_shader_param     gs_sparam_t
.. type:: typedef struct gs_device           gs_device_t
.. type:: typedef struct graphics_subsystem  graphics_t
