1 /*
2   Simple DirectMedia Layer
3   Copyright (C) 1997-2021 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     SDL_Color color;            /**< 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     void *userdata;
62 
63     SDL_Texture *prev;
64     SDL_Texture *next;
65 };
66 
67 typedef enum
68 {
69     SDL_RENDERCMD_NO_OP,
70     SDL_RENDERCMD_SETVIEWPORT,
71     SDL_RENDERCMD_SETCLIPRECT,
72     SDL_RENDERCMD_SETDRAWCOLOR,
73     SDL_RENDERCMD_CLEAR,
74     SDL_RENDERCMD_DRAW_POINTS,
75     SDL_RENDERCMD_DRAW_LINES,
76     SDL_RENDERCMD_FILL_RECTS,
77     SDL_RENDERCMD_COPY,
78     SDL_RENDERCMD_COPY_EX,
79     SDL_RENDERCMD_GEOMETRY
80 } SDL_RenderCommandType;
81 
82 typedef struct SDL_RenderCommand
83 {
84     SDL_RenderCommandType command;
85     union {
86         struct {
87             size_t first;
88             SDL_Rect rect;
89         } viewport;
90         struct {
91             SDL_bool enabled;
92             SDL_Rect rect;
93         } cliprect;
94         struct {
95             size_t first;
96             size_t count;
97             Uint8 r, g, b, a;
98             SDL_BlendMode blend;
99             SDL_Texture *texture;
100         } draw;
101         struct {
102             size_t first;
103             Uint8 r, g, b, a;
104         } color;
105     } data;
106     struct SDL_RenderCommand *next;
107 } SDL_RenderCommand;
108 
109 
110 /* Define the SDL renderer structure */
111 struct SDL_Renderer
112 {
113     const void *magic;
114 
115     void (*WindowEvent) (SDL_Renderer * renderer, const SDL_WindowEvent *event);
116     int (*GetOutputSize) (SDL_Renderer * renderer, int *w, int *h);
117     SDL_bool (*SupportsBlendMode)(SDL_Renderer * renderer, SDL_BlendMode blendMode);
118     int (*CreateTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
119     int (*QueueSetViewport) (SDL_Renderer * renderer, SDL_RenderCommand *cmd);
120     int (*QueueSetDrawColor) (SDL_Renderer * renderer, SDL_RenderCommand *cmd);
121     int (*QueueDrawPoints) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FPoint * points,
122                              int count);
123     int (*QueueDrawLines) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FPoint * points,
124                             int count);
125     int (*QueueFillRects) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FRect * rects,
126                             int count);
127     int (*QueueCopy) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * texture,
128                        const SDL_Rect * srcrect, const SDL_FRect * dstrect);
129     int (*QueueCopyEx) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * texture,
130                         const SDL_Rect * srcquad, const SDL_FRect * dstrect,
131                         const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip);
132     int (*QueueGeometry) (SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
133                           const float *xy, int xy_stride, const int *color, int color_stride, const float *uv, int uv_stride,
134                           int num_vertices, const void *indices, int num_indices, int size_indices,
135                           float scale_x, float scale_y);
136 
137     int (*RunCommandQueue) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize);
138     int (*UpdateTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
139                           const SDL_Rect * rect, const void *pixels,
140                           int pitch);
141 #if SDL_HAVE_YUV
142     int (*UpdateTextureYUV) (SDL_Renderer * renderer, SDL_Texture * texture,
143                             const SDL_Rect * rect,
144                             const Uint8 *Yplane, int Ypitch,
145                             const Uint8 *Uplane, int Upitch,
146                             const Uint8 *Vplane, int Vpitch);
147     int (*UpdateTextureNV) (SDL_Renderer * renderer, SDL_Texture * texture,
148                             const SDL_Rect * rect,
149                             const Uint8 *Yplane, int Ypitch,
150                             const Uint8 *UVplane, int UVpitch);
151 #endif
152     int (*LockTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
153                         const SDL_Rect * rect, void **pixels, int *pitch);
154     void (*UnlockTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
155     void (*SetTextureScaleMode) (SDL_Renderer * renderer, SDL_Texture * texture, SDL_ScaleMode scaleMode);
156     int (*SetRenderTarget) (SDL_Renderer * renderer, SDL_Texture * texture);
157     int (*RenderReadPixels) (SDL_Renderer * renderer, const SDL_Rect * rect,
158                              Uint32 format, void * pixels, int pitch);
159     void (*RenderPresent) (SDL_Renderer * renderer);
160     void (*DestroyTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
161 
162     void (*DestroyRenderer) (SDL_Renderer * renderer);
163 
164     int (*SetVSync) (SDL_Renderer * renderer, int vsync);
165 
166     int (*GL_BindTexture) (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh);
167     int (*GL_UnbindTexture) (SDL_Renderer * renderer, SDL_Texture *texture);
168 
169     void *(*GetMetalLayer) (SDL_Renderer * renderer);
170     void *(*GetMetalCommandEncoder) (SDL_Renderer * renderer);
171 
172     /* The current renderer info */
173     SDL_RendererInfo info;
174 
175     /* The window associated with the renderer */
176     SDL_Window *window;
177     SDL_bool hidden;
178 
179     /* The logical resolution for rendering */
180     int logical_w;
181     int logical_h;
182     int logical_w_backup;
183     int logical_h_backup;
184 
185     /* Whether or not to force the viewport to even integer intervals */
186     SDL_bool integer_scale;
187 
188     /* The drawable area within the window */
189     SDL_Rect viewport;
190     SDL_Rect viewport_backup;
191 
192     /* The clip rectangle within the window */
193     SDL_Rect clip_rect;
194     SDL_Rect clip_rect_backup;
195 
196     /* Wether or not the clipping rectangle is used. */
197     SDL_bool clipping_enabled;
198     SDL_bool clipping_enabled_backup;
199 
200     /* The render output coordinate scale */
201     SDL_FPoint scale;
202     SDL_FPoint scale_backup;
203 
204     /* The pixel to point coordinate scale */
205     SDL_FPoint dpi_scale;
206 
207     /* Whether or not to scale relative mouse motion */
208     SDL_bool relative_scaling;
209 
210     /* Remainder from scaled relative motion */
211     float xrel;
212     float yrel;
213 
214     /* The list of textures */
215     SDL_Texture *textures;
216     SDL_Texture *target;
217     SDL_mutex *target_mutex;
218 
219     SDL_Color color;                    /**< Color for drawing operations values */
220     SDL_BlendMode blendMode;            /**< The drawing blend mode */
221 
222     SDL_bool always_batch;
223     SDL_bool batching;
224     SDL_RenderCommand *render_commands;
225     SDL_RenderCommand *render_commands_tail;
226     SDL_RenderCommand *render_commands_pool;
227     Uint32 render_command_generation;
228     Uint32 last_queued_color;
229     SDL_Rect last_queued_viewport;
230     SDL_Rect last_queued_cliprect;
231     SDL_bool last_queued_cliprect_enabled;
232     SDL_bool color_queued;
233     SDL_bool viewport_queued;
234     SDL_bool cliprect_queued;
235 
236     void *vertex_data;
237     size_t vertex_data_used;
238     size_t vertex_data_allocation;
239 
240     void *driverdata;
241 };
242 
243 /* Define the SDL render driver structure */
244 struct SDL_RenderDriver
245 {
246     SDL_Renderer *(*CreateRenderer) (SDL_Window * window, Uint32 flags);
247 
248     /* Info about the renderer capabilities */
249     SDL_RendererInfo info;
250 };
251 
252 /* Not all of these are available in a given build. Use #ifdefs, etc. */
253 extern SDL_RenderDriver D3D_RenderDriver;
254 extern SDL_RenderDriver D3D11_RenderDriver;
255 extern SDL_RenderDriver GL_RenderDriver;
256 extern SDL_RenderDriver GLES2_RenderDriver;
257 extern SDL_RenderDriver GLES_RenderDriver;
258 extern SDL_RenderDriver DirectFB_RenderDriver;
259 extern SDL_RenderDriver METAL_RenderDriver;
260 extern SDL_RenderDriver PSP_RenderDriver;
261 extern SDL_RenderDriver SW_RenderDriver;
262 extern SDL_RenderDriver VITA_GXM_RenderDriver;
263 
264 /* Blend mode functions */
265 extern SDL_BlendFactor SDL_GetBlendModeSrcColorFactor(SDL_BlendMode blendMode);
266 extern SDL_BlendFactor SDL_GetBlendModeDstColorFactor(SDL_BlendMode blendMode);
267 extern SDL_BlendOperation SDL_GetBlendModeColorOperation(SDL_BlendMode blendMode);
268 extern SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor(SDL_BlendMode blendMode);
269 extern SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor(SDL_BlendMode blendMode);
270 extern SDL_BlendOperation SDL_GetBlendModeAlphaOperation(SDL_BlendMode blendMode);
271 
272 /* drivers call this during their Queue*() methods to make space in a array that are used
273    for a vertex buffer during RunCommandQueue(). Pointers returned here are only valid until
274    the next call, because it might be in an array that gets realloc()'d. */
275 extern void *SDL_AllocateRenderVertices(SDL_Renderer *renderer, const size_t numbytes, const size_t alignment, size_t *offset);
276 
277 extern int SDL_PrivateLowerBlitScaled(SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect, SDL_ScaleMode scaleMode);
278 extern int SDL_PrivateUpperBlitScaled(SDL_Surface * src, const SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect, SDL_ScaleMode scaleMode);
279 
280 #endif /* SDL_sysrender_h_ */
281 
282 /* vi: set ts=4 sw=4 expandtab: */
283