sdl

FORK: Simple Directmedia Layer
git clone https://git.neptards.moe/neptards/sdl.git
Log | Files | Refs

SDL_sysrender.h (9883B)


      1 /*
      2   Simple DirectMedia Layer
      3   Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
      4 
      5   This software is provided 'as-is', without any express or implied
      6   warranty.  In no event will the authors be held liable for any damages
      7   arising from the use of this software.
      8 
      9   Permission is granted to anyone to use this software for any purpose,
     10   including commercial applications, and to alter it and redistribute it
     11   freely, subject to the following restrictions:
     12 
     13   1. The origin of this software must not be misrepresented; you must not
     14      claim that you wrote the original software. If you use this software
     15      in a product, an acknowledgment in the product documentation would be
     16      appreciated but is not required.
     17   2. Altered source versions must be plainly marked as such, and must not be
     18      misrepresented as being the original software.
     19   3. This notice may not be removed or altered from any source distribution.
     20 */
     21 #include "../SDL_internal.h"
     22 
     23 #ifndef SDL_sysrender_h_
     24 #define SDL_sysrender_h_
     25 
     26 #include "SDL_render.h"
     27 #include "SDL_events.h"
     28 #include "SDL_mutex.h"
     29 #include "SDL_yuv_sw_c.h"
     30 
     31 /* The SDL 2D rendering system */
     32 
     33 typedef struct SDL_RenderDriver SDL_RenderDriver;
     34 
     35 /* Define the SDL texture structure */
     36 struct SDL_Texture
     37 {
     38     const void *magic;
     39     Uint32 format;              /**< The pixel format of the texture */
     40     int access;                 /**< SDL_TextureAccess */
     41     int w;                      /**< The width of the texture */
     42     int h;                      /**< The height of the texture */
     43     int modMode;                /**< The texture modulation mode */
     44     SDL_BlendMode blendMode;    /**< The texture blend mode */
     45     SDL_ScaleMode scaleMode;    /**< The texture scale mode */
     46     Uint8 r, g, b, a;           /**< Texture modulation values */
     47 
     48     SDL_Renderer *renderer;
     49 
     50     /* Support for formats not supported directly by the renderer */
     51     SDL_Texture *native;
     52     SDL_SW_YUVTexture *yuv;
     53     void *pixels;
     54     int pitch;
     55     SDL_Rect locked_rect;
     56     SDL_Surface *locked_surface;  /**< Locked region exposed as a SDL surface */
     57 
     58     Uint32 last_command_generation; /* last command queue generation this texture was in. */
     59 
     60     void *driverdata;           /**< Driver specific texture representation */
     61 
     62     SDL_Texture *prev;
     63     SDL_Texture *next;
     64 };
     65 
     66 typedef enum
     67 {
     68     SDL_RENDERCMD_NO_OP,
     69     SDL_RENDERCMD_SETVIEWPORT,
     70     SDL_RENDERCMD_SETCLIPRECT,
     71     SDL_RENDERCMD_SETDRAWCOLOR,
     72     SDL_RENDERCMD_CLEAR,
     73     SDL_RENDERCMD_DRAW_POINTS,
     74     SDL_RENDERCMD_DRAW_LINES,
     75     SDL_RENDERCMD_FILL_RECTS,
     76     SDL_RENDERCMD_COPY,
     77     SDL_RENDERCMD_COPY_EX
     78 } SDL_RenderCommandType;
     79 
     80 typedef struct SDL_RenderCommand
     81 {
     82     SDL_RenderCommandType command;
     83     union {
     84         struct {
     85             size_t first;
     86             SDL_Rect rect;
     87         } viewport;
     88         struct {
     89             SDL_bool enabled;
     90             SDL_Rect rect;
     91         } cliprect;
     92         struct {
     93             size_t first;
     94             size_t count;
     95             Uint8 r, g, b, a;
     96             SDL_BlendMode blend;
     97             SDL_Texture *texture;
     98         } draw;
     99         struct {
    100             size_t first;
    101             Uint8 r, g, b, a;
    102         } color;
    103     } data;
    104     struct SDL_RenderCommand *next;
    105 } SDL_RenderCommand;
    106 
    107 
    108 /* Define the SDL renderer structure */
    109 struct SDL_Renderer
    110 {
    111     const void *magic;
    112 
    113     void (*WindowEvent) (SDL_Renderer * renderer, const SDL_WindowEvent *event);
    114     int (*GetOutputSize) (SDL_Renderer * renderer, int *w, int *h);
    115     SDL_bool (*SupportsBlendMode)(SDL_Renderer * renderer, SDL_BlendMode blendMode);
    116     int (*CreateTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
    117     int (*QueueSetViewport) (SDL_Renderer * renderer, SDL_RenderCommand *cmd);
    118     int (*QueueSetDrawColor) (SDL_Renderer * renderer, SDL_RenderCommand *cmd);
    119     int (*QueueDrawPoints) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FPoint * points,
    120                              int count);
    121     int (*QueueDrawLines) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FPoint * points,
    122                             int count);
    123     int (*QueueFillRects) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FRect * rects,
    124                             int count);
    125     int (*QueueCopy) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * texture,
    126                        const SDL_Rect * srcrect, const SDL_FRect * dstrect);
    127     int (*QueueCopyEx) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * texture,
    128                         const SDL_Rect * srcquad, const SDL_FRect * dstrect,
    129                         const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip);
    130     int (*RunCommandQueue) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize);
    131     int (*UpdateTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
    132                           const SDL_Rect * rect, const void *pixels,
    133                           int pitch);
    134     int (*UpdateTextureYUV) (SDL_Renderer * renderer, SDL_Texture * texture,
    135                             const SDL_Rect * rect,
    136                             const Uint8 *Yplane, int Ypitch,
    137                             const Uint8 *Uplane, int Upitch,
    138                             const Uint8 *Vplane, int Vpitch);
    139     int (*LockTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
    140                         const SDL_Rect * rect, void **pixels, int *pitch);
    141     void (*UnlockTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
    142     void (*SetTextureScaleMode) (SDL_Renderer * renderer, SDL_Texture * texture, SDL_ScaleMode scaleMode);
    143     int (*SetRenderTarget) (SDL_Renderer * renderer, SDL_Texture * texture);
    144     int (*RenderReadPixels) (SDL_Renderer * renderer, const SDL_Rect * rect,
    145                              Uint32 format, void * pixels, int pitch);
    146     void (*RenderPresent) (SDL_Renderer * renderer);
    147     void (*DestroyTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
    148 
    149     void (*DestroyRenderer) (SDL_Renderer * renderer);
    150 
    151     int (*GL_BindTexture) (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh);
    152     int (*GL_UnbindTexture) (SDL_Renderer * renderer, SDL_Texture *texture);
    153 
    154     void *(*GetMetalLayer) (SDL_Renderer * renderer);
    155     void *(*GetMetalCommandEncoder) (SDL_Renderer * renderer);
    156 
    157     /* The current renderer info */
    158     SDL_RendererInfo info;
    159 
    160     /* The window associated with the renderer */
    161     SDL_Window *window;
    162     SDL_bool hidden;
    163 
    164     /* The logical resolution for rendering */
    165     int logical_w;
    166     int logical_h;
    167     int logical_w_backup;
    168     int logical_h_backup;
    169 
    170     /* Whether or not to force the viewport to even integer intervals */
    171     SDL_bool integer_scale;
    172 
    173     /* The drawable area within the window */
    174     SDL_Rect viewport;
    175     SDL_Rect viewport_backup;
    176 
    177     /* The clip rectangle within the window */
    178     SDL_Rect clip_rect;
    179     SDL_Rect clip_rect_backup;
    180 
    181     /* Wether or not the clipping rectangle is used. */
    182     SDL_bool clipping_enabled;
    183     SDL_bool clipping_enabled_backup;
    184 
    185     /* The render output coordinate scale */
    186     SDL_FPoint scale;
    187     SDL_FPoint scale_backup;
    188 
    189     /* The pixel to point coordinate scale */
    190     SDL_FPoint dpi_scale;
    191 
    192     /* Whether or not to scale relative mouse motion */
    193     SDL_bool relative_scaling;
    194 
    195     /* Remainder from scaled relative motion */
    196     float xrel;
    197     float yrel;
    198 
    199     /* The list of textures */
    200     SDL_Texture *textures;
    201     SDL_Texture *target;
    202     SDL_mutex *target_mutex;
    203 
    204     Uint8 r, g, b, a;                   /**< Color for drawing operations values */
    205     SDL_BlendMode blendMode;            /**< The drawing blend mode */
    206 
    207     SDL_bool always_batch;
    208     SDL_bool batching;
    209     SDL_RenderCommand *render_commands;
    210     SDL_RenderCommand *render_commands_tail;
    211     SDL_RenderCommand *render_commands_pool;
    212     Uint32 render_command_generation;
    213     Uint32 last_queued_color;
    214     SDL_Rect last_queued_viewport;
    215     SDL_Rect last_queued_cliprect;
    216     SDL_bool last_queued_cliprect_enabled;
    217     SDL_bool color_queued;
    218     SDL_bool viewport_queued;
    219     SDL_bool cliprect_queued;
    220 
    221     void *vertex_data;
    222     size_t vertex_data_used;
    223     size_t vertex_data_allocation;
    224 
    225     void *driverdata;
    226 };
    227 
    228 /* Define the SDL render driver structure */
    229 struct SDL_RenderDriver
    230 {
    231     SDL_Renderer *(*CreateRenderer) (SDL_Window * window, Uint32 flags);
    232 
    233     /* Info about the renderer capabilities */
    234     SDL_RendererInfo info;
    235 };
    236 
    237 /* Not all of these are available in a given build. Use #ifdefs, etc. */
    238 extern SDL_RenderDriver D3D_RenderDriver;
    239 extern SDL_RenderDriver D3D11_RenderDriver;
    240 extern SDL_RenderDriver GL_RenderDriver;
    241 extern SDL_RenderDriver GLES2_RenderDriver;
    242 extern SDL_RenderDriver GLES_RenderDriver;
    243 extern SDL_RenderDriver DirectFB_RenderDriver;
    244 extern SDL_RenderDriver METAL_RenderDriver;
    245 extern SDL_RenderDriver PSP_RenderDriver;
    246 extern SDL_RenderDriver SW_RenderDriver;
    247 
    248 /* Blend mode functions */
    249 extern SDL_BlendFactor SDL_GetBlendModeSrcColorFactor(SDL_BlendMode blendMode);
    250 extern SDL_BlendFactor SDL_GetBlendModeDstColorFactor(SDL_BlendMode blendMode);
    251 extern SDL_BlendOperation SDL_GetBlendModeColorOperation(SDL_BlendMode blendMode);
    252 extern SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor(SDL_BlendMode blendMode);
    253 extern SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor(SDL_BlendMode blendMode);
    254 extern SDL_BlendOperation SDL_GetBlendModeAlphaOperation(SDL_BlendMode blendMode);
    255 
    256 /* drivers call this during their Queue*() methods to make space in a array that are used
    257    for a vertex buffer during RunCommandQueue(). Pointers returned here are only valid until
    258    the next call, because it might be in an array that gets realloc()'d. */
    259 extern void *SDL_AllocateRenderVertices(SDL_Renderer *renderer, const size_t numbytes, const size_t alignment, size_t *offset);
    260 
    261 #endif /* SDL_sysrender_h_ */
    262 
    263 /* vi: set ts=4 sw=4 expandtab: */