2015-06-21 15:33:46 +00:00
|
|
|
/*
|
|
|
|
Simple DirectMedia Layer
|
2021-01-02 18:25:38 +00:00
|
|
|
Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
|
2015-06-21 15:33:46 +00:00
|
|
|
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
|
|
warranty. In no event will the authors be held liable for any damages
|
|
|
|
arising from the use of this software.
|
|
|
|
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
|
|
including commercial applications, and to alter it and redistribute it
|
|
|
|
freely, subject to the following restrictions:
|
|
|
|
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
|
|
claim that you wrote the original software. If you use this software
|
|
|
|
in a product, an acknowledgment in the product documentation would be
|
|
|
|
appreciated but is not required.
|
|
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
|
|
misrepresented as being the original software.
|
|
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
|
|
*/
|
|
|
|
#include "../SDL_internal.h"
|
|
|
|
|
2016-11-21 05:34:54 +00:00
|
|
|
#ifndef SDL_sysrender_h_
|
|
|
|
#define SDL_sysrender_h_
|
2015-06-21 15:33:46 +00:00
|
|
|
|
|
|
|
#include "SDL_render.h"
|
|
|
|
#include "SDL_events.h"
|
2018-06-18 20:13:56 +00:00
|
|
|
#include "SDL_mutex.h"
|
2015-06-21 15:33:46 +00:00
|
|
|
#include "SDL_yuv_sw_c.h"
|
|
|
|
|
|
|
|
/* The SDL 2D rendering system */
|
|
|
|
|
|
|
|
typedef struct SDL_RenderDriver SDL_RenderDriver;
|
|
|
|
|
|
|
|
/* Define the SDL texture structure */
|
|
|
|
struct SDL_Texture
|
|
|
|
{
|
|
|
|
const void *magic;
|
|
|
|
Uint32 format; /**< The pixel format of the texture */
|
|
|
|
int access; /**< SDL_TextureAccess */
|
|
|
|
int w; /**< The width of the texture */
|
|
|
|
int h; /**< The height of the texture */
|
|
|
|
int modMode; /**< The texture modulation mode */
|
|
|
|
SDL_BlendMode blendMode; /**< The texture blend mode */
|
2018-05-08 02:52:25 +00:00
|
|
|
SDL_ScaleMode scaleMode; /**< The texture scale mode */
|
2015-06-21 15:33:46 +00:00
|
|
|
Uint8 r, g, b, a; /**< Texture modulation values */
|
|
|
|
|
|
|
|
SDL_Renderer *renderer;
|
|
|
|
|
|
|
|
/* Support for formats not supported directly by the renderer */
|
|
|
|
SDL_Texture *native;
|
|
|
|
SDL_SW_YUVTexture *yuv;
|
|
|
|
void *pixels;
|
|
|
|
int pitch;
|
|
|
|
SDL_Rect locked_rect;
|
2019-09-30 18:58:44 +00:00
|
|
|
SDL_Surface *locked_surface; /**< Locked region exposed as a SDL surface */
|
2015-06-21 15:33:46 +00:00
|
|
|
|
2018-09-20 19:46:02 +00:00
|
|
|
Uint32 last_command_generation; /* last command queue generation this texture was in. */
|
|
|
|
|
2015-06-21 15:33:46 +00:00
|
|
|
void *driverdata; /**< Driver specific texture representation */
|
|
|
|
|
|
|
|
SDL_Texture *prev;
|
|
|
|
SDL_Texture *next;
|
|
|
|
};
|
|
|
|
|
2018-09-20 19:46:02 +00:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
SDL_RENDERCMD_NO_OP,
|
|
|
|
SDL_RENDERCMD_SETVIEWPORT,
|
|
|
|
SDL_RENDERCMD_SETCLIPRECT,
|
2018-09-24 03:20:40 +00:00
|
|
|
SDL_RENDERCMD_SETDRAWCOLOR,
|
2018-09-20 19:46:02 +00:00
|
|
|
SDL_RENDERCMD_CLEAR,
|
|
|
|
SDL_RENDERCMD_DRAW_POINTS,
|
|
|
|
SDL_RENDERCMD_DRAW_LINES,
|
|
|
|
SDL_RENDERCMD_FILL_RECTS,
|
|
|
|
SDL_RENDERCMD_COPY,
|
|
|
|
SDL_RENDERCMD_COPY_EX
|
|
|
|
} SDL_RenderCommandType;
|
|
|
|
|
|
|
|
typedef struct SDL_RenderCommand
|
|
|
|
{
|
|
|
|
SDL_RenderCommandType command;
|
|
|
|
union {
|
2018-09-24 03:20:40 +00:00
|
|
|
struct {
|
|
|
|
size_t first;
|
|
|
|
SDL_Rect rect;
|
|
|
|
} viewport;
|
2018-09-20 19:46:02 +00:00
|
|
|
struct {
|
|
|
|
SDL_bool enabled;
|
|
|
|
SDL_Rect rect;
|
|
|
|
} cliprect;
|
|
|
|
struct {
|
|
|
|
size_t first;
|
|
|
|
size_t count;
|
|
|
|
Uint8 r, g, b, a;
|
|
|
|
SDL_BlendMode blend;
|
|
|
|
SDL_Texture *texture;
|
|
|
|
} draw;
|
|
|
|
struct {
|
2018-09-24 03:20:40 +00:00
|
|
|
size_t first;
|
2018-09-20 19:46:02 +00:00
|
|
|
Uint8 r, g, b, a;
|
|
|
|
} color;
|
|
|
|
} data;
|
|
|
|
struct SDL_RenderCommand *next;
|
|
|
|
} SDL_RenderCommand;
|
|
|
|
|
|
|
|
|
2015-06-21 15:33:46 +00:00
|
|
|
/* Define the SDL renderer structure */
|
|
|
|
struct SDL_Renderer
|
|
|
|
{
|
|
|
|
const void *magic;
|
|
|
|
|
|
|
|
void (*WindowEvent) (SDL_Renderer * renderer, const SDL_WindowEvent *event);
|
|
|
|
int (*GetOutputSize) (SDL_Renderer * renderer, int *w, int *h);
|
Implemented more flexible blending modes for accelerated renderers
This fixes bug 2594 - Propose new blend mode, SDL_BLENDMODE_BLEND_DSTA
blendMode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_SRC_ALPHA,
SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
SDL_BLENDOPERATION_ADD,
SDL_BLENDFACTOR_ZERO,
SDL_BLENDFACTOR_ONE,
SDL_BLENDOPERATION_ADD);
This fixes bug 2828 - Subtractive Blending
blendMode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_SRC_ALPHA,
SDL_BLENDFACTOR_ONE,
SDL_BLENDOPERATION_SUBTRACT,
SDL_BLENDFACTOR_ZERO,
SDL_BLENDFACTOR_ONE,
SDL_BLENDOPERATION_SUBTRACT);
This goes partway to fixing bug 3684 - Add support for a pre-multiplied alpha blending mode
blendMode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_ONE,
SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
SDL_BLENDOPERATION_ADD,
SDL_BLENDFACTOR_ONE,
SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
SDL_BLENDOPERATION_ADD);
2017-08-14 12:51:44 +00:00
|
|
|
SDL_bool (*SupportsBlendMode)(SDL_Renderer * renderer, SDL_BlendMode blendMode);
|
2015-06-21 15:33:46 +00:00
|
|
|
int (*CreateTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
|
2018-09-24 03:20:40 +00:00
|
|
|
int (*QueueSetViewport) (SDL_Renderer * renderer, SDL_RenderCommand *cmd);
|
|
|
|
int (*QueueSetDrawColor) (SDL_Renderer * renderer, SDL_RenderCommand *cmd);
|
2018-09-20 19:46:02 +00:00
|
|
|
int (*QueueDrawPoints) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FPoint * points,
|
|
|
|
int count);
|
|
|
|
int (*QueueDrawLines) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FPoint * points,
|
|
|
|
int count);
|
|
|
|
int (*QueueFillRects) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FRect * rects,
|
|
|
|
int count);
|
|
|
|
int (*QueueCopy) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * texture,
|
|
|
|
const SDL_Rect * srcrect, const SDL_FRect * dstrect);
|
|
|
|
int (*QueueCopyEx) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * texture,
|
|
|
|
const SDL_Rect * srcquad, const SDL_FRect * dstrect,
|
|
|
|
const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip);
|
|
|
|
int (*RunCommandQueue) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize);
|
2015-06-21 15:33:46 +00:00
|
|
|
int (*UpdateTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
|
|
|
|
const SDL_Rect * rect, const void *pixels,
|
|
|
|
int pitch);
|
2021-01-05 16:39:48 +00:00
|
|
|
#if SDL_HAVE_YUV
|
2015-06-21 15:33:46 +00:00
|
|
|
int (*UpdateTextureYUV) (SDL_Renderer * renderer, SDL_Texture * texture,
|
|
|
|
const SDL_Rect * rect,
|
|
|
|
const Uint8 *Yplane, int Ypitch,
|
|
|
|
const Uint8 *Uplane, int Upitch,
|
|
|
|
const Uint8 *Vplane, int Vpitch);
|
2021-01-05 10:56:22 +00:00
|
|
|
int (*UpdateTextureNV) (SDL_Renderer * renderer, SDL_Texture * texture,
|
|
|
|
const SDL_Rect * rect,
|
|
|
|
const Uint8 *Yplane, int Ypitch,
|
|
|
|
const Uint8 *UVplane, int UVpitch);
|
2021-01-05 16:39:48 +00:00
|
|
|
#endif
|
2015-06-21 15:33:46 +00:00
|
|
|
int (*LockTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
|
|
|
|
const SDL_Rect * rect, void **pixels, int *pitch);
|
|
|
|
void (*UnlockTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
|
2019-12-22 21:39:44 +00:00
|
|
|
void (*SetTextureScaleMode) (SDL_Renderer * renderer, SDL_Texture * texture, SDL_ScaleMode scaleMode);
|
2015-06-21 15:33:46 +00:00
|
|
|
int (*SetRenderTarget) (SDL_Renderer * renderer, SDL_Texture * texture);
|
|
|
|
int (*RenderReadPixels) (SDL_Renderer * renderer, const SDL_Rect * rect,
|
|
|
|
Uint32 format, void * pixels, int pitch);
|
|
|
|
void (*RenderPresent) (SDL_Renderer * renderer);
|
|
|
|
void (*DestroyTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
|
|
|
|
|
|
|
|
void (*DestroyRenderer) (SDL_Renderer * renderer);
|
|
|
|
|
|
|
|
int (*GL_BindTexture) (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh);
|
|
|
|
int (*GL_UnbindTexture) (SDL_Renderer * renderer, SDL_Texture *texture);
|
|
|
|
|
2017-12-08 22:30:10 +00:00
|
|
|
void *(*GetMetalLayer) (SDL_Renderer * renderer);
|
|
|
|
void *(*GetMetalCommandEncoder) (SDL_Renderer * renderer);
|
|
|
|
|
2015-06-21 15:33:46 +00:00
|
|
|
/* The current renderer info */
|
|
|
|
SDL_RendererInfo info;
|
|
|
|
|
|
|
|
/* The window associated with the renderer */
|
|
|
|
SDL_Window *window;
|
|
|
|
SDL_bool hidden;
|
|
|
|
|
|
|
|
/* The logical resolution for rendering */
|
|
|
|
int logical_w;
|
|
|
|
int logical_h;
|
|
|
|
int logical_w_backup;
|
|
|
|
int logical_h_backup;
|
|
|
|
|
2016-01-05 21:39:18 +00:00
|
|
|
/* Whether or not to force the viewport to even integer intervals */
|
|
|
|
SDL_bool integer_scale;
|
|
|
|
|
2015-06-21 15:33:46 +00:00
|
|
|
/* The drawable area within the window */
|
|
|
|
SDL_Rect viewport;
|
|
|
|
SDL_Rect viewport_backup;
|
|
|
|
|
|
|
|
/* The clip rectangle within the window */
|
|
|
|
SDL_Rect clip_rect;
|
|
|
|
SDL_Rect clip_rect_backup;
|
|
|
|
|
|
|
|
/* Wether or not the clipping rectangle is used. */
|
|
|
|
SDL_bool clipping_enabled;
|
|
|
|
SDL_bool clipping_enabled_backup;
|
|
|
|
|
|
|
|
/* The render output coordinate scale */
|
|
|
|
SDL_FPoint scale;
|
|
|
|
SDL_FPoint scale_backup;
|
|
|
|
|
2017-08-02 20:38:46 +00:00
|
|
|
/* The pixel to point coordinate scale */
|
|
|
|
SDL_FPoint dpi_scale;
|
|
|
|
|
2019-09-30 19:54:16 +00:00
|
|
|
/* Whether or not to scale relative mouse motion */
|
|
|
|
SDL_bool relative_scaling;
|
|
|
|
|
render: Scale relative mouse motion better for logical sizing
From hmk:
"When scaling is enabled (e.g. via SDL_RenderSetLogicalSize, size not equal
to window size), mouse motion events are also scaled. Small motions are
rounded up (SDL_max() when the value after scaling is less than 1), while
larger motions are truncated by the floating point -> integer conversion.
https://hg.libsdl.org/SDL/file/b18197f9bf9d/src/render/SDL_render.c#l658
The end result feels something like mouse reverse mouse acceleration + angle
snapping at low speeds, but less consistent (amount of truncation & rounding
depends on how fast the mouse is moved) and potentially much worse if the
scaling factor is large. This pretty much makes it useless for anything
where you need precise mouse aiming (think of games). I suspect this is why
aiming gets so terrible in some games that let you use scaling to reduce the
render resolution (e.g. Ion Fury).
With 4x4 scaling, I can reproduce a situation where it takes three fast flicks
of the mouse across the pad to undo one slow sweep across the pad. In other
words, extreme reverse acceleration. This does not happen when scaling is
disabled.
Furthermore, any game that uses relative mouse motion events for 3D camera
rotation probably wants the raw mouse deltas and not a value that depends on
scaling and resolution and rounding and truncation. Ideal camera rotation
just takes mouse input, multiplies it by sensitivity, and adds it to the
angle-in-radians or whatever measure is used for yaw & pitch. Pixels and
screen resolution or window dimensions should not be a part of the equation
at all, even if it could be implemented without rounding errors.
[...]
This [patch] completely eliminates angle snapping for me, and makes
sensitivity consistent. In other words, it's completely usable for, say,
aiming in a first person shooter."
Partially fixes Bugzilla #4811.
2020-04-10 16:23:08 +00:00
|
|
|
/* Remainder from scaled relative motion */
|
|
|
|
float xrel;
|
|
|
|
float yrel;
|
|
|
|
|
2015-06-21 15:33:46 +00:00
|
|
|
/* The list of textures */
|
|
|
|
SDL_Texture *textures;
|
|
|
|
SDL_Texture *target;
|
2018-06-18 20:13:56 +00:00
|
|
|
SDL_mutex *target_mutex;
|
2015-06-21 15:33:46 +00:00
|
|
|
|
|
|
|
Uint8 r, g, b, a; /**< Color for drawing operations values */
|
|
|
|
SDL_BlendMode blendMode; /**< The drawing blend mode */
|
|
|
|
|
2018-09-24 03:20:40 +00:00
|
|
|
SDL_bool always_batch;
|
2018-09-20 19:46:02 +00:00
|
|
|
SDL_bool batching;
|
|
|
|
SDL_RenderCommand *render_commands;
|
|
|
|
SDL_RenderCommand *render_commands_tail;
|
|
|
|
SDL_RenderCommand *render_commands_pool;
|
|
|
|
Uint32 render_command_generation;
|
2018-09-24 03:20:40 +00:00
|
|
|
Uint32 last_queued_color;
|
|
|
|
SDL_Rect last_queued_viewport;
|
|
|
|
SDL_Rect last_queued_cliprect;
|
|
|
|
SDL_bool last_queued_cliprect_enabled;
|
|
|
|
SDL_bool color_queued;
|
|
|
|
SDL_bool viewport_queued;
|
|
|
|
SDL_bool cliprect_queued;
|
2018-09-20 19:46:02 +00:00
|
|
|
|
|
|
|
void *vertex_data;
|
|
|
|
size_t vertex_data_used;
|
|
|
|
size_t vertex_data_allocation;
|
|
|
|
|
2015-06-21 15:33:46 +00:00
|
|
|
void *driverdata;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Define the SDL render driver structure */
|
|
|
|
struct SDL_RenderDriver
|
|
|
|
{
|
|
|
|
SDL_Renderer *(*CreateRenderer) (SDL_Window * window, Uint32 flags);
|
|
|
|
|
|
|
|
/* Info about the renderer capabilities */
|
|
|
|
SDL_RendererInfo info;
|
|
|
|
};
|
|
|
|
|
2017-02-26 05:40:04 +00:00
|
|
|
/* Not all of these are available in a given build. Use #ifdefs, etc. */
|
2015-06-21 15:33:46 +00:00
|
|
|
extern SDL_RenderDriver D3D_RenderDriver;
|
|
|
|
extern SDL_RenderDriver D3D11_RenderDriver;
|
|
|
|
extern SDL_RenderDriver GL_RenderDriver;
|
|
|
|
extern SDL_RenderDriver GLES2_RenderDriver;
|
|
|
|
extern SDL_RenderDriver GLES_RenderDriver;
|
|
|
|
extern SDL_RenderDriver DirectFB_RenderDriver;
|
2016-04-21 07:16:44 +00:00
|
|
|
extern SDL_RenderDriver METAL_RenderDriver;
|
2015-06-21 15:33:46 +00:00
|
|
|
extern SDL_RenderDriver PSP_RenderDriver;
|
|
|
|
extern SDL_RenderDriver SW_RenderDriver;
|
|
|
|
|
Implemented more flexible blending modes for accelerated renderers
This fixes bug 2594 - Propose new blend mode, SDL_BLENDMODE_BLEND_DSTA
blendMode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_SRC_ALPHA,
SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
SDL_BLENDOPERATION_ADD,
SDL_BLENDFACTOR_ZERO,
SDL_BLENDFACTOR_ONE,
SDL_BLENDOPERATION_ADD);
This fixes bug 2828 - Subtractive Blending
blendMode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_SRC_ALPHA,
SDL_BLENDFACTOR_ONE,
SDL_BLENDOPERATION_SUBTRACT,
SDL_BLENDFACTOR_ZERO,
SDL_BLENDFACTOR_ONE,
SDL_BLENDOPERATION_SUBTRACT);
This goes partway to fixing bug 3684 - Add support for a pre-multiplied alpha blending mode
blendMode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_ONE,
SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
SDL_BLENDOPERATION_ADD,
SDL_BLENDFACTOR_ONE,
SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
SDL_BLENDOPERATION_ADD);
2017-08-14 12:51:44 +00:00
|
|
|
/* Blend mode functions */
|
|
|
|
extern SDL_BlendFactor SDL_GetBlendModeSrcColorFactor(SDL_BlendMode blendMode);
|
|
|
|
extern SDL_BlendFactor SDL_GetBlendModeDstColorFactor(SDL_BlendMode blendMode);
|
|
|
|
extern SDL_BlendOperation SDL_GetBlendModeColorOperation(SDL_BlendMode blendMode);
|
|
|
|
extern SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor(SDL_BlendMode blendMode);
|
|
|
|
extern SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor(SDL_BlendMode blendMode);
|
|
|
|
extern SDL_BlendOperation SDL_GetBlendModeAlphaOperation(SDL_BlendMode blendMode);
|
|
|
|
|
2018-09-20 19:46:02 +00:00
|
|
|
/* drivers call this during their Queue*() methods to make space in a array that are used
|
|
|
|
for a vertex buffer during RunCommandQueue(). Pointers returned here are only valid until
|
|
|
|
the next call, because it might be in an array that gets realloc()'d. */
|
2018-09-24 03:20:40 +00:00
|
|
|
extern void *SDL_AllocateRenderVertices(SDL_Renderer *renderer, const size_t numbytes, const size_t alignment, size_t *offset);
|
2018-09-20 19:46:02 +00:00
|
|
|
|
2020-12-27 19:28:24 +00:00
|
|
|
extern int SDL_PrivateLowerBlitScaled(SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect, SDL_ScaleMode scaleMode);
|
|
|
|
extern int SDL_PrivateUpperBlitScaled(SDL_Surface * src, const SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect, SDL_ScaleMode scaleMode);
|
|
|
|
|
2016-11-21 05:34:54 +00:00
|
|
|
#endif /* SDL_sysrender_h_ */
|
2015-06-21 15:33:46 +00:00
|
|
|
|
|
|
|
/* vi: set ts=4 sw=4 expandtab: */
|