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: */ 264