mirror of
https://github.com/love2d/megasource.git
synced 2026-08-19 04:05:09 +02:00
Update SDL to 2.0.7
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -31,32 +31,32 @@ Float4X4 MatrixIdentity()
|
||||
{
|
||||
Float4X4 m;
|
||||
SDL_zero(m);
|
||||
m._11 = 1.0f;
|
||||
m._22 = 1.0f;
|
||||
m._33 = 1.0f;
|
||||
m._44 = 1.0f;
|
||||
m.v._11 = 1.0f;
|
||||
m.v._22 = 1.0f;
|
||||
m.v._33 = 1.0f;
|
||||
m.v._44 = 1.0f;
|
||||
return m;
|
||||
}
|
||||
|
||||
Float4X4 MatrixMultiply(Float4X4 M1, Float4X4 M2)
|
||||
{
|
||||
Float4X4 m;
|
||||
m._11 = M1._11 * M2._11 + M1._12 * M2._21 + M1._13 * M2._31 + M1._14 * M2._41;
|
||||
m._12 = M1._11 * M2._12 + M1._12 * M2._22 + M1._13 * M2._32 + M1._14 * M2._42;
|
||||
m._13 = M1._11 * M2._13 + M1._12 * M2._23 + M1._13 * M2._33 + M1._14 * M2._43;
|
||||
m._14 = M1._11 * M2._14 + M1._12 * M2._24 + M1._13 * M2._34 + M1._14 * M2._44;
|
||||
m._21 = M1._21 * M2._11 + M1._22 * M2._21 + M1._23 * M2._31 + M1._24 * M2._41;
|
||||
m._22 = M1._21 * M2._12 + M1._22 * M2._22 + M1._23 * M2._32 + M1._24 * M2._42;
|
||||
m._23 = M1._21 * M2._13 + M1._22 * M2._23 + M1._23 * M2._33 + M1._24 * M2._43;
|
||||
m._24 = M1._21 * M2._14 + M1._22 * M2._24 + M1._23 * M2._34 + M1._24 * M2._44;
|
||||
m._31 = M1._31 * M2._11 + M1._32 * M2._21 + M1._33 * M2._31 + M1._34 * M2._41;
|
||||
m._32 = M1._31 * M2._12 + M1._32 * M2._22 + M1._33 * M2._32 + M1._34 * M2._42;
|
||||
m._33 = M1._31 * M2._13 + M1._32 * M2._23 + M1._33 * M2._33 + M1._34 * M2._43;
|
||||
m._34 = M1._31 * M2._14 + M1._32 * M2._24 + M1._33 * M2._34 + M1._34 * M2._44;
|
||||
m._41 = M1._41 * M2._11 + M1._42 * M2._21 + M1._43 * M2._31 + M1._44 * M2._41;
|
||||
m._42 = M1._41 * M2._12 + M1._42 * M2._22 + M1._43 * M2._32 + M1._44 * M2._42;
|
||||
m._43 = M1._41 * M2._13 + M1._42 * M2._23 + M1._43 * M2._33 + M1._44 * M2._43;
|
||||
m._44 = M1._41 * M2._14 + M1._42 * M2._24 + M1._43 * M2._34 + M1._44 * M2._44;
|
||||
m.v._11 = M1.v._11 * M2.v._11 + M1.v._12 * M2.v._21 + M1.v._13 * M2.v._31 + M1.v._14 * M2.v._41;
|
||||
m.v._12 = M1.v._11 * M2.v._12 + M1.v._12 * M2.v._22 + M1.v._13 * M2.v._32 + M1.v._14 * M2.v._42;
|
||||
m.v._13 = M1.v._11 * M2.v._13 + M1.v._12 * M2.v._23 + M1.v._13 * M2.v._33 + M1.v._14 * M2.v._43;
|
||||
m.v._14 = M1.v._11 * M2.v._14 + M1.v._12 * M2.v._24 + M1.v._13 * M2.v._34 + M1.v._14 * M2.v._44;
|
||||
m.v._21 = M1.v._21 * M2.v._11 + M1.v._22 * M2.v._21 + M1.v._23 * M2.v._31 + M1.v._24 * M2.v._41;
|
||||
m.v._22 = M1.v._21 * M2.v._12 + M1.v._22 * M2.v._22 + M1.v._23 * M2.v._32 + M1.v._24 * M2.v._42;
|
||||
m.v._23 = M1.v._21 * M2.v._13 + M1.v._22 * M2.v._23 + M1.v._23 * M2.v._33 + M1.v._24 * M2.v._43;
|
||||
m.v._24 = M1.v._21 * M2.v._14 + M1.v._22 * M2.v._24 + M1.v._23 * M2.v._34 + M1.v._24 * M2.v._44;
|
||||
m.v._31 = M1.v._31 * M2.v._11 + M1.v._32 * M2.v._21 + M1.v._33 * M2.v._31 + M1.v._34 * M2.v._41;
|
||||
m.v._32 = M1.v._31 * M2.v._12 + M1.v._32 * M2.v._22 + M1.v._33 * M2.v._32 + M1.v._34 * M2.v._42;
|
||||
m.v._33 = M1.v._31 * M2.v._13 + M1.v._32 * M2.v._23 + M1.v._33 * M2.v._33 + M1.v._34 * M2.v._43;
|
||||
m.v._34 = M1.v._31 * M2.v._14 + M1.v._32 * M2.v._24 + M1.v._33 * M2.v._34 + M1.v._34 * M2.v._44;
|
||||
m.v._41 = M1.v._41 * M2.v._11 + M1.v._42 * M2.v._21 + M1.v._43 * M2.v._31 + M1.v._44 * M2.v._41;
|
||||
m.v._42 = M1.v._41 * M2.v._12 + M1.v._42 * M2.v._22 + M1.v._43 * M2.v._32 + M1.v._44 * M2.v._42;
|
||||
m.v._43 = M1.v._41 * M2.v._13 + M1.v._42 * M2.v._23 + M1.v._43 * M2.v._33 + M1.v._44 * M2.v._43;
|
||||
m.v._44 = M1.v._41 * M2.v._14 + M1.v._42 * M2.v._24 + M1.v._43 * M2.v._34 + M1.v._44 * M2.v._44;
|
||||
return m;
|
||||
}
|
||||
|
||||
@@ -64,10 +64,10 @@ Float4X4 MatrixScaling(float x, float y, float z)
|
||||
{
|
||||
Float4X4 m;
|
||||
SDL_zero(m);
|
||||
m._11 = x;
|
||||
m._22 = y;
|
||||
m._33 = z;
|
||||
m._44 = 1.0f;
|
||||
m.v._11 = x;
|
||||
m.v._22 = y;
|
||||
m.v._33 = z;
|
||||
m.v._44 = 1.0f;
|
||||
return m;
|
||||
}
|
||||
|
||||
@@ -75,13 +75,13 @@ Float4X4 MatrixTranslation(float x, float y, float z)
|
||||
{
|
||||
Float4X4 m;
|
||||
SDL_zero(m);
|
||||
m._11 = 1.0f;
|
||||
m._22 = 1.0f;
|
||||
m._33 = 1.0f;
|
||||
m._44 = 1.0f;
|
||||
m._41 = x;
|
||||
m._42 = y;
|
||||
m._43 = z;
|
||||
m.v._11 = 1.0f;
|
||||
m.v._22 = 1.0f;
|
||||
m.v._33 = 1.0f;
|
||||
m.v._44 = 1.0f;
|
||||
m.v._41 = x;
|
||||
m.v._42 = y;
|
||||
m.v._43 = z;
|
||||
return m;
|
||||
}
|
||||
|
||||
@@ -91,12 +91,12 @@ Float4X4 MatrixRotationX(float r)
|
||||
float cosR = SDL_cosf(r);
|
||||
Float4X4 m;
|
||||
SDL_zero(m);
|
||||
m._11 = 1.0f;
|
||||
m._22 = cosR;
|
||||
m._23 = sinR;
|
||||
m._32 = -sinR;
|
||||
m._33 = cosR;
|
||||
m._44 = 1.0f;
|
||||
m.v._11 = 1.0f;
|
||||
m.v._22 = cosR;
|
||||
m.v._23 = sinR;
|
||||
m.v._32 = -sinR;
|
||||
m.v._33 = cosR;
|
||||
m.v._44 = 1.0f;
|
||||
return m;
|
||||
}
|
||||
|
||||
@@ -106,12 +106,12 @@ Float4X4 MatrixRotationY(float r)
|
||||
float cosR = SDL_cosf(r);
|
||||
Float4X4 m;
|
||||
SDL_zero(m);
|
||||
m._11 = cosR;
|
||||
m._13 = -sinR;
|
||||
m._22 = 1.0f;
|
||||
m._31 = sinR;
|
||||
m._33 = cosR;
|
||||
m._44 = 1.0f;
|
||||
m.v._11 = cosR;
|
||||
m.v._13 = -sinR;
|
||||
m.v._22 = 1.0f;
|
||||
m.v._31 = sinR;
|
||||
m.v._33 = cosR;
|
||||
m.v._44 = 1.0f;
|
||||
return m;
|
||||
}
|
||||
|
||||
@@ -121,12 +121,12 @@ Float4X4 MatrixRotationZ(float r)
|
||||
float cosR = SDL_cosf(r);
|
||||
Float4X4 m;
|
||||
SDL_zero(m);
|
||||
m._11 = cosR;
|
||||
m._12 = sinR;
|
||||
m._21 = -sinR;
|
||||
m._22 = cosR;
|
||||
m._33 = 1.0f;
|
||||
m._44 = 1.0f;
|
||||
m.v._11 = cosR;
|
||||
m.v._12 = sinR;
|
||||
m.v._21 = -sinR;
|
||||
m.v._22 = cosR;
|
||||
m.v._33 = 1.0f;
|
||||
m.v._44 = 1.0f;
|
||||
return m;
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -53,7 +53,7 @@ typedef struct
|
||||
float _21, _22, _23, _24;
|
||||
float _31, _32, _33, _34;
|
||||
float _41, _42, _43, _44;
|
||||
};
|
||||
} v;
|
||||
float m[4][4];
|
||||
};
|
||||
} Float4X4;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -33,17 +33,44 @@
|
||||
#define SDL_WINDOWRENDERDATA "_SDL_WindowRenderData"
|
||||
|
||||
#define CHECK_RENDERER_MAGIC(renderer, retval) \
|
||||
SDL_assert(renderer && renderer->magic == &renderer_magic); \
|
||||
if (!renderer || renderer->magic != &renderer_magic) { \
|
||||
SDL_SetError("Invalid renderer"); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
#define CHECK_TEXTURE_MAGIC(texture, retval) \
|
||||
SDL_assert(texture && texture->magic == &texture_magic); \
|
||||
if (!texture || texture->magic != &texture_magic) { \
|
||||
SDL_SetError("Invalid texture"); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
/* Predefined blend modes */
|
||||
#define SDL_COMPOSE_BLENDMODE(srcColorFactor, dstColorFactor, colorOperation, \
|
||||
srcAlphaFactor, dstAlphaFactor, alphaOperation) \
|
||||
(SDL_BlendMode)(((Uint32)colorOperation << 0) | \
|
||||
((Uint32)srcColorFactor << 4) | \
|
||||
((Uint32)dstColorFactor << 8) | \
|
||||
((Uint32)alphaOperation << 16) | \
|
||||
((Uint32)srcAlphaFactor << 20) | \
|
||||
((Uint32)dstAlphaFactor << 24))
|
||||
|
||||
#define SDL_BLENDMODE_NONE_FULL \
|
||||
SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ZERO, SDL_BLENDOPERATION_ADD, \
|
||||
SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ZERO, SDL_BLENDOPERATION_ADD)
|
||||
|
||||
#define SDL_BLENDMODE_BLEND_FULL \
|
||||
SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_SRC_ALPHA, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD, \
|
||||
SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD)
|
||||
|
||||
#define SDL_BLENDMODE_ADD_FULL \
|
||||
SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_SRC_ALPHA, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD, \
|
||||
SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD)
|
||||
|
||||
#define SDL_BLENDMODE_MOD_FULL \
|
||||
SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_SRC_COLOR, SDL_BLENDOPERATION_ADD, \
|
||||
SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD)
|
||||
|
||||
#if !SDL_RENDER_DISABLED
|
||||
static const SDL_RenderDriver *render_drivers[] = {
|
||||
@@ -102,7 +129,7 @@ SDL_GetRenderDriverInfo(int index, SDL_RendererInfo * info)
|
||||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
static int SDLCALL
|
||||
SDL_RendererEventWatch(void *userdata, SDL_Event *event)
|
||||
{
|
||||
SDL_Renderer *renderer = (SDL_Renderer *)userdata;
|
||||
@@ -168,31 +195,59 @@ SDL_RendererEventWatch(void *userdata, SDL_Event *event)
|
||||
} else if (event->type == SDL_MOUSEMOTION) {
|
||||
SDL_Window *window = SDL_GetWindowFromID(event->motion.windowID);
|
||||
if (renderer->logical_w && window == renderer->window) {
|
||||
event->motion.x -= renderer->viewport.x;
|
||||
event->motion.y -= renderer->viewport.y;
|
||||
event->motion.x = (int)(event->motion.x / renderer->scale.x);
|
||||
event->motion.y = (int)(event->motion.y / renderer->scale.y);
|
||||
event->motion.x -= (int)(renderer->viewport.x * renderer->dpi_scale.x);
|
||||
event->motion.y -= (int)(renderer->viewport.y * renderer->dpi_scale.y);
|
||||
event->motion.x = (int)(event->motion.x / (renderer->scale.x * renderer->dpi_scale.x));
|
||||
event->motion.y = (int)(event->motion.y / (renderer->scale.y * renderer->dpi_scale.y));
|
||||
if (event->motion.xrel > 0) {
|
||||
event->motion.xrel = SDL_max(1, (int)(event->motion.xrel / renderer->scale.x));
|
||||
event->motion.xrel = SDL_max(1, (int)(event->motion.xrel / (renderer->scale.x * renderer->dpi_scale.x)));
|
||||
} else if (event->motion.xrel < 0) {
|
||||
event->motion.xrel = SDL_min(-1, (int)(event->motion.xrel / renderer->scale.x));
|
||||
event->motion.xrel = SDL_min(-1, (int)(event->motion.xrel / (renderer->scale.x * renderer->dpi_scale.x)));
|
||||
}
|
||||
if (event->motion.yrel > 0) {
|
||||
event->motion.yrel = SDL_max(1, (int)(event->motion.yrel / renderer->scale.y));
|
||||
event->motion.yrel = SDL_max(1, (int)(event->motion.yrel / (renderer->scale.y * renderer->dpi_scale.y)));
|
||||
} else if (event->motion.yrel < 0) {
|
||||
event->motion.yrel = SDL_min(-1, (int)(event->motion.yrel / renderer->scale.y));
|
||||
event->motion.yrel = SDL_min(-1, (int)(event->motion.yrel / (renderer->scale.y * renderer->dpi_scale.y)));
|
||||
}
|
||||
}
|
||||
} else if (event->type == SDL_MOUSEBUTTONDOWN ||
|
||||
event->type == SDL_MOUSEBUTTONUP) {
|
||||
SDL_Window *window = SDL_GetWindowFromID(event->button.windowID);
|
||||
if (renderer->logical_w && window == renderer->window) {
|
||||
event->button.x -= renderer->viewport.x;
|
||||
event->button.y -= renderer->viewport.y;
|
||||
event->button.x = (int)(event->button.x / renderer->scale.x);
|
||||
event->button.y = (int)(event->button.y / renderer->scale.y);
|
||||
event->button.x -= (int)(renderer->viewport.x * renderer->dpi_scale.x);
|
||||
event->button.y -= (int)(renderer->viewport.y * renderer->dpi_scale.y);
|
||||
event->button.x = (int)(event->button.x / (renderer->scale.x * renderer->dpi_scale.x));
|
||||
event->button.y = (int)(event->button.y / (renderer->scale.y * renderer->dpi_scale.y));
|
||||
}
|
||||
} else if (event->type == SDL_FINGERDOWN ||
|
||||
event->type == SDL_FINGERUP ||
|
||||
event->type == SDL_FINGERMOTION) {
|
||||
if (renderer->logical_w) {
|
||||
int w = 1;
|
||||
int h = 1;
|
||||
SDL_GetRendererOutputSize(renderer, &w, &h);
|
||||
|
||||
event->tfinger.x *= (w - 1);
|
||||
event->tfinger.y *= (h - 1);
|
||||
|
||||
event->tfinger.x -= (renderer->viewport.x * renderer->dpi_scale.x);
|
||||
event->tfinger.y -= (renderer->viewport.y * renderer->dpi_scale.y);
|
||||
event->tfinger.x = (event->tfinger.x / (renderer->scale.x * renderer->dpi_scale.x));
|
||||
event->tfinger.y = (event->tfinger.y / (renderer->scale.y * renderer->dpi_scale.y));
|
||||
|
||||
if (renderer->logical_w > 1) {
|
||||
event->tfinger.x = event->tfinger.x / (renderer->logical_w - 1);
|
||||
} else {
|
||||
event->tfinger.x = 0.5f;
|
||||
}
|
||||
if (renderer->logical_h > 1) {
|
||||
event->tfinger.y = event->tfinger.y / (renderer->logical_h - 1);
|
||||
} else {
|
||||
event->tfinger.y = 0.5f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -289,6 +344,18 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags)
|
||||
renderer->window = window;
|
||||
renderer->scale.x = 1.0f;
|
||||
renderer->scale.y = 1.0f;
|
||||
renderer->dpi_scale.x = 1.0f;
|
||||
renderer->dpi_scale.y = 1.0f;
|
||||
|
||||
if (window && renderer->GetOutputSize) {
|
||||
int window_w, window_h;
|
||||
int output_w, output_h;
|
||||
if (renderer->GetOutputSize(renderer, &output_w, &output_h) == 0) {
|
||||
SDL_GetWindowSize(renderer->window, &window_w, &window_h);
|
||||
renderer->dpi_scale.x = (float)window_w / output_w;
|
||||
renderer->dpi_scale.y = (float)window_h / output_h;
|
||||
}
|
||||
}
|
||||
|
||||
if (SDL_GetWindowFlags(window) & (SDL_WINDOW_HIDDEN|SDL_WINDOW_MINIMIZED)) {
|
||||
renderer->hidden = SDL_TRUE;
|
||||
@@ -367,6 +434,23 @@ SDL_GetRendererOutputSize(SDL_Renderer * renderer, int *w, int *h)
|
||||
}
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
IsSupportedBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
|
||||
{
|
||||
switch (blendMode)
|
||||
{
|
||||
/* These are required to be supported by all renderers */
|
||||
case SDL_BLENDMODE_NONE:
|
||||
case SDL_BLENDMODE_BLEND:
|
||||
case SDL_BLENDMODE_ADD:
|
||||
case SDL_BLENDMODE_MOD:
|
||||
return SDL_TRUE;
|
||||
|
||||
default:
|
||||
return renderer->SupportsBlendMode && renderer->SupportsBlendMode(renderer, blendMode);
|
||||
}
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
IsSupportedFormat(SDL_Renderer * renderer, Uint32 format)
|
||||
{
|
||||
@@ -694,6 +778,9 @@ SDL_SetTextureBlendMode(SDL_Texture * texture, SDL_BlendMode blendMode)
|
||||
CHECK_TEXTURE_MAGIC(texture, -1);
|
||||
|
||||
renderer = texture->renderer;
|
||||
if (!IsSupportedBlendMode(renderer, blendMode)) {
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
texture->blendMode = blendMode;
|
||||
if (texture->native) {
|
||||
return SDL_SetTextureBlendMode(texture->native, blendMode);
|
||||
@@ -734,8 +821,8 @@ SDL_UpdateTextureYUV(SDL_Texture * texture, const SDL_Rect * rect,
|
||||
|
||||
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
||||
/* We can lock the texture and copy to it */
|
||||
void *native_pixels;
|
||||
int native_pitch;
|
||||
void *native_pixels = NULL;
|
||||
int native_pitch = 0;
|
||||
|
||||
if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
|
||||
return -1;
|
||||
@@ -745,18 +832,18 @@ SDL_UpdateTextureYUV(SDL_Texture * texture, const SDL_Rect * rect,
|
||||
SDL_UnlockTexture(native);
|
||||
} else {
|
||||
/* Use a temporary buffer for updating */
|
||||
void *temp_pixels;
|
||||
int temp_pitch;
|
||||
|
||||
temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
temp_pixels = SDL_malloc(rect->h * temp_pitch);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
const size_t alloclen = rect->h * temp_pitch;
|
||||
if (alloclen > 0) {
|
||||
void *temp_pixels = SDL_malloc(alloclen);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
|
||||
rect->w, rect->h, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
|
||||
rect->w, rect->h, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -767,10 +854,14 @@ SDL_UpdateTextureNative(SDL_Texture * texture, const SDL_Rect * rect,
|
||||
{
|
||||
SDL_Texture *native = texture->native;
|
||||
|
||||
if (!rect->w || !rect->h) {
|
||||
return 0; /* nothing to do. */
|
||||
}
|
||||
|
||||
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
||||
/* We can lock the texture and copy to it */
|
||||
void *native_pixels;
|
||||
int native_pitch;
|
||||
void *native_pixels = NULL;
|
||||
int native_pitch = 0;
|
||||
|
||||
if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
|
||||
return -1;
|
||||
@@ -781,19 +872,19 @@ SDL_UpdateTextureNative(SDL_Texture * texture, const SDL_Rect * rect,
|
||||
SDL_UnlockTexture(native);
|
||||
} else {
|
||||
/* Use a temporary buffer for updating */
|
||||
void *temp_pixels;
|
||||
int temp_pitch;
|
||||
|
||||
temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
temp_pixels = SDL_malloc(rect->h * temp_pitch);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
const size_t alloclen = rect->h * temp_pitch;
|
||||
if (alloclen > 0) {
|
||||
void *temp_pixels = SDL_malloc(alloclen);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
SDL_ConvertPixels(rect->w, rect->h,
|
||||
texture->format, pixels, pitch,
|
||||
native->format, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
SDL_ConvertPixels(rect->w, rect->h,
|
||||
texture->format, pixels, pitch,
|
||||
native->format, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -853,10 +944,14 @@ SDL_UpdateTextureYUVPlanar(SDL_Texture * texture, const SDL_Rect * rect,
|
||||
full_rect.h = texture->h;
|
||||
rect = &full_rect;
|
||||
|
||||
if (!rect->w || !rect->h) {
|
||||
return 0; /* nothing to do. */
|
||||
}
|
||||
|
||||
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
||||
/* We can lock the texture and copy to it */
|
||||
void *native_pixels;
|
||||
int native_pitch;
|
||||
void *native_pixels = NULL;
|
||||
int native_pitch = 0;
|
||||
|
||||
if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
|
||||
return -1;
|
||||
@@ -866,18 +961,18 @@ SDL_UpdateTextureYUVPlanar(SDL_Texture * texture, const SDL_Rect * rect,
|
||||
SDL_UnlockTexture(native);
|
||||
} else {
|
||||
/* Use a temporary buffer for updating */
|
||||
void *temp_pixels;
|
||||
int temp_pitch;
|
||||
|
||||
temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
temp_pixels = SDL_malloc(rect->h * temp_pitch);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
const size_t alloclen = rect->h * temp_pitch;
|
||||
if (alloclen > 0) {
|
||||
void *temp_pixels = SDL_malloc(alloclen);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
|
||||
rect->w, rect->h, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
|
||||
rect->w, rect->h, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -924,6 +1019,10 @@ int SDL_UpdateYUVTexture(SDL_Texture * texture, const SDL_Rect * rect,
|
||||
rect = &full_rect;
|
||||
}
|
||||
|
||||
if (!rect->w || !rect->h) {
|
||||
return 0; /* nothing to do. */
|
||||
}
|
||||
|
||||
if (texture->yuv) {
|
||||
return SDL_UpdateTextureYUVPlanar(texture, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);
|
||||
} else {
|
||||
@@ -1144,6 +1243,9 @@ UpdateLogicalSize(SDL_Renderer *renderer)
|
||||
float real_aspect;
|
||||
float scale;
|
||||
SDL_Rect viewport;
|
||||
/* 0 is for letterbox, 1 is for overscan */
|
||||
int scale_policy = 0;
|
||||
const char *hint = SDL_GetHint(SDL_HINT_RENDER_LOGICAL_SIZE_MODE);
|
||||
|
||||
if (!renderer->logical_w || !renderer->logical_h) {
|
||||
return 0;
|
||||
@@ -1152,6 +1254,23 @@ UpdateLogicalSize(SDL_Renderer *renderer)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!hint) {
|
||||
scale_policy = 0;
|
||||
} else if ( *hint == '1' || SDL_strcasecmp(hint, "overscan") == 0) {
|
||||
/* Unfortunately, Direct3D 9 does't support negative viewport numbers
|
||||
which the main overscan implementation relies on.
|
||||
D3D11 does support negative values and uses a different id string
|
||||
so overscan will work for D3D11.
|
||||
*/
|
||||
if(SDL_strcasecmp("direct3d", SDL_GetCurrentVideoDriver())) {
|
||||
scale_policy = 0;
|
||||
} else {
|
||||
scale_policy = 1;
|
||||
}
|
||||
} else {
|
||||
scale_policy = 0;
|
||||
}
|
||||
|
||||
want_aspect = (float)renderer->logical_w / renderer->logical_h;
|
||||
real_aspect = (float)w / h;
|
||||
|
||||
@@ -1175,21 +1294,47 @@ UpdateLogicalSize(SDL_Renderer *renderer)
|
||||
scale = (float)w / renderer->logical_w;
|
||||
SDL_RenderSetViewport(renderer, NULL);
|
||||
} else if (want_aspect > real_aspect) {
|
||||
/* We want a wider aspect ratio than is available - letterbox it */
|
||||
scale = (float)w / renderer->logical_w;
|
||||
viewport.x = 0;
|
||||
viewport.w = w;
|
||||
viewport.h = (int)SDL_ceil(renderer->logical_h * scale);
|
||||
viewport.y = (h - viewport.h) / 2;
|
||||
SDL_RenderSetViewport(renderer, &viewport);
|
||||
if (scale_policy == 1) {
|
||||
/* We want a wider aspect ratio than is available -
|
||||
zoom so logical height matches the real height
|
||||
and the width will grow off the screen
|
||||
*/
|
||||
scale = (float)h / renderer->logical_h;
|
||||
viewport.y = 0;
|
||||
viewport.h = h;
|
||||
viewport.w = (int)SDL_ceil(renderer->logical_w * scale);
|
||||
viewport.x = (w - viewport.w) / 2;
|
||||
SDL_RenderSetViewport(renderer, &viewport);
|
||||
} else {
|
||||
/* We want a wider aspect ratio than is available - letterbox it */
|
||||
scale = (float)w / renderer->logical_w;
|
||||
viewport.x = 0;
|
||||
viewport.w = w;
|
||||
viewport.h = (int)SDL_ceil(renderer->logical_h * scale);
|
||||
viewport.y = (h - viewport.h) / 2;
|
||||
SDL_RenderSetViewport(renderer, &viewport);
|
||||
}
|
||||
} else {
|
||||
/* We want a narrower aspect ratio than is available - use side-bars */
|
||||
scale = (float)h / renderer->logical_h;
|
||||
viewport.y = 0;
|
||||
viewport.h = h;
|
||||
viewport.w = (int)SDL_ceil(renderer->logical_w * scale);
|
||||
viewport.x = (w - viewport.w) / 2;
|
||||
SDL_RenderSetViewport(renderer, &viewport);
|
||||
if (scale_policy == 1) {
|
||||
/* We want a narrower aspect ratio than is available -
|
||||
zoom so logical width matches the real width
|
||||
and the height will grow off the screen
|
||||
*/
|
||||
scale = (float)w / renderer->logical_w;
|
||||
viewport.x = 0;
|
||||
viewport.w = w;
|
||||
viewport.h = (int)SDL_ceil(renderer->logical_h * scale);
|
||||
viewport.y = (h - viewport.h) / 2;
|
||||
SDL_RenderSetViewport(renderer, &viewport);
|
||||
} else {
|
||||
/* We want a narrower aspect ratio than is available - use side-bars */
|
||||
scale = (float)h / renderer->logical_h;
|
||||
viewport.y = 0;
|
||||
viewport.h = h;
|
||||
viewport.w = (int)SDL_ceil(renderer->logical_w * scale);
|
||||
viewport.x = (w - viewport.w) / 2;
|
||||
SDL_RenderSetViewport(renderer, &viewport);
|
||||
}
|
||||
}
|
||||
|
||||
/* Set the new scale */
|
||||
@@ -1382,6 +1527,9 @@ SDL_SetRenderDrawBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
|
||||
{
|
||||
CHECK_RENDERER_MAGIC(renderer, -1);
|
||||
|
||||
if (!IsSupportedBlendMode(renderer, blendMode)) {
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
renderer->blendMode = blendMode;
|
||||
return 0;
|
||||
}
|
||||
@@ -1926,7 +2074,9 @@ SDL_DestroyRenderer(SDL_Renderer * renderer)
|
||||
|
||||
/* Free existing textures for this renderer */
|
||||
while (renderer->textures) {
|
||||
SDL_Texture *tex = renderer->textures; (void) tex;
|
||||
SDL_DestroyTexture(renderer->textures);
|
||||
SDL_assert(tex != renderer->textures); /* satisfy static analysis. */
|
||||
}
|
||||
|
||||
if (renderer->window) {
|
||||
@@ -1970,4 +2120,93 @@ int SDL_GL_UnbindTexture(SDL_Texture *texture)
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
static SDL_BlendMode
|
||||
SDL_GetShortBlendMode(SDL_BlendMode blendMode)
|
||||
{
|
||||
if (blendMode == SDL_BLENDMODE_NONE_FULL) {
|
||||
return SDL_BLENDMODE_NONE;
|
||||
}
|
||||
if (blendMode == SDL_BLENDMODE_BLEND_FULL) {
|
||||
return SDL_BLENDMODE_BLEND;
|
||||
}
|
||||
if (blendMode == SDL_BLENDMODE_ADD_FULL) {
|
||||
return SDL_BLENDMODE_ADD;
|
||||
}
|
||||
if (blendMode == SDL_BLENDMODE_MOD_FULL) {
|
||||
return SDL_BLENDMODE_MOD;
|
||||
}
|
||||
return blendMode;
|
||||
}
|
||||
|
||||
static SDL_BlendMode
|
||||
SDL_GetLongBlendMode(SDL_BlendMode blendMode)
|
||||
{
|
||||
if (blendMode == SDL_BLENDMODE_NONE) {
|
||||
return SDL_BLENDMODE_NONE_FULL;
|
||||
}
|
||||
if (blendMode == SDL_BLENDMODE_BLEND) {
|
||||
return SDL_BLENDMODE_BLEND_FULL;
|
||||
}
|
||||
if (blendMode == SDL_BLENDMODE_ADD) {
|
||||
return SDL_BLENDMODE_ADD_FULL;
|
||||
}
|
||||
if (blendMode == SDL_BLENDMODE_MOD) {
|
||||
return SDL_BLENDMODE_MOD_FULL;
|
||||
}
|
||||
return blendMode;
|
||||
}
|
||||
|
||||
SDL_BlendMode
|
||||
SDL_ComposeCustomBlendMode(SDL_BlendFactor srcColorFactor, SDL_BlendFactor dstColorFactor,
|
||||
SDL_BlendOperation colorOperation,
|
||||
SDL_BlendFactor srcAlphaFactor, SDL_BlendFactor dstAlphaFactor,
|
||||
SDL_BlendOperation alphaOperation)
|
||||
{
|
||||
SDL_BlendMode blendMode = SDL_COMPOSE_BLENDMODE(srcColorFactor, dstColorFactor, colorOperation,
|
||||
srcAlphaFactor, dstAlphaFactor, alphaOperation);
|
||||
return SDL_GetShortBlendMode(blendMode);
|
||||
}
|
||||
|
||||
SDL_BlendFactor
|
||||
SDL_GetBlendModeSrcColorFactor(SDL_BlendMode blendMode)
|
||||
{
|
||||
blendMode = SDL_GetLongBlendMode(blendMode);
|
||||
return (SDL_BlendFactor)(((Uint32)blendMode >> 4) & 0xF);
|
||||
}
|
||||
|
||||
SDL_BlendFactor
|
||||
SDL_GetBlendModeDstColorFactor(SDL_BlendMode blendMode)
|
||||
{
|
||||
blendMode = SDL_GetLongBlendMode(blendMode);
|
||||
return (SDL_BlendFactor)(((Uint32)blendMode >> 8) & 0xF);
|
||||
}
|
||||
|
||||
SDL_BlendOperation
|
||||
SDL_GetBlendModeColorOperation(SDL_BlendMode blendMode)
|
||||
{
|
||||
blendMode = SDL_GetLongBlendMode(blendMode);
|
||||
return (SDL_BlendOperation)(((Uint32)blendMode >> 0) & 0xF);
|
||||
}
|
||||
|
||||
SDL_BlendFactor
|
||||
SDL_GetBlendModeSrcAlphaFactor(SDL_BlendMode blendMode)
|
||||
{
|
||||
blendMode = SDL_GetLongBlendMode(blendMode);
|
||||
return (SDL_BlendFactor)(((Uint32)blendMode >> 20) & 0xF);
|
||||
}
|
||||
|
||||
SDL_BlendFactor
|
||||
SDL_GetBlendModeDstAlphaFactor(SDL_BlendMode blendMode)
|
||||
{
|
||||
blendMode = SDL_GetLongBlendMode(blendMode);
|
||||
return (SDL_BlendFactor)(((Uint32)blendMode >> 24) & 0xF);
|
||||
}
|
||||
|
||||
SDL_BlendOperation
|
||||
SDL_GetBlendModeAlphaOperation(SDL_BlendMode blendMode)
|
||||
{
|
||||
blendMode = SDL_GetLongBlendMode(blendMode);
|
||||
return (SDL_BlendOperation)(((Uint32)blendMode >> 16) & 0xF);
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -20,8 +20,8 @@
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_sysrender_h
|
||||
#define _SDL_sysrender_h
|
||||
#ifndef SDL_sysrender_h_
|
||||
#define SDL_sysrender_h_
|
||||
|
||||
#include "SDL_render.h"
|
||||
#include "SDL_events.h"
|
||||
@@ -79,6 +79,7 @@ struct SDL_Renderer
|
||||
|
||||
void (*WindowEvent) (SDL_Renderer * renderer, const SDL_WindowEvent *event);
|
||||
int (*GetOutputSize) (SDL_Renderer * renderer, int *w, int *h);
|
||||
SDL_bool (*SupportsBlendMode)(SDL_Renderer * renderer, SDL_BlendMode blendMode);
|
||||
int (*CreateTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
|
||||
int (*SetTextureColorMod) (SDL_Renderer * renderer,
|
||||
SDL_Texture * texture);
|
||||
@@ -154,6 +155,9 @@ struct SDL_Renderer
|
||||
SDL_FPoint scale;
|
||||
SDL_FPoint scale_backup;
|
||||
|
||||
/* The pixel to point coordinate scale */
|
||||
SDL_FPoint dpi_scale;
|
||||
|
||||
/* The list of textures */
|
||||
SDL_Texture *textures;
|
||||
SDL_Texture *target;
|
||||
@@ -173,33 +177,24 @@ struct SDL_RenderDriver
|
||||
SDL_RendererInfo info;
|
||||
};
|
||||
|
||||
#if !SDL_RENDER_DISABLED
|
||||
|
||||
#if SDL_VIDEO_RENDER_D3D
|
||||
/* Not all of these are available in a given build. Use #ifdefs, etc. */
|
||||
extern SDL_RenderDriver D3D_RenderDriver;
|
||||
#endif
|
||||
#if SDL_VIDEO_RENDER_D3D11
|
||||
extern SDL_RenderDriver D3D11_RenderDriver;
|
||||
#endif
|
||||
#if SDL_VIDEO_RENDER_OGL
|
||||
extern SDL_RenderDriver GL_RenderDriver;
|
||||
#endif
|
||||
#if SDL_VIDEO_RENDER_OGL_ES2
|
||||
extern SDL_RenderDriver GLES2_RenderDriver;
|
||||
#endif
|
||||
#if SDL_VIDEO_RENDER_OGL_ES
|
||||
extern SDL_RenderDriver GLES_RenderDriver;
|
||||
#endif
|
||||
#if SDL_VIDEO_RENDER_DIRECTFB
|
||||
extern SDL_RenderDriver DirectFB_RenderDriver;
|
||||
#endif
|
||||
#if SDL_VIDEO_RENDER_PSP
|
||||
extern SDL_RenderDriver PSP_RenderDriver;
|
||||
#endif
|
||||
extern SDL_RenderDriver SW_RenderDriver;
|
||||
|
||||
#endif /* !SDL_RENDER_DISABLED */
|
||||
/* 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);
|
||||
|
||||
#endif /* _SDL_sysrender_h */
|
||||
#endif /* SDL_sysrender_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -20,7 +20,9 @@
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#if (__GNUC__ > 2) && defined(__i386__) && __OPTIMIZE__ && SDL_ASSEMBLY_ROUTINES
|
||||
#include "SDL_yuv_mmx_c.h"
|
||||
|
||||
#ifdef USE_MMX_ASSEMBLY
|
||||
|
||||
#include "SDL_stdinc.h"
|
||||
|
||||
@@ -91,22 +93,11 @@ void ColorRGBDitherYV12MMX1X( int *colortab, Uint32 *rgb_2_pix,
|
||||
mod = (mod+cols+mod)*4; /* increment for row1 in byte */
|
||||
|
||||
__asm__ __volatile__ (
|
||||
/* tap dance to workaround the inability to use %%ebx at will... */
|
||||
/* move one thing to the stack... */
|
||||
"pushl $0\n" /* save a slot on the stack. */
|
||||
"pushl %%ebx\n" /* save %%ebx. */
|
||||
"movl %0, %%ebx\n" /* put the thing in ebx. */
|
||||
"movl %%ebx,4(%%esp)\n" /* put the thing in the stack slot. */
|
||||
"popl %%ebx\n" /* get back %%ebx (the PIC register). */
|
||||
|
||||
".align 8\n"
|
||||
"1:\n"
|
||||
|
||||
/* create Cr (result in mm1) */
|
||||
"pushl %%ebx\n"
|
||||
"movl 4(%%esp),%%ebx\n"
|
||||
"movd (%%ebx),%%mm1\n" /* 0 0 0 0 v3 v2 v1 v0 */
|
||||
"popl %%ebx\n"
|
||||
"movd (%0),%%mm1\n" /* 0 0 0 0 v3 v2 v1 v0 */
|
||||
"pxor %%mm7,%%mm7\n" /* 00 00 00 00 00 00 00 00 */
|
||||
"movd (%2), %%mm2\n" /* 0 0 0 0 l3 l2 l1 l0 */
|
||||
"punpcklbw %%mm7,%%mm1\n" /* 0 v3 0 v2 00 v1 00 v0 */
|
||||
@@ -214,7 +205,7 @@ void ColorRGBDitherYV12MMX1X( int *colortab, Uint32 *rgb_2_pix,
|
||||
"addl $4,%2\n" /* lum+4 */
|
||||
"leal 16(%3),%3\n" /* row1+16 */
|
||||
"leal 16(%5),%5\n" /* row2+16 */
|
||||
"addl $2,(%%esp)\n" /* cr+2 */
|
||||
"addl $2,%0\n" /* cr+2 */
|
||||
"addl $2,%1\n" /* cb+2 */
|
||||
|
||||
"addl $4,%6\n" /* x+4 */
|
||||
@@ -228,10 +219,9 @@ void ColorRGBDitherYV12MMX1X( int *colortab, Uint32 *rgb_2_pix,
|
||||
"cmpl %7,%2\n"
|
||||
"jl 1b\n"
|
||||
|
||||
"addl $4,%%esp\n" /* get rid of the stack slot we reserved. */
|
||||
"emms\n" /* reset MMX registers. */
|
||||
:
|
||||
: "m" (cr), "r"(cb),"r"(lum),
|
||||
: "r" (cr), "r"(cb),"r"(lum),
|
||||
"r"(row1),"r"(cols),"r"(row2),"m"(x),"m"(y),"m"(mod),
|
||||
"m"(MMX_0080w),"m"(MMX_VgrnRGB),"m"(MMX_VredRGB),
|
||||
"m"(MMX_FF00w),"m"(MMX_00FFw),"m"(MMX_UgrnRGB),
|
||||
@@ -254,23 +244,12 @@ void Color565DitherYV12MMX1X( int *colortab, Uint32 *rgb_2_pix,
|
||||
mod = (mod+cols+mod)*2; /* increment for row1 in byte */
|
||||
|
||||
__asm__ __volatile__(
|
||||
/* tap dance to workaround the inability to use %%ebx at will... */
|
||||
/* move one thing to the stack... */
|
||||
"pushl $0\n" /* save a slot on the stack. */
|
||||
"pushl %%ebx\n" /* save %%ebx. */
|
||||
"movl %0, %%ebx\n" /* put the thing in ebx. */
|
||||
"movl %%ebx, 4(%%esp)\n" /* put the thing in the stack slot. */
|
||||
"popl %%ebx\n" /* get back %%ebx (the PIC register). */
|
||||
|
||||
".align 8\n"
|
||||
"1:\n"
|
||||
|
||||
"movd (%1), %%mm0\n" /* 4 Cb 0 0 0 0 u3 u2 u1 u0 */
|
||||
"pxor %%mm7, %%mm7\n"
|
||||
"pushl %%ebx\n"
|
||||
"movl 4(%%esp), %%ebx\n"
|
||||
"movd (%%ebx), %%mm1\n" /* 4 Cr 0 0 0 0 v3 v2 v1 v0 */
|
||||
"popl %%ebx\n"
|
||||
"movd (%0), %%mm1\n" /* 4 Cr 0 0 0 0 v3 v2 v1 v0 */
|
||||
|
||||
"punpcklbw %%mm7, %%mm0\n" /* 4 W cb 0 u3 0 u2 0 u1 0 u0 */
|
||||
"punpcklbw %%mm7, %%mm1\n" /* 4 W cr 0 v3 0 v2 0 v1 0 v0 */
|
||||
@@ -400,7 +379,7 @@ void Color565DitherYV12MMX1X( int *colortab, Uint32 *rgb_2_pix,
|
||||
|
||||
"addl $8, %6\n"
|
||||
"addl $8, %2\n"
|
||||
"addl $4, (%%esp)\n"
|
||||
"addl $4, %0\n"
|
||||
"addl $4, %1\n"
|
||||
"cmpl %4, %6\n"
|
||||
"leal 16(%3), %3\n"
|
||||
@@ -413,10 +392,9 @@ void Color565DitherYV12MMX1X( int *colortab, Uint32 *rgb_2_pix,
|
||||
"movl $0, %6\n" /* x=0 */
|
||||
"cmpl %7, %2\n"
|
||||
"jl 1b\n"
|
||||
"addl $4, %%esp\n" /* get rid of the stack slot we reserved. */
|
||||
"emms\n"
|
||||
:
|
||||
: "m" (cr), "r"(cb),"r"(lum),
|
||||
: "r" (cr), "r"(cb),"r"(lum),
|
||||
"r"(row1),"r"(cols),"r"(row2),"m"(x),"m"(y),"m"(mod),
|
||||
"m"(MMX_0080w),"m"(MMX_Ugrn565),"m"(MMX_Ublu5x5),
|
||||
"m"(MMX_00FFw),"m"(MMX_Vgrn565),"m"(MMX_Vred5x5),
|
||||
@@ -426,6 +404,6 @@ void Color565DitherYV12MMX1X( int *colortab, Uint32 *rgb_2_pix,
|
||||
|
||||
/* *INDENT-ON* */
|
||||
|
||||
#endif /* GCC3 i386 inline assembly */
|
||||
#endif /* USE_MMX_ASSEMBLY */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
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"
|
||||
|
||||
/* FIXME: This breaks on various versions of GCC and should be rewritten using intrinsics */
|
||||
#if 0 /* (__GNUC__ > 2) && defined(__i386__) && __OPTIMIZE__ && SDL_ASSEMBLY_ROUTINES && !defined(__clang__) */
|
||||
#define USE_MMX_ASSEMBLY 1
|
||||
#endif
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -86,11 +86,12 @@
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_cpuinfo.h"
|
||||
#include "SDL_yuv_sw_c.h"
|
||||
#include "SDL_yuv_mmx_c.h"
|
||||
|
||||
|
||||
/* The colorspace conversion functions */
|
||||
|
||||
#if (__GNUC__ > 2) && defined(__i386__) && __OPTIMIZE__ && SDL_ASSEMBLY_ROUTINES
|
||||
#ifdef USE_MMX_ASSEMBLY
|
||||
extern void Color565DitherYV12MMX1X(int *colortab, Uint32 * rgb_2_pix,
|
||||
unsigned char *lum, unsigned char *cr,
|
||||
unsigned char *cb, unsigned char *out,
|
||||
@@ -264,7 +265,18 @@ Color32DitherYV12Mod1X(int *colortab, Uint32 * rgb_2_pix,
|
||||
int cr_r;
|
||||
int crb_g;
|
||||
int cb_b;
|
||||
int cols_2 = cols / 2;
|
||||
int cols_2 = (cols + 1) / 2;
|
||||
/* not even dimensions */
|
||||
int skip_last_col = 0;
|
||||
int skip_last_row = 0;
|
||||
|
||||
if ( (cols & 0x1) ) {
|
||||
skip_last_col = 1;
|
||||
}
|
||||
|
||||
if ( (rows & 0x1) ) {
|
||||
skip_last_row = 1;
|
||||
}
|
||||
|
||||
row1 = (unsigned int *) out;
|
||||
row2 = row1 + cols + mod;
|
||||
@@ -272,7 +284,7 @@ Color32DitherYV12Mod1X(int *colortab, Uint32 * rgb_2_pix,
|
||||
|
||||
mod += cols + mod;
|
||||
|
||||
y = rows / 2;
|
||||
y = (rows + 1) / 2;
|
||||
while (y--) {
|
||||
x = cols_2;
|
||||
while (x--) {
|
||||
@@ -289,20 +301,27 @@ Color32DitherYV12Mod1X(int *colortab, Uint32 * rgb_2_pix,
|
||||
*row1++ = (rgb_2_pix[L + cr_r] |
|
||||
rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);
|
||||
|
||||
if (!(x == 0 && skip_last_col)) {
|
||||
L = *lum++;
|
||||
*row1++ = (rgb_2_pix[L + cr_r] |
|
||||
rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);
|
||||
} /* skip col */
|
||||
|
||||
|
||||
if (!(y == 0 && skip_last_row)) {
|
||||
|
||||
/* Now, do second row. */
|
||||
|
||||
L = *lum2++;
|
||||
*row2++ = (rgb_2_pix[L + cr_r] |
|
||||
rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);
|
||||
|
||||
if (!(x == 1 && skip_last_col)) {
|
||||
L = *lum2++;
|
||||
*row2++ = (rgb_2_pix[L + cr_r] |
|
||||
rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);
|
||||
} /* skip col */
|
||||
} /* skip row */
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -669,7 +688,12 @@ Color32DitherYUY2Mod1X(int *colortab, Uint32 * rgb_2_pix,
|
||||
int cr_r;
|
||||
int crb_g;
|
||||
int cb_b;
|
||||
int cols_2 = cols / 2;
|
||||
int cols_2 = (cols + 1) / 2;
|
||||
/* not even dimensions */
|
||||
int skip_last_col = 0;
|
||||
if ( (cols & 0x1) ) {
|
||||
skip_last_col = 1;
|
||||
}
|
||||
|
||||
row = (unsigned int *) out;
|
||||
y = rows;
|
||||
@@ -692,9 +716,11 @@ Color32DitherYUY2Mod1X(int *colortab, Uint32 * rgb_2_pix,
|
||||
|
||||
L = *lum;
|
||||
lum += 2;
|
||||
|
||||
if (!(x == 0 && skip_last_col)) {
|
||||
*row++ = (rgb_2_pix[L + cr_r] |
|
||||
rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);
|
||||
|
||||
} /* skip col */
|
||||
|
||||
}
|
||||
row += mod;
|
||||
@@ -875,14 +901,16 @@ number_of_bits_set(Uint32 a)
|
||||
* Low performance, do not call often.
|
||||
*/
|
||||
static int
|
||||
free_bits_at_bottom_nonzero(Uint32 a)
|
||||
{
|
||||
SDL_assert(a != 0);
|
||||
return (((Sint32) a) & 1l) ? 0 : 1 + free_bits_at_bottom_nonzero(a >> 1);
|
||||
}
|
||||
|
||||
static SDL_INLINE int
|
||||
free_bits_at_bottom(Uint32 a)
|
||||
{
|
||||
/* assume char is 8 bits */
|
||||
if (!a)
|
||||
return sizeof(Uint32) * 8;
|
||||
if (((Sint32) a) & 1l)
|
||||
return 0;
|
||||
return 1 + free_bits_at_bottom(a >> 1);
|
||||
return a ? free_bits_at_bottom_nonzero(a) : 32;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -894,6 +922,7 @@ SDL_SW_SetupYUVDisplay(SDL_SW_YUVTexture * swdata, Uint32 target_format)
|
||||
int i;
|
||||
int bpp;
|
||||
Uint32 Rmask, Gmask, Bmask, Amask;
|
||||
int freebits;
|
||||
|
||||
if (!SDL_PixelFormatEnumToMasks
|
||||
(target_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask) || bpp < 15) {
|
||||
@@ -910,13 +939,24 @@ SDL_SW_SetupYUVDisplay(SDL_SW_YUVTexture * swdata, Uint32 target_format)
|
||||
*/
|
||||
for (i = 0; i < 256; ++i) {
|
||||
r_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(Rmask));
|
||||
r_2_pix_alloc[i + 256] <<= free_bits_at_bottom(Rmask);
|
||||
freebits = free_bits_at_bottom(Rmask);
|
||||
if (freebits < 32) {
|
||||
r_2_pix_alloc[i + 256] <<= freebits;
|
||||
}
|
||||
r_2_pix_alloc[i + 256] |= Amask;
|
||||
|
||||
g_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(Gmask));
|
||||
g_2_pix_alloc[i + 256] <<= free_bits_at_bottom(Gmask);
|
||||
freebits = free_bits_at_bottom(Gmask);
|
||||
if (freebits < 32) {
|
||||
g_2_pix_alloc[i + 256] <<= freebits;
|
||||
}
|
||||
g_2_pix_alloc[i + 256] |= Amask;
|
||||
|
||||
b_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(Bmask));
|
||||
b_2_pix_alloc[i + 256] <<= free_bits_at_bottom(Bmask);
|
||||
freebits = free_bits_at_bottom(Bmask);
|
||||
if (freebits < 32) {
|
||||
b_2_pix_alloc[i + 256] <<= freebits;
|
||||
}
|
||||
b_2_pix_alloc[i + 256] |= Amask;
|
||||
}
|
||||
|
||||
@@ -953,7 +993,7 @@ SDL_SW_SetupYUVDisplay(SDL_SW_YUVTexture * swdata, Uint32 target_format)
|
||||
case SDL_PIXELFORMAT_YV12:
|
||||
case SDL_PIXELFORMAT_IYUV:
|
||||
if (SDL_BYTESPERPIXEL(target_format) == 2) {
|
||||
#if (__GNUC__ > 2) && defined(__i386__) && __OPTIMIZE__ && SDL_ASSEMBLY_ROUTINES
|
||||
#ifdef USE_MMX_ASSEMBLY
|
||||
/* inline assembly functions */
|
||||
if (SDL_HasMMX() && (Rmask == 0xF800) &&
|
||||
(Gmask == 0x07E0) && (Bmask == 0x001F)
|
||||
@@ -974,7 +1014,7 @@ SDL_SW_SetupYUVDisplay(SDL_SW_YUVTexture * swdata, Uint32 target_format)
|
||||
swdata->Display2X = Color24DitherYV12Mod2X;
|
||||
}
|
||||
if (SDL_BYTESPERPIXEL(target_format) == 4) {
|
||||
#if (__GNUC__ > 2) && defined(__i386__) && __OPTIMIZE__ && SDL_ASSEMBLY_ROUTINES
|
||||
#ifdef USE_MMX_ASSEMBLY
|
||||
/* inline assembly functions */
|
||||
if (SDL_HasMMX() && (Rmask == 0x00FF0000) &&
|
||||
(Gmask == 0x0000FF00) &&
|
||||
@@ -1007,6 +1047,13 @@ SDL_SW_SetupYUVDisplay(SDL_SW_YUVTexture * swdata, Uint32 target_format)
|
||||
swdata->Display2X = Color32DitherYUY2Mod2X;
|
||||
}
|
||||
break;
|
||||
case SDL_PIXELFORMAT_NV21:
|
||||
case SDL_PIXELFORMAT_NV12:
|
||||
/* no Display{1,2}X function */
|
||||
swdata->Display1X = NULL;
|
||||
swdata->Display2X = NULL;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* We should never get here (caught above) */
|
||||
break;
|
||||
@@ -1034,6 +1081,8 @@ SDL_SW_CreateYUVTexture(Uint32 format, int w, int h)
|
||||
case SDL_PIXELFORMAT_YUY2:
|
||||
case SDL_PIXELFORMAT_UYVY:
|
||||
case SDL_PIXELFORMAT_YVYU:
|
||||
case SDL_PIXELFORMAT_NV12:
|
||||
case SDL_PIXELFORMAT_NV21:
|
||||
break;
|
||||
default:
|
||||
SDL_SetError("Unsupported YUV format");
|
||||
@@ -1050,7 +1099,35 @@ SDL_SW_CreateYUVTexture(Uint32 format, int w, int h)
|
||||
swdata->target_format = SDL_PIXELFORMAT_UNKNOWN;
|
||||
swdata->w = w;
|
||||
swdata->h = h;
|
||||
swdata->pixels = (Uint8 *) SDL_malloc(w * h * 2);
|
||||
{
|
||||
const int sz_plane = w * h;
|
||||
const int sz_plane_chroma = ((w + 1) / 2) * ((h + 1) / 2);
|
||||
const int sz_plane_packed = ((w + 1) / 2) * h;
|
||||
int dst_size = 0;
|
||||
switch(format)
|
||||
{
|
||||
case SDL_PIXELFORMAT_YV12: /**< Planar mode: Y + V + U (3 planes) */
|
||||
case SDL_PIXELFORMAT_IYUV: /**< Planar mode: Y + U + V (3 planes) */
|
||||
dst_size = sz_plane + sz_plane_chroma + sz_plane_chroma;
|
||||
break;
|
||||
|
||||
case SDL_PIXELFORMAT_YUY2: /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */
|
||||
case SDL_PIXELFORMAT_UYVY: /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */
|
||||
case SDL_PIXELFORMAT_YVYU: /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */
|
||||
dst_size = 4 * sz_plane_packed;
|
||||
break;
|
||||
|
||||
case SDL_PIXELFORMAT_NV12: /**< Planar mode: Y + U/V interleaved (2 planes) */
|
||||
case SDL_PIXELFORMAT_NV21: /**< Planar mode: Y + V/U interleaved (2 planes) */
|
||||
dst_size = sz_plane + sz_plane_chroma + sz_plane_chroma;
|
||||
break;
|
||||
|
||||
default:
|
||||
SDL_assert(0 && "We should never get here (caught above)");
|
||||
break;
|
||||
}
|
||||
swdata->pixels = (Uint8 *) SDL_malloc(dst_size);
|
||||
}
|
||||
swdata->colortab = (int *) SDL_malloc(4 * 256 * sizeof(int));
|
||||
swdata->rgb_2_pix = (Uint32 *) SDL_malloc(3 * 768 * sizeof(Uint32));
|
||||
if (!swdata->pixels || !swdata->colortab || !swdata->rgb_2_pix) {
|
||||
@@ -1080,18 +1157,27 @@ SDL_SW_CreateYUVTexture(Uint32 format, int w, int h)
|
||||
case SDL_PIXELFORMAT_YV12:
|
||||
case SDL_PIXELFORMAT_IYUV:
|
||||
swdata->pitches[0] = w;
|
||||
swdata->pitches[1] = swdata->pitches[0] / 2;
|
||||
swdata->pitches[2] = swdata->pitches[0] / 2;
|
||||
swdata->pitches[1] = (swdata->pitches[0] + 1) / 2;
|
||||
swdata->pitches[2] = (swdata->pitches[0] + 1) / 2;
|
||||
swdata->planes[0] = swdata->pixels;
|
||||
swdata->planes[1] = swdata->planes[0] + swdata->pitches[0] * h;
|
||||
swdata->planes[2] = swdata->planes[1] + swdata->pitches[1] * h / 2;
|
||||
swdata->planes[2] = swdata->planes[1] + swdata->pitches[1] * ((h + 1) / 2);
|
||||
break;
|
||||
case SDL_PIXELFORMAT_YUY2:
|
||||
case SDL_PIXELFORMAT_UYVY:
|
||||
case SDL_PIXELFORMAT_YVYU:
|
||||
swdata->pitches[0] = w * 2;
|
||||
swdata->pitches[0] = ((w + 1) / 2) * 4;
|
||||
swdata->planes[0] = swdata->pixels;
|
||||
break;
|
||||
|
||||
case SDL_PIXELFORMAT_NV12:
|
||||
case SDL_PIXELFORMAT_NV21:
|
||||
swdata->pitches[0] = w;
|
||||
swdata->pitches[1] = 2 * ((swdata->pitches[0] + 1) / 2);
|
||||
swdata->planes[0] = swdata->pixels;
|
||||
swdata->planes[1] = swdata->planes[0] + swdata->pitches[0] * h;
|
||||
break;
|
||||
|
||||
default:
|
||||
SDL_assert(0 && "We should never get here (caught above)");
|
||||
break;
|
||||
@@ -1120,7 +1206,7 @@ SDL_SW_UpdateYUVTexture(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,
|
||||
if (rect->x == 0 && rect->y == 0 &&
|
||||
rect->w == swdata->w && rect->h == swdata->h) {
|
||||
SDL_memcpy(swdata->pixels, pixels,
|
||||
(swdata->h * swdata->w) + (swdata->h * swdata->w) / 2);
|
||||
(swdata->h * swdata->w) + 2* ((swdata->h + 1) /2) * ((swdata->w + 1) / 2));
|
||||
} else {
|
||||
Uint8 *src, *dst;
|
||||
int row;
|
||||
@@ -1135,28 +1221,28 @@ SDL_SW_UpdateYUVTexture(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,
|
||||
src += pitch;
|
||||
dst += swdata->w;
|
||||
}
|
||||
|
||||
|
||||
/* Copy the next plane */
|
||||
src = (Uint8 *) pixels + rect->h * pitch;
|
||||
dst = swdata->pixels + swdata->h * swdata->w;
|
||||
dst += rect->y/2 * swdata->w/2 + rect->x/2;
|
||||
length = rect->w / 2;
|
||||
for (row = 0; row < rect->h/2; ++row) {
|
||||
dst += rect->y/2 * ((swdata->w + 1) / 2) + rect->x/2;
|
||||
length = (rect->w + 1) / 2;
|
||||
for (row = 0; row < (rect->h + 1)/2; ++row) {
|
||||
SDL_memcpy(dst, src, length);
|
||||
src += pitch/2;
|
||||
dst += swdata->w/2;
|
||||
src += (pitch + 1)/2;
|
||||
dst += (swdata->w + 1)/2;
|
||||
}
|
||||
|
||||
/* Copy the next plane */
|
||||
src = (Uint8 *) pixels + rect->h * pitch + (rect->h * pitch) / 4;
|
||||
src = (Uint8 *) pixels + rect->h * pitch + ((rect->h + 1) / 2) * ((pitch + 1) / 2);
|
||||
dst = swdata->pixels + swdata->h * swdata->w +
|
||||
(swdata->h * swdata->w) / 4;
|
||||
dst += rect->y/2 * swdata->w/2 + rect->x/2;
|
||||
length = rect->w / 2;
|
||||
for (row = 0; row < rect->h/2; ++row) {
|
||||
((swdata->h + 1)/2) * ((swdata->w+1) / 2);
|
||||
dst += rect->y/2 * ((swdata->w + 1)/2) + rect->x/2;
|
||||
length = (rect->w + 1) / 2;
|
||||
for (row = 0; row < (rect->h + 1)/2; ++row) {
|
||||
SDL_memcpy(dst, src, length);
|
||||
src += pitch/2;
|
||||
dst += swdata->w/2;
|
||||
src += (pitch + 1)/2;
|
||||
dst += (swdata->w + 1)/2;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1172,7 +1258,7 @@ SDL_SW_UpdateYUVTexture(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,
|
||||
dst =
|
||||
swdata->planes[0] + rect->y * swdata->pitches[0] +
|
||||
rect->x * 2;
|
||||
length = rect->w * 2;
|
||||
length = 4 * ((rect->w + 1) / 2);
|
||||
for (row = 0; row < rect->h; ++row) {
|
||||
SDL_memcpy(dst, src, length);
|
||||
src += pitch;
|
||||
@@ -1180,6 +1266,42 @@ SDL_SW_UpdateYUVTexture(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SDL_PIXELFORMAT_NV12:
|
||||
case SDL_PIXELFORMAT_NV21:
|
||||
{
|
||||
if (rect->x == 0 && rect->y == 0 && rect->w == swdata->w && rect->h == swdata->h) {
|
||||
SDL_memcpy(swdata->pixels, pixels,
|
||||
(swdata->h * swdata->w) + 2* ((swdata->h + 1) /2) * ((swdata->w + 1) / 2));
|
||||
} else {
|
||||
|
||||
Uint8 *src, *dst;
|
||||
int row;
|
||||
size_t length;
|
||||
|
||||
/* Copy the Y plane */
|
||||
src = (Uint8 *) pixels;
|
||||
dst = swdata->pixels + rect->y * swdata->w + rect->x;
|
||||
length = rect->w;
|
||||
for (row = 0; row < rect->h; ++row) {
|
||||
SDL_memcpy(dst, src, length);
|
||||
src += pitch;
|
||||
dst += swdata->w;
|
||||
}
|
||||
|
||||
/* Copy the next plane */
|
||||
src = (Uint8 *) pixels + rect->h * pitch;
|
||||
dst = swdata->pixels + swdata->h * swdata->w;
|
||||
dst += 2 * ((rect->y + 1)/2) * ((swdata->w + 1) / 2) + 2 * (rect->x/2);
|
||||
length = 2 * ((rect->w + 1) / 2);
|
||||
for (row = 0; row < (rect->h + 1)/2; ++row) {
|
||||
SDL_memcpy(dst, src, length);
|
||||
src += 2 * ((pitch + 1)/2);
|
||||
dst += 2 * ((swdata->w + 1)/2);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1211,14 +1333,14 @@ SDL_SW_UpdateYUVTexturePlanar(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,
|
||||
dst = swdata->pixels + swdata->h * swdata->w;
|
||||
} else {
|
||||
dst = swdata->pixels + swdata->h * swdata->w +
|
||||
(swdata->h * swdata->w) / 4;
|
||||
((swdata->h + 1) / 2) * ((swdata->w + 1) / 2);
|
||||
}
|
||||
dst += rect->y/2 * swdata->w/2 + rect->x/2;
|
||||
length = rect->w / 2;
|
||||
for (row = 0; row < rect->h/2; ++row) {
|
||||
dst += rect->y/2 * ((swdata->w + 1)/2) + rect->x/2;
|
||||
length = (rect->w + 1) / 2;
|
||||
for (row = 0; row < (rect->h + 1)/2; ++row) {
|
||||
SDL_memcpy(dst, src, length);
|
||||
src += Upitch;
|
||||
dst += swdata->w/2;
|
||||
dst += (swdata->w + 1)/2;
|
||||
}
|
||||
|
||||
/* Copy the V plane */
|
||||
@@ -1227,14 +1349,14 @@ SDL_SW_UpdateYUVTexturePlanar(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,
|
||||
dst = swdata->pixels + swdata->h * swdata->w;
|
||||
} else {
|
||||
dst = swdata->pixels + swdata->h * swdata->w +
|
||||
(swdata->h * swdata->w) / 4;
|
||||
((swdata->h + 1) / 2) * ((swdata->w + 1) / 2);
|
||||
}
|
||||
dst += rect->y/2 * swdata->w/2 + rect->x/2;
|
||||
length = rect->w / 2;
|
||||
for (row = 0; row < rect->h/2; ++row) {
|
||||
dst += rect->y/2 * ((swdata->w + 1)/2) + rect->x/2;
|
||||
length = (rect->w + 1) / 2;
|
||||
for (row = 0; row < (rect->h + 1)/2; ++row) {
|
||||
SDL_memcpy(dst, src, length);
|
||||
src += Vpitch;
|
||||
dst += swdata->w/2;
|
||||
dst += (swdata->w + 1)/2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1246,11 +1368,13 @@ SDL_SW_LockYUVTexture(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,
|
||||
switch (swdata->format) {
|
||||
case SDL_PIXELFORMAT_YV12:
|
||||
case SDL_PIXELFORMAT_IYUV:
|
||||
case SDL_PIXELFORMAT_NV12:
|
||||
case SDL_PIXELFORMAT_NV21:
|
||||
if (rect
|
||||
&& (rect->x != 0 || rect->y != 0 || rect->w != swdata->w
|
||||
|| rect->h != swdata->h)) {
|
||||
return SDL_SetError
|
||||
("YV12 and IYUV textures only support full surface locks");
|
||||
("YV12, IYUV, NV12, NV21 textures only support full surface locks");
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1368,6 +1492,12 @@ SDL_SW_CopyYUVToRGB(SDL_SW_YUVTexture * swdata, const SDL_Rect * srcrect,
|
||||
Cr = lum + 1;
|
||||
Cb = lum + 3;
|
||||
break;
|
||||
case SDL_PIXELFORMAT_NV12:
|
||||
case SDL_PIXELFORMAT_NV21:
|
||||
return SDL_ConvertPixels(swdata->w, swdata->h,
|
||||
swdata->format, swdata->planes[0], swdata->pitches[0],
|
||||
target_format, pixels, pitch);
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("Unsupported YUV format in copy");
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -69,4 +69,9 @@ int SDL_SW_CopyYUVToRGB(SDL_SW_YUVTexture * swdata, const SDL_Rect * srcrect,
|
||||
int pitch);
|
||||
void SDL_SW_DestroyYUVTexture(SDL_SW_YUVTexture * swdata);
|
||||
|
||||
/* FIXME: This breaks on various versions of GCC and should be rewritten using intrinsics */
|
||||
#if 0 /* (__GNUC__ > 2) && defined(__i386__) && __OPTIMIZE__ && SDL_ASSEMBLY_ROUTINES && !defined(__clang__) */
|
||||
#define USE_MMX_ASSEMBLY 1
|
||||
#endif
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -125,6 +125,7 @@ static void PrintShaderData(LPDWORD shader_data, DWORD shader_size)
|
||||
static SDL_Renderer *D3D_CreateRenderer(SDL_Window * window, Uint32 flags);
|
||||
static void D3D_WindowEvent(SDL_Renderer * renderer,
|
||||
const SDL_WindowEvent *event);
|
||||
static SDL_bool D3D_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode);
|
||||
static int D3D_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
||||
static int D3D_RecreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
||||
static int D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
@@ -542,6 +543,7 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||
}
|
||||
|
||||
renderer->WindowEvent = D3D_WindowEvent;
|
||||
renderer->SupportsBlendMode = D3D_SupportsBlendMode;
|
||||
renderer->CreateTexture = D3D_CreateTexture;
|
||||
renderer->UpdateTexture = D3D_UpdateTexture;
|
||||
renderer->UpdateTextureYUV = D3D_UpdateTextureYUV;
|
||||
@@ -759,6 +761,7 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||
const char *error = (const char *)pErrorMsgs->lpVtbl->GetBufferPointer(pErrorMsgs);
|
||||
SDL_SetError("Couldn't assemble shader: %s", error);
|
||||
}
|
||||
if (shader_data != NULL)
|
||||
#else
|
||||
const DWORD shader_data[] = {
|
||||
0xffff0200, 0x05000051, 0xa00f0000, 0xbd808081, 0xbf008081, 0xbf008081,
|
||||
@@ -778,7 +781,7 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||
0x80e40000, 0x0000ffff
|
||||
};
|
||||
#endif
|
||||
if (shader_data != NULL) {
|
||||
{
|
||||
result = IDirect3DDevice9_CreatePixelShader(data->device, shader_data, &data->ps_yuv);
|
||||
if (!FAILED(result)) {
|
||||
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_YV12;
|
||||
@@ -802,6 +805,58 @@ D3D_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
static D3DBLEND GetBlendFunc(SDL_BlendFactor factor)
|
||||
{
|
||||
switch (factor) {
|
||||
case SDL_BLENDFACTOR_ZERO:
|
||||
return D3DBLEND_ZERO;
|
||||
case SDL_BLENDFACTOR_ONE:
|
||||
return D3DBLEND_ONE;
|
||||
case SDL_BLENDFACTOR_SRC_COLOR:
|
||||
return D3DBLEND_SRCCOLOR;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
|
||||
return D3DBLEND_INVSRCCOLOR;
|
||||
case SDL_BLENDFACTOR_SRC_ALPHA:
|
||||
return D3DBLEND_SRCALPHA;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
|
||||
return D3DBLEND_INVSRCALPHA;
|
||||
case SDL_BLENDFACTOR_DST_COLOR:
|
||||
return D3DBLEND_DESTCOLOR;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
|
||||
return D3DBLEND_INVDESTCOLOR;
|
||||
case SDL_BLENDFACTOR_DST_ALPHA:
|
||||
return D3DBLEND_DESTALPHA;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
|
||||
return D3DBLEND_INVDESTALPHA;
|
||||
default:
|
||||
return (D3DBLEND)0;
|
||||
}
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
D3D_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
|
||||
{
|
||||
D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
|
||||
SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
|
||||
SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
|
||||
SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
|
||||
SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
|
||||
SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
|
||||
SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
|
||||
|
||||
if (!GetBlendFunc(srcColorFactor) || !GetBlendFunc(srcAlphaFactor) ||
|
||||
!GetBlendFunc(dstColorFactor) || !GetBlendFunc(dstAlphaFactor)) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
if ((srcColorFactor != srcAlphaFactor || dstColorFactor != dstAlphaFactor) && !data->enableSeparateAlphaBlend) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
if (colorOperation != SDL_BLENDOPERATION_ADD || alphaOperation != SDL_BLENDOPERATION_ADD) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
static D3DTEXTUREFILTERTYPE
|
||||
GetScaleQuality(void)
|
||||
{
|
||||
@@ -1353,55 +1408,22 @@ D3D_RenderClear(SDL_Renderer * renderer)
|
||||
}
|
||||
|
||||
static void
|
||||
D3D_SetBlendMode(D3D_RenderData * data, int blendMode)
|
||||
D3D_SetBlendMode(D3D_RenderData * data, SDL_BlendMode blendMode)
|
||||
{
|
||||
switch (blendMode) {
|
||||
case SDL_BLENDMODE_NONE:
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
|
||||
FALSE);
|
||||
break;
|
||||
case SDL_BLENDMODE_BLEND:
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
|
||||
TRUE);
|
||||
if (blendMode == SDL_BLENDMODE_NONE) {
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, FALSE);
|
||||
} else {
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, TRUE);
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
|
||||
D3DBLEND_SRCALPHA);
|
||||
GetBlendFunc(SDL_GetBlendModeSrcColorFactor(blendMode)));
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
|
||||
D3DBLEND_INVSRCALPHA);
|
||||
GetBlendFunc(SDL_GetBlendModeDstColorFactor(blendMode)));
|
||||
if (data->enableSeparateAlphaBlend) {
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLENDALPHA,
|
||||
D3DBLEND_ONE);
|
||||
GetBlendFunc(SDL_GetBlendModeSrcAlphaFactor(blendMode)));
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLENDALPHA,
|
||||
D3DBLEND_INVSRCALPHA);
|
||||
GetBlendFunc(SDL_GetBlendModeDstAlphaFactor(blendMode)));
|
||||
}
|
||||
break;
|
||||
case SDL_BLENDMODE_ADD:
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
|
||||
TRUE);
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
|
||||
D3DBLEND_SRCALPHA);
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
|
||||
D3DBLEND_ONE);
|
||||
if (data->enableSeparateAlphaBlend) {
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLENDALPHA,
|
||||
D3DBLEND_ZERO);
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLENDALPHA,
|
||||
D3DBLEND_ONE);
|
||||
}
|
||||
break;
|
||||
case SDL_BLENDMODE_MOD:
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
|
||||
TRUE);
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
|
||||
D3DBLEND_ZERO);
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
|
||||
D3DBLEND_SRCCOLOR);
|
||||
if (data->enableSeparateAlphaBlend) {
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLENDALPHA,
|
||||
D3DBLEND_ZERO);
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLENDALPHA,
|
||||
D3DBLEND_ONE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1723,29 +1745,27 @@ D3D_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
centerx = center->x;
|
||||
centery = center->y;
|
||||
|
||||
if (flip & SDL_FLIP_HORIZONTAL) {
|
||||
minx = dstrect->w - centerx - 0.5f;
|
||||
maxx = -centerx - 0.5f;
|
||||
}
|
||||
else {
|
||||
minx = -centerx - 0.5f;
|
||||
maxx = dstrect->w - centerx - 0.5f;
|
||||
}
|
||||
|
||||
if (flip & SDL_FLIP_VERTICAL) {
|
||||
miny = dstrect->h - centery - 0.5f;
|
||||
maxy = -centery - 0.5f;
|
||||
}
|
||||
else {
|
||||
miny = -centery - 0.5f;
|
||||
maxy = dstrect->h - centery - 0.5f;
|
||||
}
|
||||
minx = -centerx;
|
||||
maxx = dstrect->w - centerx;
|
||||
miny = -centery;
|
||||
maxy = dstrect->h - centery;
|
||||
|
||||
minu = (float) srcrect->x / texture->w;
|
||||
maxu = (float) (srcrect->x + srcrect->w) / texture->w;
|
||||
minv = (float) srcrect->y / texture->h;
|
||||
maxv = (float) (srcrect->y + srcrect->h) / texture->h;
|
||||
|
||||
if (flip & SDL_FLIP_HORIZONTAL) {
|
||||
float tmp = maxu;
|
||||
maxu = minu;
|
||||
minu = tmp;
|
||||
}
|
||||
if (flip & SDL_FLIP_VERTICAL) {
|
||||
float tmp = maxv;
|
||||
maxv = minv;
|
||||
minv = tmp;
|
||||
}
|
||||
|
||||
color = D3DCOLOR_ARGB(texture->a, texture->r, texture->g, texture->b);
|
||||
|
||||
vertices[0].x = minx;
|
||||
@@ -1781,8 +1801,7 @@ D3D_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
/* Rotate and translate */
|
||||
modelMatrix = MatrixMultiply(
|
||||
MatrixRotationZ((float)(M_PI * (float) angle / 180.0f)),
|
||||
MatrixTranslation(dstrect->x + center->x, dstrect->y + center->y, 0)
|
||||
);
|
||||
MatrixTranslation(dstrect->x + center->x - 0.5f, dstrect->y + center->y - 0.5f, 0));
|
||||
IDirect3DDevice9_SetTransform(data->device, D3DTS_VIEW, (D3DMATRIX*)&modelMatrix);
|
||||
|
||||
D3D_UpdateTextureScaleMode(data, texturedata, 0);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -93,6 +93,13 @@ typedef struct
|
||||
SDL_Rect locked_rect;
|
||||
} D3D11_TextureData;
|
||||
|
||||
/* Blend mode data */
|
||||
typedef struct
|
||||
{
|
||||
SDL_BlendMode blendMode;
|
||||
ID3D11BlendState *blendState;
|
||||
} D3D11_BlendMode;
|
||||
|
||||
/* Private renderer data */
|
||||
typedef struct
|
||||
{
|
||||
@@ -112,9 +119,8 @@ typedef struct
|
||||
ID3D11PixelShader *colorPixelShader;
|
||||
ID3D11PixelShader *texturePixelShader;
|
||||
ID3D11PixelShader *yuvPixelShader;
|
||||
ID3D11BlendState *blendModeBlend;
|
||||
ID3D11BlendState *blendModeAdd;
|
||||
ID3D11BlendState *blendModeMod;
|
||||
int blendModesCount;
|
||||
D3D11_BlendMode *blendModes;
|
||||
ID3D11SamplerState *nearestPixelSampler;
|
||||
ID3D11SamplerState *linearSampler;
|
||||
D3D_FEATURE_LEVEL featureLevel;
|
||||
@@ -716,6 +722,7 @@ static const DWORD D3D11_VertexShader[] = {
|
||||
static SDL_Renderer *D3D11_CreateRenderer(SDL_Window * window, Uint32 flags);
|
||||
static void D3D11_WindowEvent(SDL_Renderer * renderer,
|
||||
const SDL_WindowEvent *event);
|
||||
static SDL_bool D3D11_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode);
|
||||
static int D3D11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
||||
static int D3D11_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
const SDL_Rect * rect, const void *srcPixels,
|
||||
@@ -826,6 +833,7 @@ D3D11_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||
}
|
||||
|
||||
renderer->WindowEvent = D3D11_WindowEvent;
|
||||
renderer->SupportsBlendMode = D3D11_SupportsBlendMode;
|
||||
renderer->CreateTexture = D3D11_CreateTexture;
|
||||
renderer->UpdateTexture = D3D11_UpdateTexture;
|
||||
renderer->UpdateTextureYUV = D3D11_UpdateTextureYUV;
|
||||
@@ -898,6 +906,8 @@ D3D11_ReleaseAll(SDL_Renderer * renderer)
|
||||
|
||||
/* Release/reset everything else */
|
||||
if (data) {
|
||||
int i;
|
||||
|
||||
SAFE_RELEASE(data->dxgiFactory);
|
||||
SAFE_RELEASE(data->dxgiAdapter);
|
||||
SAFE_RELEASE(data->d3dDevice);
|
||||
@@ -911,9 +921,14 @@ D3D11_ReleaseAll(SDL_Renderer * renderer)
|
||||
SAFE_RELEASE(data->colorPixelShader);
|
||||
SAFE_RELEASE(data->texturePixelShader);
|
||||
SAFE_RELEASE(data->yuvPixelShader);
|
||||
SAFE_RELEASE(data->blendModeBlend);
|
||||
SAFE_RELEASE(data->blendModeAdd);
|
||||
SAFE_RELEASE(data->blendModeMod);
|
||||
if (data->blendModesCount > 0) {
|
||||
for (i = 0; i < data->blendModesCount; ++i) {
|
||||
SAFE_RELEASE(data->blendModes[i].blendState);
|
||||
}
|
||||
SDL_free(data->blendModes);
|
||||
|
||||
data->blendModesCount = 0;
|
||||
}
|
||||
SAFE_RELEASE(data->nearestPixelSampler);
|
||||
SAFE_RELEASE(data->linearSampler);
|
||||
SAFE_RELEASE(data->mainRasterizer);
|
||||
@@ -954,37 +969,96 @@ D3D11_DestroyRenderer(SDL_Renderer * renderer)
|
||||
SDL_free(renderer);
|
||||
}
|
||||
|
||||
static HRESULT
|
||||
D3D11_CreateBlendMode(SDL_Renderer * renderer,
|
||||
BOOL enableBlending,
|
||||
D3D11_BLEND srcBlend,
|
||||
D3D11_BLEND destBlend,
|
||||
D3D11_BLEND srcBlendAlpha,
|
||||
D3D11_BLEND destBlendAlpha,
|
||||
ID3D11BlendState ** blendStateOutput)
|
||||
static D3D11_BLEND GetBlendFunc(SDL_BlendFactor factor)
|
||||
{
|
||||
switch (factor) {
|
||||
case SDL_BLENDFACTOR_ZERO:
|
||||
return D3D11_BLEND_ZERO;
|
||||
case SDL_BLENDFACTOR_ONE:
|
||||
return D3D11_BLEND_ONE;
|
||||
case SDL_BLENDFACTOR_SRC_COLOR:
|
||||
return D3D11_BLEND_SRC_COLOR;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
|
||||
return D3D11_BLEND_INV_SRC_COLOR;
|
||||
case SDL_BLENDFACTOR_SRC_ALPHA:
|
||||
return D3D11_BLEND_SRC_ALPHA;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
|
||||
return D3D11_BLEND_INV_SRC_ALPHA;
|
||||
case SDL_BLENDFACTOR_DST_COLOR:
|
||||
return D3D11_BLEND_DEST_COLOR;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
|
||||
return D3D11_BLEND_INV_DEST_COLOR;
|
||||
case SDL_BLENDFACTOR_DST_ALPHA:
|
||||
return D3D11_BLEND_DEST_ALPHA;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
|
||||
return D3D11_BLEND_INV_DEST_ALPHA;
|
||||
default:
|
||||
return (D3D11_BLEND)0;
|
||||
}
|
||||
}
|
||||
|
||||
static D3D11_BLEND_OP GetBlendEquation(SDL_BlendOperation operation)
|
||||
{
|
||||
switch (operation) {
|
||||
case SDL_BLENDOPERATION_ADD:
|
||||
return D3D11_BLEND_OP_ADD;
|
||||
case SDL_BLENDOPERATION_SUBTRACT:
|
||||
return D3D11_BLEND_OP_SUBTRACT;
|
||||
case SDL_BLENDOPERATION_REV_SUBTRACT:
|
||||
return D3D11_BLEND_OP_REV_SUBTRACT;
|
||||
case SDL_BLENDOPERATION_MINIMUM:
|
||||
return D3D11_BLEND_OP_MIN;
|
||||
case SDL_BLENDOPERATION_MAXIMUM:
|
||||
return D3D11_BLEND_OP_MAX;
|
||||
default:
|
||||
return (D3D11_BLEND_OP)0;
|
||||
}
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
D3D11_CreateBlendState(SDL_Renderer * renderer, SDL_BlendMode blendMode)
|
||||
{
|
||||
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
||||
SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
|
||||
SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
|
||||
SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
|
||||
SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
|
||||
SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
|
||||
SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
|
||||
ID3D11BlendState *blendState = NULL;
|
||||
D3D11_BlendMode *blendModes;
|
||||
HRESULT result = S_OK;
|
||||
|
||||
D3D11_BLEND_DESC blendDesc;
|
||||
SDL_zero(blendDesc);
|
||||
blendDesc.AlphaToCoverageEnable = FALSE;
|
||||
blendDesc.IndependentBlendEnable = FALSE;
|
||||
blendDesc.RenderTarget[0].BlendEnable = enableBlending;
|
||||
blendDesc.RenderTarget[0].SrcBlend = srcBlend;
|
||||
blendDesc.RenderTarget[0].DestBlend = destBlend;
|
||||
blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
|
||||
blendDesc.RenderTarget[0].SrcBlendAlpha = srcBlendAlpha;
|
||||
blendDesc.RenderTarget[0].DestBlendAlpha = destBlendAlpha;
|
||||
blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
|
||||
blendDesc.RenderTarget[0].BlendEnable = TRUE;
|
||||
blendDesc.RenderTarget[0].SrcBlend = GetBlendFunc(srcColorFactor);
|
||||
blendDesc.RenderTarget[0].DestBlend = GetBlendFunc(dstColorFactor);
|
||||
blendDesc.RenderTarget[0].BlendOp = GetBlendEquation(colorOperation);
|
||||
blendDesc.RenderTarget[0].SrcBlendAlpha = GetBlendFunc(srcAlphaFactor);
|
||||
blendDesc.RenderTarget[0].DestBlendAlpha = GetBlendFunc(dstAlphaFactor);
|
||||
blendDesc.RenderTarget[0].BlendOpAlpha = GetBlendEquation(alphaOperation);
|
||||
blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
|
||||
result = ID3D11Device_CreateBlendState(data->d3dDevice, &blendDesc, blendStateOutput);
|
||||
result = ID3D11Device_CreateBlendState(data->d3dDevice, &blendDesc, &blendState);
|
||||
if (FAILED(result)) {
|
||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateBlendState"), result);
|
||||
return result;
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
blendModes = (D3D11_BlendMode *)SDL_realloc(data->blendModes, (data->blendModesCount + 1) * sizeof(*blendModes));
|
||||
if (!blendModes) {
|
||||
SAFE_RELEASE(blendState);
|
||||
SDL_OutOfMemory();
|
||||
return SDL_FALSE;
|
||||
}
|
||||
blendModes[data->blendModesCount].blendMode = blendMode;
|
||||
blendModes[data->blendModesCount].blendState = blendState;
|
||||
data->blendModes = blendModes;
|
||||
++data->blendModesCount;
|
||||
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
/* Create resources that depend on the device. */
|
||||
@@ -1286,41 +1360,9 @@ D3D11_CreateDeviceResources(SDL_Renderer * renderer)
|
||||
}
|
||||
|
||||
/* Create blending states: */
|
||||
result = D3D11_CreateBlendMode(
|
||||
renderer,
|
||||
TRUE,
|
||||
D3D11_BLEND_SRC_ALPHA, /* srcBlend */
|
||||
D3D11_BLEND_INV_SRC_ALPHA, /* destBlend */
|
||||
D3D11_BLEND_ONE, /* srcBlendAlpha */
|
||||
D3D11_BLEND_INV_SRC_ALPHA, /* destBlendAlpha */
|
||||
&data->blendModeBlend);
|
||||
if (FAILED(result)) {
|
||||
/* D3D11_CreateBlendMode will set the SDL error, if it fails */
|
||||
goto done;
|
||||
}
|
||||
|
||||
result = D3D11_CreateBlendMode(
|
||||
renderer,
|
||||
TRUE,
|
||||
D3D11_BLEND_SRC_ALPHA, /* srcBlend */
|
||||
D3D11_BLEND_ONE, /* destBlend */
|
||||
D3D11_BLEND_ZERO, /* srcBlendAlpha */
|
||||
D3D11_BLEND_ONE, /* destBlendAlpha */
|
||||
&data->blendModeAdd);
|
||||
if (FAILED(result)) {
|
||||
/* D3D11_CreateBlendMode will set the SDL error, if it fails */
|
||||
goto done;
|
||||
}
|
||||
|
||||
result = D3D11_CreateBlendMode(
|
||||
renderer,
|
||||
TRUE,
|
||||
D3D11_BLEND_ZERO, /* srcBlend */
|
||||
D3D11_BLEND_SRC_COLOR, /* destBlend */
|
||||
D3D11_BLEND_ZERO, /* srcBlendAlpha */
|
||||
D3D11_BLEND_ONE, /* destBlendAlpha */
|
||||
&data->blendModeMod);
|
||||
if (FAILED(result)) {
|
||||
if (!D3D11_CreateBlendState(renderer, SDL_BLENDMODE_BLEND) ||
|
||||
!D3D11_CreateBlendState(renderer, SDL_BLENDMODE_ADD) ||
|
||||
!D3D11_CreateBlendState(renderer, SDL_BLENDMODE_MOD)) {
|
||||
/* D3D11_CreateBlendMode will set the SDL error, if it fails */
|
||||
goto done;
|
||||
}
|
||||
@@ -1694,6 +1736,25 @@ D3D11_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
D3D11_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
|
||||
{
|
||||
SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
|
||||
SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
|
||||
SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
|
||||
SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
|
||||
SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
|
||||
SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
|
||||
|
||||
if (!GetBlendFunc(srcColorFactor) || !GetBlendFunc(srcAlphaFactor) ||
|
||||
!GetBlendEquation(colorOperation) ||
|
||||
!GetBlendFunc(dstColorFactor) || !GetBlendFunc(dstAlphaFactor) ||
|
||||
!GetBlendEquation(alphaOperation)) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
static D3D11_FILTER
|
||||
GetScaleQuality(void)
|
||||
{
|
||||
@@ -2443,19 +2504,21 @@ D3D11_RenderSetBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
|
||||
{
|
||||
D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->driverdata;
|
||||
ID3D11BlendState *blendState = NULL;
|
||||
switch (blendMode) {
|
||||
case SDL_BLENDMODE_BLEND:
|
||||
blendState = rendererData->blendModeBlend;
|
||||
break;
|
||||
case SDL_BLENDMODE_ADD:
|
||||
blendState = rendererData->blendModeAdd;
|
||||
break;
|
||||
case SDL_BLENDMODE_MOD:
|
||||
blendState = rendererData->blendModeMod;
|
||||
break;
|
||||
case SDL_BLENDMODE_NONE:
|
||||
blendState = NULL;
|
||||
break;
|
||||
if (blendMode != SDL_BLENDMODE_NONE) {
|
||||
int i;
|
||||
for (i = 0; i < rendererData->blendModesCount; ++i) {
|
||||
if (blendMode == rendererData->blendModes[i].blendMode) {
|
||||
blendState = rendererData->blendModes[i].blendState;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!blendState) {
|
||||
if (D3D11_CreateBlendState(renderer, blendMode)) {
|
||||
/* Successfully created the blend state, try again */
|
||||
D3D11_RenderSetBlendMode(renderer, blendMode);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (blendState != rendererData->currentBlendState) {
|
||||
ID3D11DeviceContext_OMSetBlendState(rendererData->d3dContext, blendState, 0, 0xFFFFFFFF);
|
||||
@@ -2518,7 +2581,7 @@ D3D11_RenderDrawPoints(SDL_Renderer * renderer,
|
||||
|
||||
vertices = SDL_stack_alloc(VertexPositionColor, count);
|
||||
for (i = 0; i < count; ++i) {
|
||||
const VertexPositionColor v = { { points[i].x, points[i].y, 0.0f }, { 0.0f, 0.0f }, { r, g, b, a } };
|
||||
const VertexPositionColor v = { { points[i].x + 0.5f, points[i].y + 0.5f, 0.0f }, { 0.0f, 0.0f }, { r, g, b, a } };
|
||||
vertices[i] = v;
|
||||
}
|
||||
|
||||
@@ -2557,7 +2620,7 @@ D3D11_RenderDrawLines(SDL_Renderer * renderer,
|
||||
|
||||
vertices = SDL_stack_alloc(VertexPositionColor, count);
|
||||
for (i = 0; i < count; ++i) {
|
||||
const VertexPositionColor v = { { points[i].x, points[i].y, 0.0f }, { 0.0f, 0.0f }, { r, g, b, a } };
|
||||
const VertexPositionColor v = { { points[i].x + 0.5f, points[i].y + 0.5f, 0.0f }, { 0.0f, 0.0f }, { r, g, b, a } };
|
||||
vertices[i] = v;
|
||||
}
|
||||
|
||||
@@ -2576,6 +2639,12 @@ D3D11_RenderDrawLines(SDL_Renderer * renderer,
|
||||
NULL);
|
||||
|
||||
D3D11_RenderFinishDrawOp(renderer, D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP, count);
|
||||
|
||||
if (points[0].x != points[count - 1].x || points[0].y != points[count - 1].y) {
|
||||
ID3D11DeviceContext_IASetPrimitiveTopology(rendererData->d3dContext, D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
|
||||
ID3D11DeviceContext_Draw(rendererData->d3dContext, 1, count - 1);
|
||||
}
|
||||
|
||||
SDL_stack_free(vertices);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -35,7 +35,8 @@ SDL_PROC(void, glBindTexture, (GLenum, GLuint))
|
||||
SDL_PROC_UNUSED(void, glBitmap,
|
||||
(GLsizei, GLsizei, GLfloat, GLfloat, GLfloat, GLfloat,
|
||||
const GLubyte *))
|
||||
SDL_PROC(void, glBlendFunc, (GLenum, GLenum))
|
||||
SDL_PROC(void, glBlendEquation, (GLenum))
|
||||
SDL_PROC_UNUSED(void, glBlendFunc, (GLenum, GLenum))
|
||||
SDL_PROC(void, glBlendFuncSeparate, (GLenum, GLenum, GLenum, GLenum))
|
||||
SDL_PROC_UNUSED(void, glCallList, (GLuint))
|
||||
SDL_PROC_UNUSED(void, glCallLists, (GLsizei, GLenum, const GLvoid *))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -55,6 +55,7 @@ static SDL_Renderer *GL_CreateRenderer(SDL_Window * window, Uint32 flags);
|
||||
static void GL_WindowEvent(SDL_Renderer * renderer,
|
||||
const SDL_WindowEvent *event);
|
||||
static int GL_GetOutputSize(SDL_Renderer * renderer, int *w, int *h);
|
||||
static SDL_bool GL_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode);
|
||||
static int GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
||||
static int GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
const SDL_Rect * rect, const void *pixels,
|
||||
@@ -126,7 +127,7 @@ typedef struct
|
||||
struct {
|
||||
GL_Shader shader;
|
||||
Uint32 color;
|
||||
int blendMode;
|
||||
SDL_BlendMode blendMode;
|
||||
} current;
|
||||
|
||||
SDL_bool GL_EXT_framebuffer_object_supported;
|
||||
@@ -259,7 +260,7 @@ GL_CheckAllErrors (const char *prefix, SDL_Renderer *renderer, const char *file,
|
||||
|
||||
#if 0
|
||||
#define GL_CheckError(prefix, renderer)
|
||||
#elif defined(_MSC_VER)
|
||||
#elif defined(_MSC_VER) || defined(__WATCOMC__)
|
||||
#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __FUNCTION__)
|
||||
#else
|
||||
#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __PRETTY_FUNCTION__)
|
||||
@@ -275,7 +276,7 @@ GL_LoadFunctions(GL_RenderData * data)
|
||||
do { \
|
||||
data->func = SDL_GL_GetProcAddress(#func); \
|
||||
if ( ! data->func ) { \
|
||||
return SDL_SetError("Couldn't load GL function %s: %s\n", #func, SDL_GetError()); \
|
||||
return SDL_SetError("Couldn't load GL function %s: %s", #func, SDL_GetError()); \
|
||||
} \
|
||||
} while ( 0 );
|
||||
#endif /* __SDL_NOGETPROCADDR__ */
|
||||
@@ -320,8 +321,8 @@ GL_ResetState(SDL_Renderer *renderer)
|
||||
}
|
||||
|
||||
data->current.shader = SHADER_NONE;
|
||||
data->current.color = 0;
|
||||
data->current.blendMode = -1;
|
||||
data->current.color = 0xffffffff;
|
||||
data->current.blendMode = SDL_BLENDMODE_INVALID;
|
||||
|
||||
data->glDisable(GL_DEPTH_TEST);
|
||||
data->glDisable(GL_CULL_FACE);
|
||||
@@ -428,6 +429,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||
|
||||
renderer->WindowEvent = GL_WindowEvent;
|
||||
renderer->GetOutputSize = GL_GetOutputSize;
|
||||
renderer->SupportsBlendMode = GL_SupportsBlendMode;
|
||||
renderer->CreateTexture = GL_CreateTexture;
|
||||
renderer->UpdateTexture = GL_UpdateTexture;
|
||||
renderer->UpdateTextureYUV = GL_UpdateTextureYUV;
|
||||
@@ -493,7 +495,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||
PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC) SDL_GL_GetProcAddress("glDebugMessageCallbackARB");
|
||||
|
||||
data->GL_ARB_debug_output_supported = SDL_TRUE;
|
||||
data->glGetPointerv(GL_DEBUG_CALLBACK_FUNCTION_ARB, (GLvoid **)&data->next_error_callback);
|
||||
data->glGetPointerv(GL_DEBUG_CALLBACK_FUNCTION_ARB, (GLvoid **)(char *)&data->next_error_callback);
|
||||
data->glGetPointerv(GL_DEBUG_CALLBACK_USER_PARAM_ARB, &data->next_error_userparam);
|
||||
glDebugMessageCallbackARBFunc(GL_HandleDebugMessage, renderer);
|
||||
|
||||
@@ -595,6 +597,72 @@ GL_GetOutputSize(SDL_Renderer * renderer, int *w, int *h)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static GLenum GetBlendFunc(SDL_BlendFactor factor)
|
||||
{
|
||||
switch (factor) {
|
||||
case SDL_BLENDFACTOR_ZERO:
|
||||
return GL_ZERO;
|
||||
case SDL_BLENDFACTOR_ONE:
|
||||
return GL_ONE;
|
||||
case SDL_BLENDFACTOR_SRC_COLOR:
|
||||
return GL_SRC_COLOR;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
|
||||
return GL_ONE_MINUS_SRC_COLOR;
|
||||
case SDL_BLENDFACTOR_SRC_ALPHA:
|
||||
return GL_SRC_ALPHA;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
|
||||
return GL_ONE_MINUS_SRC_ALPHA;
|
||||
case SDL_BLENDFACTOR_DST_COLOR:
|
||||
return GL_DST_COLOR;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
|
||||
return GL_ONE_MINUS_DST_COLOR;
|
||||
case SDL_BLENDFACTOR_DST_ALPHA:
|
||||
return GL_DST_ALPHA;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
|
||||
return GL_ONE_MINUS_DST_ALPHA;
|
||||
default:
|
||||
return GL_INVALID_ENUM;
|
||||
}
|
||||
}
|
||||
|
||||
static GLenum GetBlendEquation(SDL_BlendOperation operation)
|
||||
{
|
||||
switch (operation) {
|
||||
case SDL_BLENDOPERATION_ADD:
|
||||
return GL_FUNC_ADD;
|
||||
case SDL_BLENDOPERATION_SUBTRACT:
|
||||
return GL_FUNC_SUBTRACT;
|
||||
case SDL_BLENDOPERATION_REV_SUBTRACT:
|
||||
return GL_FUNC_REVERSE_SUBTRACT;
|
||||
default:
|
||||
return GL_INVALID_ENUM;
|
||||
}
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
GL_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
|
||||
{
|
||||
SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
|
||||
SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
|
||||
SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
|
||||
SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
|
||||
SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
|
||||
SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
|
||||
|
||||
if (GetBlendFunc(srcColorFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendFunc(srcAlphaFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendEquation(colorOperation) == GL_INVALID_ENUM ||
|
||||
GetBlendFunc(dstColorFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendFunc(dstAlphaFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendEquation(alphaOperation) == GL_INVALID_ENUM) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
if (colorOperation != alphaOperation) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
SDL_FORCE_INLINE int
|
||||
power_of_2(int input)
|
||||
{
|
||||
@@ -684,12 +752,12 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||
if (texture->format == SDL_PIXELFORMAT_YV12 ||
|
||||
texture->format == SDL_PIXELFORMAT_IYUV) {
|
||||
/* Need to add size for the U and V planes */
|
||||
size += (2 * (texture->h * data->pitch) / 4);
|
||||
size += 2 * ((texture->h + 1) / 2) * ((data->pitch + 1) / 2);
|
||||
}
|
||||
if (texture->format == SDL_PIXELFORMAT_NV12 ||
|
||||
texture->format == SDL_PIXELFORMAT_NV21) {
|
||||
/* Need to add size for the U/V plane */
|
||||
size += ((texture->h * data->pitch) / 2);
|
||||
size += 2 * ((texture->h + 1) / 2) * ((data->pitch + 1) / 2);
|
||||
}
|
||||
data->pixels = SDL_calloc(1, size);
|
||||
if (!data->pixels) {
|
||||
@@ -807,8 +875,8 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||
GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T,
|
||||
GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,
|
||||
texture_h/2, 0, format, type, NULL);
|
||||
renderdata->glTexImage2D(data->type, 0, internalFormat, (texture_w+1)/2,
|
||||
(texture_h+1)/2, 0, format, type, NULL);
|
||||
|
||||
renderdata->glBindTexture(data->type, data->vtexture);
|
||||
renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER,
|
||||
@@ -819,8 +887,8 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||
GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T,
|
||||
GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,
|
||||
texture_h/2, 0, format, type, NULL);
|
||||
renderdata->glTexImage2D(data->type, 0, internalFormat, (texture_w+1)/2,
|
||||
(texture_h+1)/2, 0, format, type, NULL);
|
||||
|
||||
renderdata->glDisable(data->type);
|
||||
}
|
||||
@@ -841,8 +909,8 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||
GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T,
|
||||
GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexImage2D(data->type, 0, GL_LUMINANCE_ALPHA, texture_w/2,
|
||||
texture_h/2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
||||
renderdata->glTexImage2D(data->type, 0, GL_LUMINANCE_ALPHA, (texture_w+1)/2,
|
||||
(texture_h+1)/2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
||||
renderdata->glDisable(data->type);
|
||||
}
|
||||
|
||||
@@ -869,7 +937,7 @@ GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
rect->h, data->format, data->formattype,
|
||||
pixels);
|
||||
if (data->yuv) {
|
||||
renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, (pitch / 2));
|
||||
renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, ((pitch + 1) / 2));
|
||||
|
||||
/* Skip to the correct offset into the next texture */
|
||||
pixels = (const void*)((const Uint8*)pixels + rect->h * pitch);
|
||||
@@ -879,29 +947,29 @@ GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
renderdata->glBindTexture(data->type, data->utexture);
|
||||
}
|
||||
renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,
|
||||
rect->w/2, rect->h/2,
|
||||
(rect->w+1)/2, (rect->h+1)/2,
|
||||
data->format, data->formattype, pixels);
|
||||
|
||||
/* Skip to the correct offset into the next texture */
|
||||
pixels = (const void*)((const Uint8*)pixels + (rect->h * pitch)/4);
|
||||
pixels = (const void*)((const Uint8*)pixels + ((rect->h + 1) / 2) * ((pitch + 1) / 2));
|
||||
if (texture->format == SDL_PIXELFORMAT_YV12) {
|
||||
renderdata->glBindTexture(data->type, data->utexture);
|
||||
} else {
|
||||
renderdata->glBindTexture(data->type, data->vtexture);
|
||||
}
|
||||
renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,
|
||||
rect->w/2, rect->h/2,
|
||||
(rect->w+1)/2, (rect->h+1)/2,
|
||||
data->format, data->formattype, pixels);
|
||||
}
|
||||
|
||||
if (data->nv12) {
|
||||
renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, (pitch / 2));
|
||||
renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, ((pitch + 1) / 2));
|
||||
|
||||
/* Skip to the correct offset into the next texture */
|
||||
pixels = (const void*)((const Uint8*)pixels + rect->h * pitch);
|
||||
renderdata->glBindTexture(data->type, data->utexture);
|
||||
renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,
|
||||
rect->w/2, rect->h/2,
|
||||
(rect->w + 1)/2, (rect->h + 1)/2,
|
||||
GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, pixels);
|
||||
}
|
||||
renderdata->glDisable(data->type);
|
||||
@@ -932,13 +1000,13 @@ GL_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Upitch);
|
||||
renderdata->glBindTexture(data->type, data->utexture);
|
||||
renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,
|
||||
rect->w/2, rect->h/2,
|
||||
(rect->w + 1)/2, (rect->h + 1)/2,
|
||||
data->format, data->formattype, Uplane);
|
||||
|
||||
renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Vpitch);
|
||||
renderdata->glBindTexture(data->type, data->vtexture);
|
||||
renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,
|
||||
rect->w/2, rect->h/2,
|
||||
(rect->w + 1)/2, (rect->h + 1)/2,
|
||||
data->format, data->formattype, Vplane);
|
||||
renderdata->glDisable(data->type);
|
||||
|
||||
@@ -1041,6 +1109,8 @@ GL_UpdateViewport(SDL_Renderer * renderer)
|
||||
0.0, 1.0);
|
||||
}
|
||||
}
|
||||
data->glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
return GL_CheckError("", renderer);
|
||||
}
|
||||
|
||||
@@ -1090,25 +1160,18 @@ GL_SetColor(GL_RenderData * data, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
|
||||
}
|
||||
|
||||
static void
|
||||
GL_SetBlendMode(GL_RenderData * data, int blendMode)
|
||||
GL_SetBlendMode(GL_RenderData * data, SDL_BlendMode blendMode)
|
||||
{
|
||||
if (blendMode != data->current.blendMode) {
|
||||
switch (blendMode) {
|
||||
case SDL_BLENDMODE_NONE:
|
||||
if (blendMode == SDL_BLENDMODE_NONE) {
|
||||
data->glDisable(GL_BLEND);
|
||||
break;
|
||||
case SDL_BLENDMODE_BLEND:
|
||||
} else {
|
||||
data->glEnable(GL_BLEND);
|
||||
data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
break;
|
||||
case SDL_BLENDMODE_ADD:
|
||||
data->glEnable(GL_BLEND);
|
||||
data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE);
|
||||
break;
|
||||
case SDL_BLENDMODE_MOD:
|
||||
data->glEnable(GL_BLEND);
|
||||
data->glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE);
|
||||
break;
|
||||
data->glBlendFuncSeparate(GetBlendFunc(SDL_GetBlendModeSrcColorFactor(blendMode)),
|
||||
GetBlendFunc(SDL_GetBlendModeDstColorFactor(blendMode)),
|
||||
GetBlendFunc(SDL_GetBlendModeSrcAlphaFactor(blendMode)),
|
||||
GetBlendFunc(SDL_GetBlendModeDstAlphaFactor(blendMode)));
|
||||
data->glBlendEquation(GetBlendEquation(SDL_GetBlendModeColorOperation(blendMode)));
|
||||
}
|
||||
data->current.blendMode = blendMode;
|
||||
}
|
||||
@@ -1430,18 +1493,21 @@ GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
|
||||
|
||||
GL_ActivateRenderer(renderer);
|
||||
|
||||
if (!convert_format(data, temp_format, &internalFormat, &format, &type)) {
|
||||
return SDL_SetError("Texture format %s not supported by OpenGL",
|
||||
SDL_GetPixelFormatName(temp_format));
|
||||
}
|
||||
|
||||
if (!rect->w || !rect->h) {
|
||||
return 0; /* nothing to do. */
|
||||
}
|
||||
|
||||
temp_pitch = rect->w * SDL_BYTESPERPIXEL(temp_format);
|
||||
temp_pixels = SDL_malloc(rect->h * temp_pitch);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
|
||||
if (!convert_format(data, temp_format, &internalFormat, &format, &type)) {
|
||||
SDL_free(temp_pixels);
|
||||
return SDL_SetError("Texture format %s not supported by OpenGL",
|
||||
SDL_GetPixelFormatName(temp_format));
|
||||
}
|
||||
|
||||
SDL_GetRendererOutputSize(renderer, &w, &h);
|
||||
|
||||
data->glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||
@@ -1518,6 +1584,11 @@ GL_DestroyRenderer(SDL_Renderer * renderer)
|
||||
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
|
||||
|
||||
if (data) {
|
||||
if (data->context != NULL) {
|
||||
/* make sure we delete the right resources! */
|
||||
GL_ActivateRenderer(renderer);
|
||||
}
|
||||
|
||||
GL_ClearErrors(renderer);
|
||||
if (data->GL_ARB_debug_output_supported) {
|
||||
PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC) SDL_GL_GetProcAddress("glDebugMessageCallbackARB");
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -369,7 +369,7 @@ DestroyShaderProgram(GL_ShaderContext *ctx, GL_ShaderData *data)
|
||||
}
|
||||
|
||||
GL_ShaderContext *
|
||||
GL_CreateShaderContext()
|
||||
GL_CreateShaderContext(void)
|
||||
{
|
||||
GL_ShaderContext *ctx;
|
||||
SDL_bool shaders_supported;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -34,7 +34,7 @@ typedef enum {
|
||||
|
||||
typedef struct GL_ShaderContext GL_ShaderContext;
|
||||
|
||||
extern GL_ShaderContext * GL_CreateShaderContext();
|
||||
extern GL_ShaderContext * GL_CreateShaderContext(void);
|
||||
extern void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader);
|
||||
extern void GL_DestroyShaderContext(GL_ShaderContext *ctx);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -21,6 +21,8 @@
|
||||
|
||||
SDL_PROC(void, glBindTexture, (GLenum, GLuint))
|
||||
SDL_PROC(void, glBlendFunc, (GLenum, GLenum))
|
||||
SDL_PROC_OES(void, glBlendEquationOES, (GLenum))
|
||||
SDL_PROC_OES(void, glBlendEquationSeparateOES, (GLenum, GLenum))
|
||||
SDL_PROC_OES(void, glBlendFuncSeparateOES, (GLenum, GLenum, GLenum, GLenum))
|
||||
SDL_PROC(void, glClear, (GLbitfield))
|
||||
SDL_PROC(void, glClearColor, (GLclampf, GLclampf, GLclampf, GLclampf))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -56,6 +56,7 @@ static SDL_Renderer *GLES_CreateRenderer(SDL_Window * window, Uint32 flags);
|
||||
static void GLES_WindowEvent(SDL_Renderer * renderer,
|
||||
const SDL_WindowEvent *event);
|
||||
static int GLES_GetOutputSize(SDL_Renderer * renderer, int *w, int *h);
|
||||
static SDL_bool GLES_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode);
|
||||
static int GLES_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
||||
static int GLES_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
const SDL_Rect * rect, const void *pixels,
|
||||
@@ -116,7 +117,7 @@ typedef struct
|
||||
SDL_GLContext context;
|
||||
struct {
|
||||
Uint32 color;
|
||||
int blendMode;
|
||||
SDL_BlendMode blendMode;
|
||||
SDL_bool tex_coords;
|
||||
} current;
|
||||
|
||||
@@ -130,6 +131,8 @@ typedef struct
|
||||
GLuint window_framebuffer;
|
||||
|
||||
SDL_bool GL_OES_blend_func_separate_supported;
|
||||
SDL_bool GL_OES_blend_equation_separate_supported;
|
||||
SDL_bool GL_OES_blend_subtract_supported;
|
||||
} GLES_RenderData;
|
||||
|
||||
typedef struct
|
||||
@@ -197,7 +200,7 @@ static int GLES_LoadFunctions(GLES_RenderData * data)
|
||||
do { \
|
||||
data->func = SDL_GL_GetProcAddress(#func); \
|
||||
if ( ! data->func ) { \
|
||||
return SDL_SetError("Couldn't load GLES function %s: %s\n", #func, SDL_GetError()); \
|
||||
return SDL_SetError("Couldn't load GLES function %s: %s", #func, SDL_GetError()); \
|
||||
} \
|
||||
} while ( 0 );
|
||||
#define SDL_PROC_OES(ret,func,params) \
|
||||
@@ -214,7 +217,7 @@ static int GLES_LoadFunctions(GLES_RenderData * data)
|
||||
|
||||
static SDL_GLContext SDL_CurrentContext = NULL;
|
||||
|
||||
GLES_FBOList *
|
||||
static GLES_FBOList *
|
||||
GLES_GetFBO(GLES_RenderData *data, Uint32 w, Uint32 h)
|
||||
{
|
||||
GLES_FBOList *result = data->framebuffers;
|
||||
@@ -261,8 +264,8 @@ GLES_ResetState(SDL_Renderer *renderer)
|
||||
GLES_ActivateRenderer(renderer);
|
||||
}
|
||||
|
||||
data->current.color = 0;
|
||||
data->current.blendMode = -1;
|
||||
data->current.color = 0xffffffff;
|
||||
data->current.blendMode = SDL_BLENDMODE_INVALID;
|
||||
data->current.tex_coords = SDL_FALSE;
|
||||
|
||||
data->glDisable(GL_DEPTH_TEST);
|
||||
@@ -319,6 +322,7 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||
|
||||
renderer->WindowEvent = GLES_WindowEvent;
|
||||
renderer->GetOutputSize = GLES_GetOutputSize;
|
||||
renderer->SupportsBlendMode = GLES_SupportsBlendMode;
|
||||
renderer->CreateTexture = GLES_CreateTexture;
|
||||
renderer->UpdateTexture = GLES_UpdateTexture;
|
||||
renderer->LockTexture = GLES_LockTexture;
|
||||
@@ -388,6 +392,12 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||
if (SDL_GL_ExtensionSupported("GL_OES_blend_func_separate")) {
|
||||
data->GL_OES_blend_func_separate_supported = SDL_TRUE;
|
||||
}
|
||||
if (SDL_GL_ExtensionSupported("GL_OES_blend_equation_separate")) {
|
||||
data->GL_OES_blend_equation_separate_supported = SDL_TRUE;
|
||||
}
|
||||
if (SDL_GL_ExtensionSupported("GL_OES_blend_subtract")) {
|
||||
data->GL_OES_blend_subtract_supported = SDL_TRUE;
|
||||
}
|
||||
|
||||
/* Set up parameters for rendering */
|
||||
GLES_ResetState(renderer);
|
||||
@@ -430,6 +440,79 @@ GLES_GetOutputSize(SDL_Renderer * renderer, int *w, int *h)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static GLenum GetBlendFunc(SDL_BlendFactor factor)
|
||||
{
|
||||
switch (factor) {
|
||||
case SDL_BLENDFACTOR_ZERO:
|
||||
return GL_ZERO;
|
||||
case SDL_BLENDFACTOR_ONE:
|
||||
return GL_ONE;
|
||||
case SDL_BLENDFACTOR_SRC_COLOR:
|
||||
return GL_SRC_COLOR;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
|
||||
return GL_ONE_MINUS_SRC_COLOR;
|
||||
case SDL_BLENDFACTOR_SRC_ALPHA:
|
||||
return GL_SRC_ALPHA;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
|
||||
return GL_ONE_MINUS_SRC_ALPHA;
|
||||
case SDL_BLENDFACTOR_DST_COLOR:
|
||||
return GL_DST_COLOR;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
|
||||
return GL_ONE_MINUS_DST_COLOR;
|
||||
case SDL_BLENDFACTOR_DST_ALPHA:
|
||||
return GL_DST_ALPHA;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
|
||||
return GL_ONE_MINUS_DST_ALPHA;
|
||||
default:
|
||||
return GL_INVALID_ENUM;
|
||||
}
|
||||
}
|
||||
|
||||
static GLenum GetBlendEquation(SDL_BlendOperation operation)
|
||||
{
|
||||
switch (operation) {
|
||||
case SDL_BLENDOPERATION_ADD:
|
||||
return GL_FUNC_ADD_OES;
|
||||
case SDL_BLENDOPERATION_SUBTRACT:
|
||||
return GL_FUNC_SUBTRACT_OES;
|
||||
case SDL_BLENDOPERATION_REV_SUBTRACT:
|
||||
return GL_FUNC_REVERSE_SUBTRACT_OES;
|
||||
default:
|
||||
return GL_INVALID_ENUM;
|
||||
}
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
GLES_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
|
||||
{
|
||||
GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;
|
||||
SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
|
||||
SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
|
||||
SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
|
||||
SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
|
||||
SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
|
||||
SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
|
||||
|
||||
if (GetBlendFunc(srcColorFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendFunc(srcAlphaFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendEquation(colorOperation) == GL_INVALID_ENUM ||
|
||||
GetBlendFunc(dstColorFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendFunc(dstAlphaFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendEquation(alphaOperation) == GL_INVALID_ENUM) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
if ((srcColorFactor != srcAlphaFactor || dstColorFactor != dstAlphaFactor) && !data->GL_OES_blend_func_separate_supported) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
if (colorOperation != alphaOperation && !data->GL_OES_blend_equation_separate_supported) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
if (colorOperation != SDL_BLENDOPERATION_ADD && !data->GL_OES_blend_subtract_supported) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
static SDL_INLINE int
|
||||
power_of_2(int input)
|
||||
{
|
||||
@@ -633,8 +716,6 @@ GLES_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||
GLES_TextureData *texturedata = NULL;
|
||||
GLenum status;
|
||||
|
||||
GLES_ActivateRenderer(renderer);
|
||||
|
||||
if (!data->GL_OES_framebuffer_object_supported) {
|
||||
return SDL_SetError("Can't enable render target support in this renderer");
|
||||
}
|
||||
@@ -694,6 +775,8 @@ GLES_UpdateViewport(SDL_Renderer * renderer)
|
||||
0.0, 1.0);
|
||||
}
|
||||
}
|
||||
data->glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -739,37 +822,28 @@ GLES_SetColor(GLES_RenderData * data, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
|
||||
}
|
||||
|
||||
static void
|
||||
GLES_SetBlendMode(GLES_RenderData * data, int blendMode)
|
||||
GLES_SetBlendMode(GLES_RenderData * data, SDL_BlendMode blendMode)
|
||||
{
|
||||
if (blendMode != data->current.blendMode) {
|
||||
switch (blendMode) {
|
||||
case SDL_BLENDMODE_NONE:
|
||||
if (blendMode == SDL_BLENDMODE_NONE) {
|
||||
data->glDisable(GL_BLEND);
|
||||
break;
|
||||
case SDL_BLENDMODE_BLEND:
|
||||
} else {
|
||||
data->glEnable(GL_BLEND);
|
||||
if (data->GL_OES_blend_func_separate_supported) {
|
||||
data->glBlendFuncSeparateOES(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
data->glBlendFuncSeparateOES(GetBlendFunc(SDL_GetBlendModeSrcColorFactor(blendMode)),
|
||||
GetBlendFunc(SDL_GetBlendModeDstColorFactor(blendMode)),
|
||||
GetBlendFunc(SDL_GetBlendModeSrcAlphaFactor(blendMode)),
|
||||
GetBlendFunc(SDL_GetBlendModeDstAlphaFactor(blendMode)));
|
||||
} else {
|
||||
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
data->glBlendFunc(GetBlendFunc(SDL_GetBlendModeSrcColorFactor(blendMode)),
|
||||
GetBlendFunc(SDL_GetBlendModeDstColorFactor(blendMode)));
|
||||
}
|
||||
break;
|
||||
case SDL_BLENDMODE_ADD:
|
||||
data->glEnable(GL_BLEND);
|
||||
if (data->GL_OES_blend_func_separate_supported) {
|
||||
data->glBlendFuncSeparateOES(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE);
|
||||
} else {
|
||||
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
||||
if (data->GL_OES_blend_equation_separate_supported) {
|
||||
data->glBlendEquationSeparateOES(GetBlendEquation(SDL_GetBlendModeColorOperation(blendMode)),
|
||||
GetBlendEquation(SDL_GetBlendModeAlphaOperation(blendMode)));
|
||||
} else if (data->GL_OES_blend_subtract_supported) {
|
||||
data->glBlendEquationOES(GetBlendEquation(SDL_GetBlendModeColorOperation(blendMode)));
|
||||
}
|
||||
break;
|
||||
case SDL_BLENDMODE_MOD:
|
||||
data->glEnable(GL_BLEND);
|
||||
if (data->GL_OES_blend_func_separate_supported) {
|
||||
data->glBlendFuncSeparateOES(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE);
|
||||
} else {
|
||||
data->glBlendFunc(GL_ZERO, GL_SRC_COLOR);
|
||||
}
|
||||
break;
|
||||
}
|
||||
data->current.blendMode = blendMode;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -23,6 +23,7 @@ SDL_PROC(void, glActiveTexture, (GLenum))
|
||||
SDL_PROC(void, glAttachShader, (GLuint, GLuint))
|
||||
SDL_PROC(void, glBindAttribLocation, (GLuint, GLuint, const char *))
|
||||
SDL_PROC(void, glBindTexture, (GLenum, GLuint))
|
||||
SDL_PROC(void, glBlendEquationSeparate, (GLenum, GLenum))
|
||||
SDL_PROC(void, glBlendFuncSeparate, (GLenum, GLenum, GLenum, GLenum))
|
||||
SDL_PROC(void, glClear, (GLbitfield))
|
||||
SDL_PROC(void, glClearColor, (GLclampf, GLclampf, GLclampf, GLclampf))
|
||||
@@ -53,7 +54,11 @@ SDL_PROC(void, glPixelStorei, (GLenum, GLint))
|
||||
SDL_PROC(void, glReadPixels, (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid*))
|
||||
SDL_PROC(void, glScissor, (GLint, GLint, GLsizei, GLsizei))
|
||||
SDL_PROC(void, glShaderBinary, (GLsizei, const GLuint *, GLenum, const void *, GLsizei))
|
||||
#if __NACL__ || __ANDROID__
|
||||
SDL_PROC(void, glShaderSource, (GLuint, GLsizei, const GLchar **, const GLint *))
|
||||
#else
|
||||
SDL_PROC(void, glShaderSource, (GLuint, GLsizei, const GLchar* const*, const GLint *))
|
||||
#endif
|
||||
SDL_PROC(void, glTexImage2D, (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *))
|
||||
SDL_PROC(void, glTexParameteri, (GLenum, GLenum, GLint))
|
||||
SDL_PROC(void, glTexSubImage2D, (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -122,7 +122,6 @@ typedef struct GLES2_ShaderCache
|
||||
typedef struct GLES2_ProgramCacheEntry
|
||||
{
|
||||
GLuint id;
|
||||
SDL_BlendMode blend_mode;
|
||||
GLES2_ShaderCacheEntry *vertex_shader;
|
||||
GLES2_ShaderCacheEntry *fragment_shader;
|
||||
GLuint uniform_locations[16];
|
||||
@@ -177,7 +176,7 @@ typedef struct GLES2_DriverContext
|
||||
SDL_bool debug_enabled;
|
||||
|
||||
struct {
|
||||
int blendMode;
|
||||
SDL_BlendMode blendMode;
|
||||
SDL_bool tex_coords;
|
||||
} current;
|
||||
|
||||
@@ -259,7 +258,7 @@ GL_CheckAllErrors (const char *prefix, SDL_Renderer *renderer, const char *file,
|
||||
|
||||
#if 0
|
||||
#define GL_CheckError(prefix, renderer)
|
||||
#elif defined(_MSC_VER)
|
||||
#elif defined(_MSC_VER) || defined(__WATCOMC__)
|
||||
#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __FUNCTION__)
|
||||
#else
|
||||
#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __PRETTY_FUNCTION__)
|
||||
@@ -297,7 +296,7 @@ static int GLES2_LoadFunctions(GLES2_DriverContext * data)
|
||||
do { \
|
||||
data->func = SDL_GL_GetProcAddress(#func); \
|
||||
if ( ! data->func ) { \
|
||||
return SDL_SetError("Couldn't load GLES2 function %s: %s\n", #func, SDL_GetError()); \
|
||||
return SDL_SetError("Couldn't load GLES2 function %s: %s", #func, SDL_GetError()); \
|
||||
} \
|
||||
} while ( 0 );
|
||||
#endif /* __SDL_NOGETPROCADDR__ */
|
||||
@@ -307,7 +306,7 @@ static int GLES2_LoadFunctions(GLES2_DriverContext * data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
GLES2_FBOList *
|
||||
static GLES2_FBOList *
|
||||
GLES2_GetFBO(GLES2_DriverContext *data, Uint32 w, Uint32 h)
|
||||
{
|
||||
GLES2_FBOList *result = data->framebuffers;
|
||||
@@ -372,6 +371,69 @@ GLES2_GetOutputSize(SDL_Renderer * renderer, int *w, int *h)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static GLenum GetBlendFunc(SDL_BlendFactor factor)
|
||||
{
|
||||
switch (factor) {
|
||||
case SDL_BLENDFACTOR_ZERO:
|
||||
return GL_ZERO;
|
||||
case SDL_BLENDFACTOR_ONE:
|
||||
return GL_ONE;
|
||||
case SDL_BLENDFACTOR_SRC_COLOR:
|
||||
return GL_SRC_COLOR;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
|
||||
return GL_ONE_MINUS_SRC_COLOR;
|
||||
case SDL_BLENDFACTOR_SRC_ALPHA:
|
||||
return GL_SRC_ALPHA;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
|
||||
return GL_ONE_MINUS_SRC_ALPHA;
|
||||
case SDL_BLENDFACTOR_DST_COLOR:
|
||||
return GL_DST_COLOR;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
|
||||
return GL_ONE_MINUS_DST_COLOR;
|
||||
case SDL_BLENDFACTOR_DST_ALPHA:
|
||||
return GL_DST_ALPHA;
|
||||
case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
|
||||
return GL_ONE_MINUS_DST_ALPHA;
|
||||
default:
|
||||
return GL_INVALID_ENUM;
|
||||
}
|
||||
}
|
||||
|
||||
static GLenum GetBlendEquation(SDL_BlendOperation operation)
|
||||
{
|
||||
switch (operation) {
|
||||
case SDL_BLENDOPERATION_ADD:
|
||||
return GL_FUNC_ADD;
|
||||
case SDL_BLENDOPERATION_SUBTRACT:
|
||||
return GL_FUNC_SUBTRACT;
|
||||
case SDL_BLENDOPERATION_REV_SUBTRACT:
|
||||
return GL_FUNC_REVERSE_SUBTRACT;
|
||||
default:
|
||||
return GL_INVALID_ENUM;
|
||||
}
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
GLES2_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
|
||||
{
|
||||
SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
|
||||
SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
|
||||
SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
|
||||
SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
|
||||
SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
|
||||
SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
|
||||
|
||||
if (GetBlendFunc(srcColorFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendFunc(srcAlphaFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendEquation(colorOperation) == GL_INVALID_ENUM ||
|
||||
GetBlendFunc(dstColorFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendFunc(dstAlphaFactor) == GL_INVALID_ENUM ||
|
||||
GetBlendEquation(alphaOperation) == GL_INVALID_ENUM) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
static int
|
||||
GLES2_UpdateViewport(SDL_Renderer * renderer)
|
||||
{
|
||||
@@ -557,11 +619,11 @@ GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
size = texture->h * data->pitch;
|
||||
if (data->yuv) {
|
||||
/* Need to add size for the U and V planes */
|
||||
size += (2 * (texture->h * data->pitch) / 4);
|
||||
size += 2 * ((texture->h + 1) / 2) * ((data->pitch + 1) / 2);
|
||||
}
|
||||
if (data->nv12) {
|
||||
/* Need to add size for the U/V plane */
|
||||
size += ((texture->h * data->pitch) / 2);
|
||||
size += 2 * ((texture->h + 1) / 2) * ((data->pitch + 1) / 2);
|
||||
}
|
||||
data->pixel_data = SDL_calloc(1, size);
|
||||
if (!data->pixel_data) {
|
||||
@@ -584,7 +646,7 @@ GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexImage2D(data->texture_type, 0, format, texture->w / 2, texture->h / 2, 0, format, type, NULL);
|
||||
renderdata->glTexImage2D(data->texture_type, 0, format, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, format, type, NULL);
|
||||
|
||||
renderdata->glGenTextures(1, &data->texture_u);
|
||||
if (GL_CheckError("glGenTexures()", renderer) < 0) {
|
||||
@@ -596,7 +658,7 @@ GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexImage2D(data->texture_type, 0, format, texture->w / 2, texture->h / 2, 0, format, type, NULL);
|
||||
renderdata->glTexImage2D(data->texture_type, 0, format, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, format, type, NULL);
|
||||
if (GL_CheckError("glTexImage2D()", renderer) < 0) {
|
||||
return -1;
|
||||
}
|
||||
@@ -613,7 +675,7 @@ GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
renderdata->glTexImage2D(data->texture_type, 0, GL_LUMINANCE_ALPHA, texture->w / 2, texture->h / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
||||
renderdata->glTexImage2D(data->texture_type, 0, GL_LUMINANCE_ALPHA, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
||||
if (GL_CheckError("glTexImage2D()", renderer) < 0) {
|
||||
return -1;
|
||||
}
|
||||
@@ -713,14 +775,15 @@ GLES2_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect
|
||||
GLES2_TexSubImage2D(data, tdata->texture_type,
|
||||
rect->x / 2,
|
||||
rect->y / 2,
|
||||
rect->w / 2,
|
||||
rect->h / 2,
|
||||
(rect->w + 1) / 2,
|
||||
(rect->h + 1) / 2,
|
||||
tdata->pixel_format,
|
||||
tdata->pixel_type,
|
||||
pixels, pitch / 2, 1);
|
||||
pixels, (pitch + 1) / 2, 1);
|
||||
|
||||
|
||||
/* Skip to the correct offset into the next texture */
|
||||
pixels = (const void*)((const Uint8*)pixels + (rect->h * pitch)/4);
|
||||
pixels = (const void*)((const Uint8*)pixels + ((rect->h + 1) / 2) * ((pitch + 1)/2));
|
||||
if (texture->format == SDL_PIXELFORMAT_YV12) {
|
||||
data->glBindTexture(tdata->texture_type, tdata->texture_u);
|
||||
} else {
|
||||
@@ -729,11 +792,11 @@ GLES2_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect
|
||||
GLES2_TexSubImage2D(data, tdata->texture_type,
|
||||
rect->x / 2,
|
||||
rect->y / 2,
|
||||
rect->w / 2,
|
||||
rect->h / 2,
|
||||
(rect->w + 1) / 2,
|
||||
(rect->h + 1) / 2,
|
||||
tdata->pixel_format,
|
||||
tdata->pixel_type,
|
||||
pixels, pitch / 2, 1);
|
||||
pixels, (pitch + 1) / 2, 1);
|
||||
}
|
||||
|
||||
if (tdata->nv12) {
|
||||
@@ -743,11 +806,11 @@ GLES2_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect
|
||||
GLES2_TexSubImage2D(data, tdata->texture_type,
|
||||
rect->x / 2,
|
||||
rect->y / 2,
|
||||
rect->w / 2,
|
||||
rect->h / 2,
|
||||
(rect->w + 1) / 2,
|
||||
(rect->h + 1) / 2,
|
||||
GL_LUMINANCE_ALPHA,
|
||||
GL_UNSIGNED_BYTE,
|
||||
pixels, pitch, 2);
|
||||
pixels, 2 * ((pitch + 1) / 2), 2);
|
||||
}
|
||||
|
||||
return GL_CheckError("glTexSubImage2D()", renderer);
|
||||
@@ -774,8 +837,8 @@ GLES2_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
GLES2_TexSubImage2D(data, tdata->texture_type,
|
||||
rect->x / 2,
|
||||
rect->y / 2,
|
||||
rect->w / 2,
|
||||
rect->h / 2,
|
||||
(rect->w + 1) / 2,
|
||||
(rect->h + 1) / 2,
|
||||
tdata->pixel_format,
|
||||
tdata->pixel_type,
|
||||
Vplane, Vpitch, 1);
|
||||
@@ -784,8 +847,8 @@ GLES2_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
GLES2_TexSubImage2D(data, tdata->texture_type,
|
||||
rect->x / 2,
|
||||
rect->y / 2,
|
||||
rect->w / 2,
|
||||
rect->h / 2,
|
||||
(rect->w + 1) / 2,
|
||||
(rect->h + 1) / 2,
|
||||
tdata->pixel_format,
|
||||
tdata->pixel_type,
|
||||
Uplane, Upitch, 1);
|
||||
@@ -882,19 +945,16 @@ GLES2_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
* Shader management functions *
|
||||
*************************************************************************************************/
|
||||
|
||||
static GLES2_ShaderCacheEntry *GLES2_CacheShader(SDL_Renderer *renderer, GLES2_ShaderType type,
|
||||
SDL_BlendMode blendMode);
|
||||
static GLES2_ShaderCacheEntry *GLES2_CacheShader(SDL_Renderer *renderer, GLES2_ShaderType type);
|
||||
static void GLES2_EvictShader(SDL_Renderer *renderer, GLES2_ShaderCacheEntry *entry);
|
||||
static GLES2_ProgramCacheEntry *GLES2_CacheProgram(SDL_Renderer *renderer,
|
||||
GLES2_ShaderCacheEntry *vertex,
|
||||
GLES2_ShaderCacheEntry *fragment,
|
||||
SDL_BlendMode blendMode);
|
||||
static int GLES2_SelectProgram(SDL_Renderer *renderer, GLES2_ImageSource source,
|
||||
SDL_BlendMode blendMode);
|
||||
GLES2_ShaderCacheEntry *fragment);
|
||||
static int GLES2_SelectProgram(SDL_Renderer *renderer, GLES2_ImageSource source);
|
||||
|
||||
static GLES2_ProgramCacheEntry *
|
||||
GLES2_CacheProgram(SDL_Renderer *renderer, GLES2_ShaderCacheEntry *vertex,
|
||||
GLES2_ShaderCacheEntry *fragment, SDL_BlendMode blendMode)
|
||||
GLES2_ShaderCacheEntry *fragment)
|
||||
{
|
||||
GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;
|
||||
GLES2_ProgramCacheEntry *entry;
|
||||
@@ -933,7 +993,6 @@ GLES2_CacheProgram(SDL_Renderer *renderer, GLES2_ShaderCacheEntry *vertex,
|
||||
}
|
||||
entry->vertex_shader = vertex;
|
||||
entry->fragment_shader = fragment;
|
||||
entry->blend_mode = blendMode;
|
||||
|
||||
/* Create the program and link it */
|
||||
entry->id = data->glCreateProgram();
|
||||
@@ -1011,7 +1070,7 @@ GLES2_CacheProgram(SDL_Renderer *renderer, GLES2_ShaderCacheEntry *vertex,
|
||||
}
|
||||
|
||||
static GLES2_ShaderCacheEntry *
|
||||
GLES2_CacheShader(SDL_Renderer *renderer, GLES2_ShaderType type, SDL_BlendMode blendMode)
|
||||
GLES2_CacheShader(SDL_Renderer *renderer, GLES2_ShaderType type)
|
||||
{
|
||||
GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;
|
||||
const GLES2_Shader *shader;
|
||||
@@ -1021,7 +1080,7 @@ GLES2_CacheShader(SDL_Renderer *renderer, GLES2_ShaderType type, SDL_BlendMode b
|
||||
int i, j;
|
||||
|
||||
/* Find the corresponding shader */
|
||||
shader = GLES2_GetShader(type, blendMode);
|
||||
shader = GLES2_GetShader(type);
|
||||
if (!shader) {
|
||||
SDL_SetError("No shader matching the requested characteristics was found");
|
||||
return NULL;
|
||||
@@ -1068,7 +1127,7 @@ GLES2_CacheShader(SDL_Renderer *renderer, GLES2_ShaderType type, SDL_BlendMode b
|
||||
/* Compile or load the selected shader instance */
|
||||
entry->id = data->glCreateShader(instance->type);
|
||||
if (instance->format == (GLenum)-1) {
|
||||
data->glShaderSource(entry->id, 1, (const char **)&instance->data, NULL);
|
||||
data->glShaderSource(entry->id, 1, (const char **)(char *)&instance->data, NULL);
|
||||
data->glCompileShader(entry->id);
|
||||
data->glGetShaderiv(entry->id, GL_COMPILE_STATUS, &compileSuccessful);
|
||||
} else {
|
||||
@@ -1130,7 +1189,7 @@ GLES2_EvictShader(SDL_Renderer *renderer, GLES2_ShaderCacheEntry *entry)
|
||||
}
|
||||
|
||||
static int
|
||||
GLES2_SelectProgram(SDL_Renderer *renderer, GLES2_ImageSource source, SDL_BlendMode blendMode)
|
||||
GLES2_SelectProgram(SDL_Renderer *renderer, GLES2_ImageSource source)
|
||||
{
|
||||
GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;
|
||||
GLES2_ShaderCacheEntry *vertex = NULL;
|
||||
@@ -1170,11 +1229,11 @@ GLES2_SelectProgram(SDL_Renderer *renderer, GLES2_ImageSource source, SDL_BlendM
|
||||
}
|
||||
|
||||
/* Load the requested shaders */
|
||||
vertex = GLES2_CacheShader(renderer, vtype, blendMode);
|
||||
vertex = GLES2_CacheShader(renderer, vtype);
|
||||
if (!vertex) {
|
||||
goto fault;
|
||||
}
|
||||
fragment = GLES2_CacheShader(renderer, ftype, blendMode);
|
||||
fragment = GLES2_CacheShader(renderer, ftype);
|
||||
if (!fragment) {
|
||||
goto fault;
|
||||
}
|
||||
@@ -1187,7 +1246,7 @@ GLES2_SelectProgram(SDL_Renderer *renderer, GLES2_ImageSource source, SDL_BlendM
|
||||
}
|
||||
|
||||
/* Generate a matching program */
|
||||
program = GLES2_CacheProgram(renderer, vertex, fragment, blendMode);
|
||||
program = GLES2_CacheProgram(renderer, vertex, fragment);
|
||||
if (!program) {
|
||||
goto fault;
|
||||
}
|
||||
@@ -1341,26 +1400,19 @@ GLES2_RenderClear(SDL_Renderer * renderer)
|
||||
}
|
||||
|
||||
static void
|
||||
GLES2_SetBlendMode(GLES2_DriverContext *data, int blendMode)
|
||||
GLES2_SetBlendMode(GLES2_DriverContext *data, SDL_BlendMode blendMode)
|
||||
{
|
||||
if (blendMode != data->current.blendMode) {
|
||||
switch (blendMode) {
|
||||
default:
|
||||
case SDL_BLENDMODE_NONE:
|
||||
if (blendMode == SDL_BLENDMODE_NONE) {
|
||||
data->glDisable(GL_BLEND);
|
||||
break;
|
||||
case SDL_BLENDMODE_BLEND:
|
||||
} else {
|
||||
data->glEnable(GL_BLEND);
|
||||
data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
break;
|
||||
case SDL_BLENDMODE_ADD:
|
||||
data->glEnable(GL_BLEND);
|
||||
data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE);
|
||||
break;
|
||||
case SDL_BLENDMODE_MOD:
|
||||
data->glEnable(GL_BLEND);
|
||||
data->glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE);
|
||||
break;
|
||||
data->glBlendFuncSeparate(GetBlendFunc(SDL_GetBlendModeSrcColorFactor(blendMode)),
|
||||
GetBlendFunc(SDL_GetBlendModeDstColorFactor(blendMode)),
|
||||
GetBlendFunc(SDL_GetBlendModeSrcAlphaFactor(blendMode)),
|
||||
GetBlendFunc(SDL_GetBlendModeDstAlphaFactor(blendMode)));
|
||||
data->glBlendEquationSeparate(GetBlendEquation(SDL_GetBlendModeColorOperation(blendMode)),
|
||||
GetBlendEquation(SDL_GetBlendModeAlphaOperation(blendMode)));
|
||||
}
|
||||
data->current.blendMode = blendMode;
|
||||
}
|
||||
@@ -1383,18 +1435,17 @@ static int
|
||||
GLES2_SetDrawingState(SDL_Renderer * renderer)
|
||||
{
|
||||
GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;
|
||||
const int blendMode = renderer->blendMode;
|
||||
GLES2_ProgramCacheEntry *program;
|
||||
Uint8 r, g, b, a;
|
||||
|
||||
GLES2_ActivateRenderer(renderer);
|
||||
|
||||
GLES2_SetBlendMode(data, blendMode);
|
||||
GLES2_SetBlendMode(data, renderer->blendMode);
|
||||
|
||||
GLES2_SetTexCoords(data, SDL_FALSE);
|
||||
|
||||
/* Activate an appropriate shader and set the projection matrix */
|
||||
if (GLES2_SelectProgram(renderer, GLES2_IMAGESOURCE_SOLID, blendMode) < 0) {
|
||||
if (GLES2_SelectProgram(renderer, GLES2_IMAGESOURCE_SOLID) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1555,12 +1606,10 @@ GLES2_SetupCopy(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;
|
||||
GLES2_TextureData *tdata = (GLES2_TextureData *)texture->driverdata;
|
||||
GLES2_ImageSource sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;
|
||||
SDL_BlendMode blendMode;
|
||||
GLES2_ProgramCacheEntry *program;
|
||||
Uint8 r, g, b, a;
|
||||
|
||||
/* Activate an appropriate shader and set the projection matrix */
|
||||
blendMode = texture->blendMode;
|
||||
if (renderer->target) {
|
||||
/* Check if we need to do color mapping between the source and render target textures */
|
||||
if (renderer->target->format != texture->format) {
|
||||
@@ -1658,7 +1707,7 @@ GLES2_SetupCopy(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
}
|
||||
}
|
||||
|
||||
if (GLES2_SelectProgram(renderer, sourceType, blendMode) < 0) {
|
||||
if (GLES2_SelectProgram(renderer, sourceType) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1705,7 +1754,7 @@ GLES2_SetupCopy(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
}
|
||||
|
||||
/* Configure texture blending */
|
||||
GLES2_SetBlendMode(data, blendMode);
|
||||
GLES2_SetBlendMode(data, texture->blendMode);
|
||||
|
||||
GLES2_SetTexCoords(data, SDL_TRUE);
|
||||
return 0;
|
||||
@@ -1923,7 +1972,9 @@ static int GLES2_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture)
|
||||
* Renderer instantiation *
|
||||
*************************************************************************************************/
|
||||
|
||||
#ifdef ZUNE_HD
|
||||
#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B
|
||||
#endif
|
||||
|
||||
static void
|
||||
GLES2_ResetState(SDL_Renderer *renderer)
|
||||
@@ -1936,7 +1987,7 @@ GLES2_ResetState(SDL_Renderer *renderer)
|
||||
GLES2_ActivateRenderer(renderer);
|
||||
}
|
||||
|
||||
data->current.blendMode = -1;
|
||||
data->current.blendMode = SDL_BLENDMODE_INVALID;
|
||||
data->current.tex_coords = SDL_FALSE;
|
||||
|
||||
data->glActiveTexture(GL_TEXTURE0);
|
||||
@@ -1963,7 +2014,7 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags)
|
||||
#ifndef ZUNE_HD
|
||||
GLboolean hasCompiler;
|
||||
#endif
|
||||
Uint32 window_flags;
|
||||
Uint32 window_flags = 0; /* -Wconditional-uninitialized */
|
||||
GLint window_framebuffer;
|
||||
GLint value;
|
||||
int profile_mask = 0, major = 0, minor = 0;
|
||||
@@ -1980,8 +2031,9 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags)
|
||||
}
|
||||
|
||||
window_flags = SDL_GetWindowFlags(window);
|
||||
/* OpenGL ES 3.0 is a superset of OpenGL ES 2.0 */
|
||||
if (!(window_flags & SDL_WINDOW_OPENGL) ||
|
||||
profile_mask != SDL_GL_CONTEXT_PROFILE_ES || major != RENDERER_CONTEXT_MAJOR || minor != RENDERER_CONTEXT_MINOR) {
|
||||
profile_mask != SDL_GL_CONTEXT_PROFILE_ES || major < RENDERER_CONTEXT_MAJOR) {
|
||||
|
||||
changed_window = SDL_TRUE;
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
|
||||
@@ -2089,28 +2141,29 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags)
|
||||
data->window_framebuffer = (GLuint)window_framebuffer;
|
||||
|
||||
/* Populate the function pointers for the module */
|
||||
renderer->WindowEvent = &GLES2_WindowEvent;
|
||||
renderer->GetOutputSize = &GLES2_GetOutputSize;
|
||||
renderer->CreateTexture = &GLES2_CreateTexture;
|
||||
renderer->UpdateTexture = &GLES2_UpdateTexture;
|
||||
renderer->UpdateTextureYUV = &GLES2_UpdateTextureYUV;
|
||||
renderer->LockTexture = &GLES2_LockTexture;
|
||||
renderer->UnlockTexture = &GLES2_UnlockTexture;
|
||||
renderer->SetRenderTarget = &GLES2_SetRenderTarget;
|
||||
renderer->UpdateViewport = &GLES2_UpdateViewport;
|
||||
renderer->UpdateClipRect = &GLES2_UpdateClipRect;
|
||||
renderer->RenderClear = &GLES2_RenderClear;
|
||||
renderer->RenderDrawPoints = &GLES2_RenderDrawPoints;
|
||||
renderer->RenderDrawLines = &GLES2_RenderDrawLines;
|
||||
renderer->RenderFillRects = &GLES2_RenderFillRects;
|
||||
renderer->RenderCopy = &GLES2_RenderCopy;
|
||||
renderer->RenderCopyEx = &GLES2_RenderCopyEx;
|
||||
renderer->RenderReadPixels = &GLES2_RenderReadPixels;
|
||||
renderer->RenderPresent = &GLES2_RenderPresent;
|
||||
renderer->DestroyTexture = &GLES2_DestroyTexture;
|
||||
renderer->DestroyRenderer = &GLES2_DestroyRenderer;
|
||||
renderer->GL_BindTexture = &GLES2_BindTexture;
|
||||
renderer->GL_UnbindTexture = &GLES2_UnbindTexture;
|
||||
renderer->WindowEvent = GLES2_WindowEvent;
|
||||
renderer->GetOutputSize = GLES2_GetOutputSize;
|
||||
renderer->SupportsBlendMode = GLES2_SupportsBlendMode;
|
||||
renderer->CreateTexture = GLES2_CreateTexture;
|
||||
renderer->UpdateTexture = GLES2_UpdateTexture;
|
||||
renderer->UpdateTextureYUV = GLES2_UpdateTextureYUV;
|
||||
renderer->LockTexture = GLES2_LockTexture;
|
||||
renderer->UnlockTexture = GLES2_UnlockTexture;
|
||||
renderer->SetRenderTarget = GLES2_SetRenderTarget;
|
||||
renderer->UpdateViewport = GLES2_UpdateViewport;
|
||||
renderer->UpdateClipRect = GLES2_UpdateClipRect;
|
||||
renderer->RenderClear = GLES2_RenderClear;
|
||||
renderer->RenderDrawPoints = GLES2_RenderDrawPoints;
|
||||
renderer->RenderDrawLines = GLES2_RenderDrawLines;
|
||||
renderer->RenderFillRects = GLES2_RenderFillRects;
|
||||
renderer->RenderCopy = GLES2_RenderCopy;
|
||||
renderer->RenderCopyEx = GLES2_RenderCopyEx;
|
||||
renderer->RenderReadPixels = GLES2_RenderReadPixels;
|
||||
renderer->RenderPresent = GLES2_RenderPresent;
|
||||
renderer->DestroyTexture = GLES2_DestroyTexture;
|
||||
renderer->DestroyRenderer = GLES2_DestroyRenderer;
|
||||
renderer->GL_BindTexture = GLES2_BindTexture;
|
||||
renderer->GL_UnbindTexture = GLES2_UnbindTexture;
|
||||
|
||||
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_YV12;
|
||||
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_IYUV;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -258,524 +258,46 @@ static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21Src = {
|
||||
};
|
||||
|
||||
|
||||
/*************************************************************************************************
|
||||
* Vertex/fragment shader binaries (NVIDIA Tegra 1/2) *
|
||||
*************************************************************************************************/
|
||||
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
|
||||
#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B
|
||||
|
||||
static const Uint8 GLES2_VertexTegra_Default_[] = {
|
||||
243, 193, 1, 142, 31, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,
|
||||
0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 85, 0, 0, 0, 2, 0, 0, 0, 24, 0, 0, 0, 3, 0, 0, 0,
|
||||
91, 0, 0, 0, 1, 0, 0, 0, 16, 0, 0, 0, 5, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 95, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0,
|
||||
13, 0, 0, 0, 102, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 16, 0, 0, 0, 104, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 17, 0, 0, 0, 112, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 112, 0, 0, 0, 80, 0, 0, 0, 80, 0, 0, 0, 19, 0, 0, 0, 132, 0,
|
||||
0, 0, 104, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97,
|
||||
95, 112, 111, 115, 105, 116, 105, 111, 110, 0, 97, 95, 116, 101, 120, 67, 111, 111, 114, 100,
|
||||
0, 118, 95, 116, 101, 120, 67, 111, 111, 114, 100, 0, 117, 95, 112, 114, 111, 106, 101, 99,
|
||||
116, 105, 111, 110, 0, 0, 0, 0, 0, 0, 0, 82, 139, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 80, 139, 0,
|
||||
0, 1, 0, 0, 0, 22, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 33, 0, 0, 0, 92, 139, 0, 0,
|
||||
1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 240, 0, 0, 0, 0, 0, 0, 1, 0,
|
||||
0, 0, 64, 0, 0, 0, 80, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 193, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 66, 24, 0, 6, 34, 108, 28,
|
||||
0, 0, 42, 16, 128, 0, 195, 192, 6, 129, 252, 255, 65, 96, 108, 28, 0, 0, 0, 0, 0, 1, 195, 192,
|
||||
6, 1, 252, 255, 33, 96, 108, 156, 31, 64, 8, 1, 64, 0, 131, 192, 6, 1, 156, 159, 65, 96, 108,
|
||||
28, 0, 0, 85, 32, 0, 1, 195, 192, 6, 1, 252, 255, 33, 96, 108, 156, 31, 64, 0, 64, 64, 0, 131,
|
||||
192, 134, 1, 152, 31, 65, 96, 108, 156, 31, 64, 127, 48, 0, 1, 195, 192, 6, 129, 129, 255, 33,
|
||||
96
|
||||
};
|
||||
|
||||
static const Uint8 GLES2_FragmentTegra_None_SolidSrc_[] = {
|
||||
155, 191, 159, 1, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,
|
||||
0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 75,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
|
||||
75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 13, 0,
|
||||
0, 0, 82, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
22, 0, 0, 0, 84, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 4,
|
||||
0, 0, 0, 15, 0, 0, 0, 93, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 113, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 113, 0, 0,
|
||||
0, 108, 0, 0, 0, 108, 0, 0, 0, 20, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0,
|
||||
0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 117, 95, 99, 111, 108, 111, 114, 0, 0, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 240, 0, 0,
|
||||
0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 21, 32, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 20, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 82, 50, 48, 45, 66, 73, 78, 1,
|
||||
0, 0, 0, 1, 0, 0, 0, 1, 0, 65, 37, 0, 0, 0, 0, 1, 0, 0, 21, 0, 0, 0, 0, 1, 0, 1, 38, 0, 0, 0,
|
||||
0, 1, 0, 1, 39, 0, 0, 0, 0, 1, 0, 1, 40, 1, 0, 0, 0, 8, 0, 4, 40, 0, 40, 0, 0, 0, 242, 65, 63,
|
||||
192, 200, 0, 0, 0, 242, 65, 63, 128, 168, 0, 0, 0, 242, 65, 63, 64, 72, 0, 0, 0, 242, 65, 63,
|
||||
1, 0, 6, 40, 0, 0, 0, 0, 1, 0, 1, 41, 5, 0, 2, 0
|
||||
};
|
||||
|
||||
static const Uint8 GLES2_FragmentTegra_Alpha_SolidSrc_[] = {
|
||||
169, 153, 195, 28, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,
|
||||
0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 75,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
|
||||
75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 13, 0,
|
||||
0, 0, 82, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
22, 0, 0, 0, 84, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 4,
|
||||
0, 0, 0, 15, 0, 0, 0, 93, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 113, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 113, 0, 0,
|
||||
0, 220, 0, 0, 0, 220, 0, 0, 0, 20, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0,
|
||||
0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 117, 95, 99, 111, 108, 111, 114, 0, 0, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 118, 118, 17, 241, 0, 0, 0, 240, 0,
|
||||
0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 21, 32, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 82, 50, 48, 45, 66, 73, 78,
|
||||
1, 0, 0, 0, 3, 0, 0, 0, 3, 0, 65, 37, 8, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 21, 0,
|
||||
0, 0, 0, 3, 0, 1, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 39, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 3, 0, 1, 40, 1, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 24, 0, 4, 40, 232, 231, 15,
|
||||
0, 0, 242, 65, 62, 194, 72, 1, 0, 0, 250, 65, 63, 194, 40, 1, 0, 0, 250, 65, 63, 192, 168, 1,
|
||||
0, 0, 242, 1, 64, 192, 168, 1, 0, 0, 242, 1, 68, 168, 32, 0, 0, 0, 50, 64, 0, 192, 168, 15,
|
||||
0, 0, 242, 1, 66, 168, 64, 0, 16, 0, 242, 65, 1, 232, 231, 15, 0, 0, 242, 65, 62, 168, 160,
|
||||
0, 0, 0, 50, 64, 2, 104, 192, 0, 0, 36, 48, 66, 4, 232, 231, 15, 0, 0, 242, 65, 62, 3, 0, 6,
|
||||
40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 2, 0
|
||||
};
|
||||
|
||||
static const Uint8 GLES2_FragmentTegra_Additive_SolidSrc_[] = {
|
||||
59, 71, 42, 17, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0, 0,
|
||||
0, 8, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 75,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
|
||||
75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 13, 0,
|
||||
0, 0, 82, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
22, 0, 0, 0, 84, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 4,
|
||||
0, 0, 0, 15, 0, 0, 0, 93, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 113, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 113, 0, 0,
|
||||
0, 108, 0, 0, 0, 108, 0, 0, 0, 20, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0,
|
||||
0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 117, 95, 99, 111, 108, 111, 114, 0, 0, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 22, 22, 17, 241, 0, 0, 0, 240, 0,
|
||||
0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 21, 32, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 82, 50, 48, 45, 66, 73, 78,
|
||||
1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 65, 37, 8, 0, 129, 0, 1, 0, 0, 21, 0, 0, 0, 0, 1, 0, 1, 38, 0,
|
||||
0, 0, 0, 1, 0, 1, 39, 0, 0, 0, 0, 1, 0, 1, 40, 1, 0, 0, 0, 8, 0, 4, 40, 192, 200, 0, 0, 0, 26,
|
||||
0, 70, 192, 40, 0, 0, 0, 2, 0, 64, 192, 72, 0, 0, 0, 10, 0, 66, 192, 168, 0, 0, 0, 18, 0, 68,
|
||||
1, 0, 6, 40, 0, 0, 0, 0, 1, 0, 1, 41, 5, 0, 2, 0
|
||||
};
|
||||
|
||||
static const Uint8 GLES2_FragmentTegra_Modulated_SolidSrc_[] = {
|
||||
37, 191, 49, 17, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0, 0,
|
||||
0, 8, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 75,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
|
||||
75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 13, 0,
|
||||
0, 0, 82, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
22, 0, 0, 0, 84, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 4,
|
||||
0, 0, 0, 15, 0, 0, 0, 93, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 113, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 113, 0, 0,
|
||||
0, 108, 0, 0, 0, 108, 0, 0, 0, 20, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0,
|
||||
0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 117, 95, 99, 111, 108, 111, 114, 0, 0, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 32, 32, 17, 241, 0, 0, 0, 240, 0,
|
||||
0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 21, 32, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 82, 50, 48, 45, 66, 73, 78,
|
||||
1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 65, 37, 8, 0, 129, 0, 1, 0, 0, 21, 0, 0, 0, 0, 1, 0, 1, 38, 0,
|
||||
0, 0, 0, 1, 0, 1, 39, 0, 0, 0, 0, 1, 0, 1, 40, 1, 0, 0, 0, 8, 0, 4, 40, 104, 192, 0, 0, 0, 242,
|
||||
1, 70, 8, 32, 0, 0, 0, 242, 1, 64, 40, 64, 0, 0, 0, 242, 1, 66, 72, 160, 0, 0, 0, 242, 1, 68,
|
||||
1, 0, 6, 40, 0, 0, 0, 0, 1, 0, 1, 41, 5, 0, 2, 0
|
||||
};
|
||||
|
||||
static const Uint8 GLES2_FragmentTegra_None_TextureSrc_[] = {
|
||||
220, 217, 41, 211, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,
|
||||
0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
|
||||
82, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 6, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,
|
||||
0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 87, 0, 0, 0, 2, 0, 0, 0, 56, 0, 0, 0,
|
||||
13, 0, 0, 0, 101, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, 105, 0, 0, 0, 1, 0, 0, 0, 4,
|
||||
0, 0, 0, 22, 0, 0, 0, 106, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 114, 0, 0, 0, 1, 0,
|
||||
0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 115, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 135, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 135,
|
||||
0, 0, 0, 120, 0, 0, 0, 120, 0, 0, 0, 20, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,
|
||||
0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 118, 95, 116, 101, 120, 67, 111, 111, 114, 100, 0, 117, 95, 109, 111, 100, 117, 108,
|
||||
97, 116, 105, 111, 110, 0, 117, 95, 116, 101, 120, 116, 117, 114, 101, 0, 0, 0, 0, 0, 0, 0,
|
||||
2, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 94, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0,
|
||||
0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 1, 0, 0, 0, 241, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240,
|
||||
0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 1, 0,
|
||||
0, 0, 1, 0, 0, 0, 21, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0,
|
||||
0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 65, 82, 50, 48, 45, 66, 73, 78, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 65, 37, 0, 0, 0, 0, 1, 0,
|
||||
0, 21, 0, 0, 0, 0, 1, 0, 1, 38, 1, 0, 0, 0, 2, 0, 4, 38, 186, 81, 78, 16, 2, 1, 0, 0, 1, 0,
|
||||
1, 39, 0, 4, 0, 0, 1, 0, 1, 40, 1, 0, 0, 0, 8, 0, 4, 40, 104, 192, 0, 0, 0, 242, 1, 70, 8, 32,
|
||||
0, 0, 0, 242, 1, 64, 40, 64, 0, 0, 0, 242, 1, 66, 72, 160, 0, 0, 0, 242, 1, 68, 1, 0, 6, 40,
|
||||
0, 0, 0, 0, 1, 0, 1, 41, 5, 0, 2, 0
|
||||
};
|
||||
|
||||
static const Uint8 GLES2_FragmentTegra_Alpha_TextureSrc_[] = {
|
||||
71, 202, 114, 229, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,
|
||||
0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
|
||||
82, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 6, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,
|
||||
0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 87, 0, 0, 0, 2, 0, 0, 0, 56, 0, 0, 0,
|
||||
13, 0, 0, 0, 101, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, 105, 0, 0, 0, 1, 0, 0, 0, 4,
|
||||
0, 0, 0, 22, 0, 0, 0, 106, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 114, 0, 0, 0, 1, 0,
|
||||
0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 115, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 135, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 135,
|
||||
0, 0, 0, 176, 0, 0, 0, 176, 0, 0, 0, 20, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,
|
||||
0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 118, 95, 116, 101, 120, 67, 111, 111, 114, 100, 0, 117, 95, 109, 111, 100, 117, 108,
|
||||
97, 116, 105, 111, 110, 0, 117, 95, 116, 101, 120, 116, 117, 114, 101, 0, 0, 0, 0, 0, 0, 0,
|
||||
2, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 94, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0,
|
||||
0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 1, 118, 118, 17, 241, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0,
|
||||
240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0,
|
||||
1, 0, 0, 0, 2, 0, 0, 0, 21, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 16, 0, 0, 0, 16,
|
||||
0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 65, 82, 50, 48, 45, 66, 73, 78, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 65, 37, 0, 0, 0, 0,
|
||||
8, 0, 129, 0, 1, 0, 0, 21, 0, 0, 0, 0, 2, 0, 1, 38, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 38, 186,
|
||||
81, 78, 16, 2, 1, 0, 0, 2, 0, 1, 39, 0, 4, 0, 0, 0, 0, 0, 0, 2, 0, 1, 40, 1, 0, 0, 0, 5, 0,
|
||||
0, 0, 16, 0, 4, 40, 40, 160, 1, 0, 0, 242, 1, 66, 8, 192, 1, 0, 0, 242, 1, 64, 104, 32, 1, 0,
|
||||
0, 242, 1, 70, 72, 64, 1, 0, 0, 242, 1, 68, 154, 192, 0, 0, 37, 34, 64, 3, 8, 32, 0, 0, 5, 58,
|
||||
208, 4, 40, 64, 0, 0, 5, 50, 208, 4, 72, 160, 0, 0, 37, 42, 208, 4, 2, 0, 6, 40, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 2, 0, 1, 41, 0, 0, 0, 0, 5, 0, 2, 0
|
||||
};
|
||||
|
||||
static const Uint8 GLES2_FragmentTegra_Additive_TextureSrc_[] = {
|
||||
161, 234, 193, 234, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,
|
||||
0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
|
||||
82, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 6, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,
|
||||
0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 87, 0, 0, 0, 2, 0, 0, 0, 56, 0, 0, 0,
|
||||
13, 0, 0, 0, 101, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, 105, 0, 0, 0, 1, 0, 0, 0, 4,
|
||||
0, 0, 0, 22, 0, 0, 0, 106, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 114, 0, 0, 0, 1, 0,
|
||||
0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 115, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 135, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 135,
|
||||
0, 0, 0, 176, 0, 0, 0, 176, 0, 0, 0, 20, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,
|
||||
0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 118, 95, 116, 101, 120, 67, 111, 111, 114, 100, 0, 117, 95, 109, 111, 100, 117, 108,
|
||||
97, 116, 105, 111, 110, 0, 117, 95, 116, 101, 120, 116, 117, 114, 101, 0, 0, 0, 0, 0, 0, 0,
|
||||
2, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 94, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0,
|
||||
0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 1, 22, 22, 17, 241, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240,
|
||||
0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0,
|
||||
0, 0, 2, 0, 0, 0, 21, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0,
|
||||
0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 65, 82, 50, 48, 45, 66, 73, 78, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 65, 37, 0, 0, 0, 0, 8, 0,
|
||||
129, 0, 1, 0, 0, 21, 0, 0, 0, 0, 2, 0, 1, 38, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 38, 186, 81,
|
||||
78, 16, 2, 1, 0, 0, 2, 0, 1, 39, 0, 4, 0, 0, 0, 0, 0, 0, 2, 0, 1, 40, 1, 0, 0, 0, 5, 0, 0, 0,
|
||||
16, 0, 4, 40, 40, 160, 1, 0, 0, 242, 1, 66, 104, 32, 1, 0, 0, 242, 1, 70, 8, 192, 1, 0, 0, 242,
|
||||
1, 64, 72, 64, 1, 0, 0, 242, 1, 68, 136, 192, 0, 0, 0, 26, 64, 4, 136, 32, 0, 0, 0, 2, 64, 7,
|
||||
136, 64, 0, 0, 0, 10, 64, 6, 136, 160, 0, 0, 0, 18, 64, 5, 2, 0, 6, 40, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 2, 0, 1, 41, 0, 0, 0, 0, 5, 0, 2, 0
|
||||
};
|
||||
|
||||
static const Uint8 GLES2_FragmentTegra_Modulated_TextureSrc_[] = {
|
||||
75, 132, 201, 227, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,
|
||||
0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
|
||||
82, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 6, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,
|
||||
0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 87, 0, 0, 0, 2, 0, 0, 0, 56, 0, 0, 0,
|
||||
13, 0, 0, 0, 101, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, 105, 0, 0, 0, 1, 0, 0, 0, 4,
|
||||
0, 0, 0, 22, 0, 0, 0, 106, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 114, 0, 0, 0, 1, 0,
|
||||
0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 115, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 135, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 135,
|
||||
0, 0, 0, 176, 0, 0, 0, 176, 0, 0, 0, 20, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,
|
||||
0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 118, 95, 116, 101, 120, 67, 111, 111, 114, 100, 0, 117, 95, 109, 111, 100, 117, 108,
|
||||
97, 116, 105, 111, 110, 0, 117, 95, 116, 101, 120, 116, 117, 114, 101, 0, 0, 0, 0, 0, 0, 0,
|
||||
2, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 94, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0,
|
||||
0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 1, 32, 32, 17, 241, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240,
|
||||
0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0,
|
||||
0, 0, 2, 0, 0, 0, 21, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0,
|
||||
0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 65, 82, 50, 48, 45, 66, 73, 78, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 65, 37, 0, 0, 0, 0, 8, 0,
|
||||
129, 0, 1, 0, 0, 21, 0, 0, 0, 0, 2, 0, 1, 38, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 38, 186, 81,
|
||||
78, 16, 2, 1, 0, 0, 2, 0, 1, 39, 0, 4, 0, 0, 0, 0, 0, 0, 2, 0, 1, 40, 1, 0, 0, 0, 5, 0, 0, 0,
|
||||
16, 0, 4, 40, 40, 160, 1, 0, 0, 242, 1, 66, 8, 192, 1, 0, 0, 242, 1, 64, 104, 32, 1, 0, 0, 242,
|
||||
1, 70, 72, 64, 1, 0, 0, 242, 1, 68, 104, 192, 0, 0, 0, 242, 65, 4, 232, 32, 0, 0, 0, 242, 65,
|
||||
0, 40, 64, 0, 0, 0, 242, 65, 6, 72, 160, 0, 0, 0, 242, 65, 5, 2, 0, 6, 40, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 2, 0, 1, 41, 0, 0, 0, 0, 5, 0, 2, 0
|
||||
};
|
||||
|
||||
static const GLES2_ShaderInstance GLES2_VertexTegra_Default = {
|
||||
GL_VERTEX_SHADER,
|
||||
GL_NVIDIA_PLATFORM_BINARY_NV,
|
||||
sizeof(GLES2_VertexTegra_Default_),
|
||||
GLES2_VertexTegra_Default_
|
||||
};
|
||||
|
||||
static const GLES2_ShaderInstance GLES2_FragmentTegra_None_SolidSrc = {
|
||||
GL_FRAGMENT_SHADER,
|
||||
GL_NVIDIA_PLATFORM_BINARY_NV,
|
||||
sizeof(GLES2_FragmentTegra_None_SolidSrc_),
|
||||
GLES2_FragmentTegra_None_SolidSrc_
|
||||
};
|
||||
|
||||
static const GLES2_ShaderInstance GLES2_FragmentTegra_Alpha_SolidSrc = {
|
||||
GL_FRAGMENT_SHADER,
|
||||
GL_NVIDIA_PLATFORM_BINARY_NV,
|
||||
sizeof(GLES2_FragmentTegra_Alpha_SolidSrc_),
|
||||
GLES2_FragmentTegra_Alpha_SolidSrc_
|
||||
};
|
||||
|
||||
static const GLES2_ShaderInstance GLES2_FragmentTegra_Additive_SolidSrc = {
|
||||
GL_FRAGMENT_SHADER,
|
||||
GL_NVIDIA_PLATFORM_BINARY_NV,
|
||||
sizeof(GLES2_FragmentTegra_Additive_SolidSrc_),
|
||||
GLES2_FragmentTegra_Additive_SolidSrc_
|
||||
};
|
||||
|
||||
static const GLES2_ShaderInstance GLES2_FragmentTegra_Modulated_SolidSrc = {
|
||||
GL_FRAGMENT_SHADER,
|
||||
GL_NVIDIA_PLATFORM_BINARY_NV,
|
||||
sizeof(GLES2_FragmentTegra_Modulated_SolidSrc_),
|
||||
GLES2_FragmentTegra_Modulated_SolidSrc_
|
||||
};
|
||||
|
||||
static const GLES2_ShaderInstance GLES2_FragmentTegra_None_TextureSrc = {
|
||||
GL_FRAGMENT_SHADER,
|
||||
GL_NVIDIA_PLATFORM_BINARY_NV,
|
||||
sizeof(GLES2_FragmentTegra_None_TextureSrc_),
|
||||
GLES2_FragmentTegra_None_TextureSrc_
|
||||
};
|
||||
|
||||
static const GLES2_ShaderInstance GLES2_FragmentTegra_Alpha_TextureSrc = {
|
||||
GL_FRAGMENT_SHADER,
|
||||
GL_NVIDIA_PLATFORM_BINARY_NV,
|
||||
sizeof(GLES2_FragmentTegra_Alpha_TextureSrc_),
|
||||
GLES2_FragmentTegra_Alpha_TextureSrc_
|
||||
};
|
||||
|
||||
static const GLES2_ShaderInstance GLES2_FragmentTegra_Additive_TextureSrc = {
|
||||
GL_FRAGMENT_SHADER,
|
||||
GL_NVIDIA_PLATFORM_BINARY_NV,
|
||||
sizeof(GLES2_FragmentTegra_Additive_TextureSrc_),
|
||||
GLES2_FragmentTegra_Additive_TextureSrc_
|
||||
};
|
||||
|
||||
static const GLES2_ShaderInstance GLES2_FragmentTegra_Modulated_TextureSrc = {
|
||||
GL_FRAGMENT_SHADER,
|
||||
GL_NVIDIA_PLATFORM_BINARY_NV,
|
||||
sizeof(GLES2_FragmentTegra_Modulated_TextureSrc_),
|
||||
GLES2_FragmentTegra_Modulated_TextureSrc_
|
||||
};
|
||||
|
||||
#endif /* GLES2_INCLUDE_NVIDIA_SHADERS */
|
||||
|
||||
/*************************************************************************************************
|
||||
* Vertex/fragment shader definitions *
|
||||
*************************************************************************************************/
|
||||
|
||||
static GLES2_Shader GLES2_VertexShader_Default = {
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
2,
|
||||
#else
|
||||
1,
|
||||
#endif
|
||||
{
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
&GLES2_VertexTegra_Default,
|
||||
#endif
|
||||
&GLES2_VertexSrc_Default
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_None_SolidSrc = {
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
2,
|
||||
#else
|
||||
static GLES2_Shader GLES2_FragmentShader_SolidSrc = {
|
||||
1,
|
||||
#endif
|
||||
{
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
&GLES2_FragmentTegra_None_SolidSrc,
|
||||
#endif
|
||||
&GLES2_FragmentSrc_SolidSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Alpha_SolidSrc = {
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
2,
|
||||
#else
|
||||
static GLES2_Shader GLES2_FragmentShader_TextureABGRSrc = {
|
||||
1,
|
||||
#endif
|
||||
{
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
&GLES2_FragmentTegra_Alpha_SolidSrc,
|
||||
#endif
|
||||
&GLES2_FragmentSrc_SolidSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Additive_SolidSrc = {
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
2,
|
||||
#else
|
||||
1,
|
||||
#endif
|
||||
{
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
&GLES2_FragmentTegra_Additive_SolidSrc,
|
||||
#endif
|
||||
&GLES2_FragmentSrc_SolidSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Modulated_SolidSrc = {
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
2,
|
||||
#else
|
||||
1,
|
||||
#endif
|
||||
{
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
&GLES2_FragmentTegra_Modulated_SolidSrc,
|
||||
#endif
|
||||
&GLES2_FragmentSrc_SolidSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_None_TextureABGRSrc = {
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
2,
|
||||
#else
|
||||
1,
|
||||
#endif
|
||||
{
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
&GLES2_FragmentTegra_None_TextureSrc,
|
||||
#endif
|
||||
&GLES2_FragmentSrc_TextureABGRSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Alpha_TextureABGRSrc = {
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
2,
|
||||
#else
|
||||
1,
|
||||
#endif
|
||||
{
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
&GLES2_FragmentTegra_Alpha_TextureSrc,
|
||||
#endif
|
||||
&GLES2_FragmentSrc_TextureABGRSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Additive_TextureABGRSrc = {
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
2,
|
||||
#else
|
||||
1,
|
||||
#endif
|
||||
{
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
&GLES2_FragmentTegra_Additive_TextureSrc,
|
||||
#endif
|
||||
&GLES2_FragmentSrc_TextureABGRSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Modulated_TextureABGRSrc = {
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
2,
|
||||
#else
|
||||
1,
|
||||
#endif
|
||||
{
|
||||
#if GLES2_INCLUDE_NVIDIA_SHADERS
|
||||
&GLES2_FragmentTegra_Modulated_TextureSrc,
|
||||
#endif
|
||||
&GLES2_FragmentSrc_TextureABGRSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_None_TextureARGBSrc = {
|
||||
static GLES2_Shader GLES2_FragmentShader_TextureARGBSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureARGBSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Alpha_TextureARGBSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureARGBSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Additive_TextureARGBSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureARGBSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Modulated_TextureARGBSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureARGBSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_None_TextureRGBSrc = {
|
||||
static GLES2_Shader GLES2_FragmentShader_TextureRGBSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureRGBSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Alpha_TextureRGBSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureRGBSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Additive_TextureRGBSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureRGBSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Modulated_TextureRGBSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureRGBSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_None_TextureBGRSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureBGRSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Alpha_TextureBGRSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureBGRSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Additive_TextureBGRSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureBGRSrc
|
||||
}
|
||||
};
|
||||
|
||||
static GLES2_Shader GLES2_FragmentShader_Modulated_TextureBGRSrc = {
|
||||
static GLES2_Shader GLES2_FragmentShader_TextureBGRSrc = {
|
||||
1,
|
||||
{
|
||||
&GLES2_FragmentSrc_TextureBGRSrc
|
||||
@@ -808,94 +330,27 @@ static GLES2_Shader GLES2_FragmentShader_TextureNV21Src = {
|
||||
* Shader selector *
|
||||
*************************************************************************************************/
|
||||
|
||||
const GLES2_Shader *GLES2_GetShader(GLES2_ShaderType type, SDL_BlendMode blendMode)
|
||||
const GLES2_Shader *GLES2_GetShader(GLES2_ShaderType type)
|
||||
{
|
||||
switch (type) {
|
||||
case GLES2_SHADER_VERTEX_DEFAULT:
|
||||
return &GLES2_VertexShader_Default;
|
||||
case GLES2_SHADER_FRAGMENT_SOLID_SRC:
|
||||
switch (blendMode) {
|
||||
case SDL_BLENDMODE_NONE:
|
||||
return &GLES2_FragmentShader_None_SolidSrc;
|
||||
case SDL_BLENDMODE_BLEND:
|
||||
return &GLES2_FragmentShader_Alpha_SolidSrc;
|
||||
case SDL_BLENDMODE_ADD:
|
||||
return &GLES2_FragmentShader_Additive_SolidSrc;
|
||||
case SDL_BLENDMODE_MOD:
|
||||
return &GLES2_FragmentShader_Modulated_SolidSrc;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
return &GLES2_FragmentShader_SolidSrc;
|
||||
case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_SRC:
|
||||
switch (blendMode) {
|
||||
case SDL_BLENDMODE_NONE:
|
||||
return &GLES2_FragmentShader_None_TextureABGRSrc;
|
||||
case SDL_BLENDMODE_BLEND:
|
||||
return &GLES2_FragmentShader_Alpha_TextureABGRSrc;
|
||||
case SDL_BLENDMODE_ADD:
|
||||
return &GLES2_FragmentShader_Additive_TextureABGRSrc;
|
||||
case SDL_BLENDMODE_MOD:
|
||||
return &GLES2_FragmentShader_Modulated_TextureABGRSrc;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
return &GLES2_FragmentShader_TextureABGRSrc;
|
||||
case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_SRC:
|
||||
switch (blendMode) {
|
||||
case SDL_BLENDMODE_NONE:
|
||||
return &GLES2_FragmentShader_None_TextureARGBSrc;
|
||||
case SDL_BLENDMODE_BLEND:
|
||||
return &GLES2_FragmentShader_Alpha_TextureARGBSrc;
|
||||
case SDL_BLENDMODE_ADD:
|
||||
return &GLES2_FragmentShader_Additive_TextureARGBSrc;
|
||||
case SDL_BLENDMODE_MOD:
|
||||
return &GLES2_FragmentShader_Modulated_TextureARGBSrc;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &GLES2_FragmentShader_TextureARGBSrc;
|
||||
case GLES2_SHADER_FRAGMENT_TEXTURE_RGB_SRC:
|
||||
switch (blendMode) {
|
||||
case SDL_BLENDMODE_NONE:
|
||||
return &GLES2_FragmentShader_None_TextureRGBSrc;
|
||||
case SDL_BLENDMODE_BLEND:
|
||||
return &GLES2_FragmentShader_Alpha_TextureRGBSrc;
|
||||
case SDL_BLENDMODE_ADD:
|
||||
return &GLES2_FragmentShader_Additive_TextureRGBSrc;
|
||||
case SDL_BLENDMODE_MOD:
|
||||
return &GLES2_FragmentShader_Modulated_TextureRGBSrc;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &GLES2_FragmentShader_TextureRGBSrc;
|
||||
case GLES2_SHADER_FRAGMENT_TEXTURE_BGR_SRC:
|
||||
switch (blendMode) {
|
||||
case SDL_BLENDMODE_NONE:
|
||||
return &GLES2_FragmentShader_None_TextureBGRSrc;
|
||||
case SDL_BLENDMODE_BLEND:
|
||||
return &GLES2_FragmentShader_Alpha_TextureBGRSrc;
|
||||
case SDL_BLENDMODE_ADD:
|
||||
return &GLES2_FragmentShader_Additive_TextureBGRSrc;
|
||||
case SDL_BLENDMODE_MOD:
|
||||
return &GLES2_FragmentShader_Modulated_TextureBGRSrc;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &GLES2_FragmentShader_TextureBGRSrc;
|
||||
case GLES2_SHADER_FRAGMENT_TEXTURE_YUV_SRC:
|
||||
{
|
||||
return &GLES2_FragmentShader_TextureYUVSrc;
|
||||
}
|
||||
|
||||
case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_SRC:
|
||||
{
|
||||
return &GLES2_FragmentShader_TextureNV12Src;
|
||||
}
|
||||
|
||||
case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_SRC:
|
||||
{
|
||||
return &GLES2_FragmentShader_TextureNV21Src;
|
||||
}
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -22,8 +22,8 @@
|
||||
|
||||
#if SDL_VIDEO_RENDER_OGL_ES2
|
||||
|
||||
#ifndef SDL_shaderdata_h_
|
||||
#define SDL_shaderdata_h_
|
||||
#ifndef SDL_shaders_gles2_h_
|
||||
#define SDL_shaders_gles2_h_
|
||||
|
||||
typedef struct GLES2_ShaderInstance
|
||||
{
|
||||
@@ -54,9 +54,9 @@ typedef enum
|
||||
|
||||
#define GLES2_SOURCE_SHADER (GLenum)-1
|
||||
|
||||
const GLES2_Shader *GLES2_GetShader(GLES2_ShaderType type, SDL_BlendMode blendMode);
|
||||
const GLES2_Shader *GLES2_GetShader(GLES2_ShaderType type);
|
||||
|
||||
#endif /* SDL_shaderdata_h_ */
|
||||
#endif /* SDL_shaders_gles2_h_ */
|
||||
|
||||
#endif /* SDL_VIDEO_RENDER_OGL_ES2 */
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -949,11 +949,11 @@ PSP_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
vertices[3].y = y + sw - ch;
|
||||
vertices[3].z = 0;
|
||||
|
||||
if (flip & SDL_FLIP_HORIZONTAL) {
|
||||
if (flip & SDL_FLIP_VERTICAL) {
|
||||
Swap(&vertices[0].v, &vertices[2].v);
|
||||
Swap(&vertices[1].v, &vertices[3].v);
|
||||
}
|
||||
if (flip & SDL_FLIP_VERTICAL) {
|
||||
if (flip & SDL_FLIP_HORIZONTAL) {
|
||||
Swap(&vertices[0].u, &vertices[2].u);
|
||||
Swap(&vertices[1].u, &vertices[3].u);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -245,7 +245,7 @@ SDL_BlendFillRect(SDL_Surface * dst, const SDL_Rect * rect,
|
||||
} else {
|
||||
return SDL_BlendFillRect_ARGB8888(dst, rect, blendMode, r, g, b, a);
|
||||
}
|
||||
break;
|
||||
/* break; -Wunreachable-code-break */
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -685,7 +685,7 @@ SDL_CalculateBlendLineFunc(const SDL_PixelFormat * fmt)
|
||||
} else {
|
||||
return SDL_BlendLine_RGB2;
|
||||
}
|
||||
break;
|
||||
/* break; -Wunreachable-code-break */
|
||||
case 4:
|
||||
if (fmt->Rmask == 0x00FF0000) {
|
||||
if (fmt->Amask) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -235,13 +235,11 @@ SDL_BlendPoint(SDL_Surface * dst, int x, int y, SDL_BlendMode blendMode, Uint8 r
|
||||
switch (dst->format->Rmask) {
|
||||
case 0x00FF0000:
|
||||
if (!dst->format->Amask) {
|
||||
return SDL_BlendPoint_RGB888(dst, x, y, blendMode, r, g, b,
|
||||
a);
|
||||
return SDL_BlendPoint_RGB888(dst, x, y, blendMode, r, g, b, a);
|
||||
} else {
|
||||
return SDL_BlendPoint_ARGB8888(dst, x, y, blendMode, r, g, b,
|
||||
a);
|
||||
return SDL_BlendPoint_ARGB8888(dst, x, y, blendMode, r, g, b, a);
|
||||
}
|
||||
break;
|
||||
/* break; -Wunreachable-code-break */
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -562,10 +562,10 @@ do { \
|
||||
while (height--) { \
|
||||
{ int n = (width+3)/4; \
|
||||
switch (width & 3) { \
|
||||
case 0: do { op; pixel++; \
|
||||
case 3: op; pixel++; \
|
||||
case 2: op; pixel++; \
|
||||
case 1: op; pixel++; \
|
||||
case 0: do { op; pixel++; /* fallthrough */ \
|
||||
case 3: op; pixel++; /* fallthrough */ \
|
||||
case 2: op; pixel++; /* fallthrough */ \
|
||||
case 1: op; pixel++; /* fallthrough */ \
|
||||
} while ( --n > 0 ); \
|
||||
} \
|
||||
} \
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -239,7 +239,10 @@ SW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||
SDL_SetSurfaceAlphaMod(texture->driverdata, texture->a);
|
||||
SDL_SetSurfaceBlendMode(texture->driverdata, texture->blendMode);
|
||||
|
||||
if (texture->access == SDL_TEXTUREACCESS_STATIC) {
|
||||
/* Only RLE encode textures without an alpha channel since the RLE coder
|
||||
* discards the color values of pixels with an alpha value of zero.
|
||||
*/
|
||||
if (texture->access == SDL_TEXTUREACCESS_STATIC && !Amask) {
|
||||
SDL_SetSurfaceRLE(texture->driverdata, 1);
|
||||
}
|
||||
|
||||
@@ -368,9 +371,14 @@ SW_UpdateClipRect(SDL_Renderer * renderer)
|
||||
SDL_Surface *surface = data->surface;
|
||||
if (surface) {
|
||||
if (renderer->clipping_enabled) {
|
||||
SDL_SetClipRect(surface, &renderer->clip_rect);
|
||||
SDL_Rect clip_rect;
|
||||
clip_rect = renderer->clip_rect;
|
||||
clip_rect.x += renderer->viewport.x;
|
||||
clip_rect.y += renderer->viewport.y;
|
||||
SDL_IntersectRect(&renderer->viewport, &clip_rect, &clip_rect);
|
||||
SDL_SetClipRect(surface, &clip_rect);
|
||||
} else {
|
||||
SDL_SetClipRect(surface, NULL);
|
||||
SDL_SetClipRect(surface, &renderer->viewport);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -599,9 +607,15 @@ SW_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
SDL_Surface *surface = SW_ActivateRenderer(renderer);
|
||||
SDL_Surface *src = (SDL_Surface *) texture->driverdata;
|
||||
SDL_Rect final_rect, tmp_rect;
|
||||
SDL_Surface *surface_rotated, *surface_scaled;
|
||||
int retval, dstwidth, dstheight, abscenterx, abscentery;
|
||||
SDL_Surface *src_clone, *src_rotated, *src_scaled;
|
||||
SDL_Surface *mask = NULL, *mask_rotated = NULL;
|
||||
int retval = 0, dstwidth, dstheight, abscenterx, abscentery;
|
||||
double cangle, sangle, px, py, p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y;
|
||||
SDL_BlendMode blendmode;
|
||||
Uint8 alphaMod, rMod, gMod, bMod;
|
||||
int applyModulation = SDL_FALSE;
|
||||
int blitRequired = SDL_FALSE;
|
||||
int isOpaque = SDL_FALSE;
|
||||
|
||||
if (!surface) {
|
||||
return -1;
|
||||
@@ -617,69 +631,104 @@ SW_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
final_rect.w = (int)dstrect->w;
|
||||
final_rect.h = (int)dstrect->h;
|
||||
|
||||
/* SDLgfx_rotateSurface doesn't accept a source rectangle, so crop and scale if we need to */
|
||||
tmp_rect = final_rect;
|
||||
tmp_rect.x = 0;
|
||||
tmp_rect.y = 0;
|
||||
if (srcrect->w == final_rect.w && srcrect->h == final_rect.h && srcrect->x == 0 && srcrect->y == 0) {
|
||||
surface_scaled = src; /* but if we don't need to, just use the original */
|
||||
retval = 0;
|
||||
} else {
|
||||
SDL_Surface *blit_src = src;
|
||||
Uint32 colorkey;
|
||||
SDL_BlendMode blendMode;
|
||||
Uint8 alphaMod, r, g, b;
|
||||
SDL_bool cloneSource = SDL_FALSE;
|
||||
|
||||
surface_scaled = SDL_CreateRGBSurface(SDL_SWSURFACE, final_rect.w, final_rect.h, src->format->BitsPerPixel,
|
||||
src->format->Rmask, src->format->Gmask,
|
||||
src->format->Bmask, src->format->Amask );
|
||||
if (!surface_scaled) {
|
||||
return -1;
|
||||
/* It is possible to encounter an RLE encoded surface here and locking it is
|
||||
* necessary because this code is going to access the pixel buffer directly.
|
||||
*/
|
||||
if (SDL_MUSTLOCK(src)) {
|
||||
SDL_LockSurface(src);
|
||||
}
|
||||
|
||||
/* Clone the source surface but use its pixel buffer directly.
|
||||
* The original source surface must be treated as read-only.
|
||||
*/
|
||||
src_clone = SDL_CreateRGBSurfaceFrom(src->pixels, src->w, src->h, src->format->BitsPerPixel, src->pitch,
|
||||
src->format->Rmask, src->format->Gmask,
|
||||
src->format->Bmask, src->format->Amask);
|
||||
if (src_clone == NULL) {
|
||||
if (SDL_MUSTLOCK(src)) {
|
||||
SDL_UnlockSurface(src);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* copy the color key, alpha mod, blend mode, and color mod so the scaled surface behaves like the source */
|
||||
if (SDL_GetColorKey(src, &colorkey) == 0) {
|
||||
SDL_SetColorKey(surface_scaled, SDL_TRUE, colorkey);
|
||||
cloneSource = SDL_TRUE;
|
||||
}
|
||||
SDL_GetSurfaceAlphaMod(src, &alphaMod); /* these will be copied to surface_scaled below if necessary */
|
||||
SDL_GetSurfaceBlendMode(src, &blendMode);
|
||||
SDL_GetSurfaceColorMod(src, &r, &g, &b);
|
||||
SDL_GetSurfaceBlendMode(src, &blendmode);
|
||||
SDL_GetSurfaceAlphaMod(src, &alphaMod);
|
||||
SDL_GetSurfaceColorMod(src, &rMod, &gMod, &bMod);
|
||||
|
||||
/* now we need to blit the src into surface_scaled. since we want to copy the colors from the source to
|
||||
* surface_scaled rather than blend them, etc. we'll need to disable the blend mode, alpha mod, etc.
|
||||
* but we don't want to modify src (in case it's being used on other threads), so we'll need to clone it
|
||||
* before changing the blend options
|
||||
*/
|
||||
cloneSource |= blendMode != SDL_BLENDMODE_NONE || (alphaMod & r & g & b) != 255;
|
||||
if (cloneSource) {
|
||||
blit_src = SDL_ConvertSurface(src, src->format, src->flags); /* clone src */
|
||||
if (!blit_src) {
|
||||
SDL_FreeSurface(surface_scaled);
|
||||
return -1;
|
||||
}
|
||||
SDL_SetSurfaceAlphaMod(blit_src, 255); /* disable all blending options in blit_src */
|
||||
SDL_SetSurfaceBlendMode(blit_src, SDL_BLENDMODE_NONE);
|
||||
SDL_SetColorKey(blit_src, 0, 0);
|
||||
SDL_SetSurfaceColorMod(blit_src, 255, 255, 255);
|
||||
SDL_SetSurfaceRLE(blit_src, 0); /* don't RLE encode a surface we'll only use once */
|
||||
/* SDLgfx_rotateSurface only accepts 32-bit surfaces with a 8888 layout. Everything else has to be converted. */
|
||||
if (src->format->BitsPerPixel != 32 || SDL_PIXELLAYOUT(src->format->format) != SDL_PACKEDLAYOUT_8888 || !src->format->Amask) {
|
||||
blitRequired = SDL_TRUE;
|
||||
}
|
||||
|
||||
SDL_SetSurfaceAlphaMod(surface_scaled, alphaMod); /* copy blending options to surface_scaled */
|
||||
SDL_SetSurfaceBlendMode(surface_scaled, blendMode);
|
||||
SDL_SetSurfaceColorMod(surface_scaled, r, g, b);
|
||||
}
|
||||
/* If scaling and cropping is necessary, it has to be taken care of before the rotation. */
|
||||
if (!(srcrect->w == final_rect.w && srcrect->h == final_rect.h && srcrect->x == 0 && srcrect->y == 0)) {
|
||||
blitRequired = SDL_TRUE;
|
||||
}
|
||||
|
||||
retval = SDL_BlitScaled(blit_src, srcrect, surface_scaled, &tmp_rect);
|
||||
if (blit_src != src) {
|
||||
SDL_FreeSurface(blit_src);
|
||||
/* The color and alpha modulation has to be applied before the rotation when using the NONE and MOD blend modes. */
|
||||
if ((blendmode == SDL_BLENDMODE_NONE || blendmode == SDL_BLENDMODE_MOD) && (alphaMod & rMod & gMod & bMod) != 255) {
|
||||
applyModulation = SDL_TRUE;
|
||||
SDL_SetSurfaceAlphaMod(src_clone, alphaMod);
|
||||
SDL_SetSurfaceColorMod(src_clone, rMod, gMod, bMod);
|
||||
}
|
||||
|
||||
/* Opaque surfaces are much easier to handle with the NONE blend mode. */
|
||||
if (blendmode == SDL_BLENDMODE_NONE && !src->format->Amask && alphaMod == 255) {
|
||||
isOpaque = SDL_TRUE;
|
||||
}
|
||||
|
||||
/* The NONE blend mode requires a mask for non-opaque surfaces. This mask will be used
|
||||
* to clear the pixels in the destination surface. The other steps are explained below.
|
||||
*/
|
||||
if (blendmode == SDL_BLENDMODE_NONE && !isOpaque) {
|
||||
mask = SDL_CreateRGBSurface(0, final_rect.w, final_rect.h, 32,
|
||||
0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
|
||||
if (mask == NULL) {
|
||||
retval = -1;
|
||||
} else {
|
||||
SDL_SetSurfaceBlendMode(mask, SDL_BLENDMODE_MOD);
|
||||
}
|
||||
}
|
||||
|
||||
/* Create a new surface should there be a format mismatch or if scaling, cropping,
|
||||
* or modulation is required. It's possible to use the source surface directly otherwise.
|
||||
*/
|
||||
if (!retval && (blitRequired || applyModulation)) {
|
||||
SDL_Rect scale_rect = tmp_rect;
|
||||
src_scaled = SDL_CreateRGBSurface(0, final_rect.w, final_rect.h, 32,
|
||||
0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
|
||||
if (src_scaled == NULL) {
|
||||
retval = -1;
|
||||
} else {
|
||||
SDL_SetSurfaceBlendMode(src_clone, SDL_BLENDMODE_NONE);
|
||||
retval = SDL_BlitScaled(src_clone, srcrect, src_scaled, &scale_rect);
|
||||
SDL_FreeSurface(src_clone);
|
||||
src_clone = src_scaled;
|
||||
src_scaled = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* SDLgfx_rotateSurface is going to make decisions depending on the blend mode. */
|
||||
SDL_SetSurfaceBlendMode(src_clone, blendmode);
|
||||
|
||||
if (!retval) {
|
||||
SDLgfx_rotozoomSurfaceSizeTrig(tmp_rect.w, tmp_rect.h, angle, &dstwidth, &dstheight, &cangle, &sangle);
|
||||
surface_rotated = SDLgfx_rotateSurface(surface_scaled, angle, dstwidth/2, dstheight/2, GetScaleQuality(), flip & SDL_FLIP_HORIZONTAL, flip & SDL_FLIP_VERTICAL, dstwidth, dstheight, cangle, sangle);
|
||||
if(surface_rotated) {
|
||||
src_rotated = SDLgfx_rotateSurface(src_clone, angle, dstwidth/2, dstheight/2, GetScaleQuality(), flip & SDL_FLIP_HORIZONTAL, flip & SDL_FLIP_VERTICAL, dstwidth, dstheight, cangle, sangle);
|
||||
if (src_rotated == NULL) {
|
||||
retval = -1;
|
||||
}
|
||||
if (!retval && mask != NULL) {
|
||||
/* The mask needed for the NONE blend mode gets rotated with the same parameters. */
|
||||
mask_rotated = SDLgfx_rotateSurface(mask, angle, dstwidth/2, dstheight/2, SDL_FALSE, 0, 0, dstwidth, dstheight, cangle, sangle);
|
||||
if (mask_rotated == NULL) {
|
||||
retval = -1;
|
||||
}
|
||||
}
|
||||
if (!retval) {
|
||||
/* Find out where the new origin is by rotating the four final_rect points around the center and then taking the extremes */
|
||||
abscenterx = final_rect.x + (int)center->x;
|
||||
abscentery = final_rect.y + (int)center->y;
|
||||
@@ -715,13 +764,69 @@ SW_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
tmp_rect.w = dstwidth;
|
||||
tmp_rect.h = dstheight;
|
||||
|
||||
retval = SDL_BlitSurface(surface_rotated, NULL, surface, &tmp_rect);
|
||||
SDL_FreeSurface(surface_rotated);
|
||||
/* The NONE blend mode needs some special care with non-opaque surfaces.
|
||||
* Other blend modes or opaque surfaces can be blitted directly.
|
||||
*/
|
||||
if (blendmode != SDL_BLENDMODE_NONE || isOpaque) {
|
||||
if (applyModulation == SDL_FALSE) {
|
||||
/* If the modulation wasn't already applied, make it happen now. */
|
||||
SDL_SetSurfaceAlphaMod(src_rotated, alphaMod);
|
||||
SDL_SetSurfaceColorMod(src_rotated, rMod, gMod, bMod);
|
||||
}
|
||||
retval = SDL_BlitSurface(src_rotated, NULL, surface, &tmp_rect);
|
||||
} else {
|
||||
/* The NONE blend mode requires three steps to get the pixels onto the destination surface.
|
||||
* First, the area where the rotated pixels will be blitted to get set to zero.
|
||||
* This is accomplished by simply blitting a mask with the NONE blend mode.
|
||||
* The colorkey set by the rotate function will discard the correct pixels.
|
||||
*/
|
||||
SDL_Rect mask_rect = tmp_rect;
|
||||
SDL_SetSurfaceBlendMode(mask_rotated, SDL_BLENDMODE_NONE);
|
||||
retval = SDL_BlitSurface(mask_rotated, NULL, surface, &mask_rect);
|
||||
if (!retval) {
|
||||
/* The next step copies the alpha value. This is done with the BLEND blend mode and
|
||||
* by modulating the source colors with 0. Since the destination is all zeros, this
|
||||
* will effectively set the destination alpha to the source alpha.
|
||||
*/
|
||||
SDL_SetSurfaceColorMod(src_rotated, 0, 0, 0);
|
||||
mask_rect = tmp_rect;
|
||||
retval = SDL_BlitSurface(src_rotated, NULL, surface, &mask_rect);
|
||||
if (!retval) {
|
||||
/* The last step gets the color values in place. The ADD blend mode simply adds them to
|
||||
* the destination (where the color values are all zero). However, because the ADD blend
|
||||
* mode modulates the colors with the alpha channel, a surface without an alpha mask needs
|
||||
* to be created. This makes all source pixels opaque and the colors get copied correctly.
|
||||
*/
|
||||
SDL_Surface *src_rotated_rgb;
|
||||
src_rotated_rgb = SDL_CreateRGBSurfaceFrom(src_rotated->pixels, src_rotated->w, src_rotated->h,
|
||||
src_rotated->format->BitsPerPixel, src_rotated->pitch,
|
||||
src_rotated->format->Rmask, src_rotated->format->Gmask,
|
||||
src_rotated->format->Bmask, 0);
|
||||
if (src_rotated_rgb == NULL) {
|
||||
retval = -1;
|
||||
} else {
|
||||
SDL_SetSurfaceBlendMode(src_rotated_rgb, SDL_BLENDMODE_ADD);
|
||||
retval = SDL_BlitSurface(src_rotated_rgb, NULL, surface, &tmp_rect);
|
||||
SDL_FreeSurface(src_rotated_rgb);
|
||||
}
|
||||
}
|
||||
}
|
||||
SDL_FreeSurface(mask_rotated);
|
||||
}
|
||||
if (src_rotated != NULL) {
|
||||
SDL_FreeSurface(src_rotated);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (surface_scaled != src) {
|
||||
SDL_FreeSurface(surface_scaled);
|
||||
if (SDL_MUSTLOCK(src)) {
|
||||
SDL_UnlockSurface(src);
|
||||
}
|
||||
if (mask != NULL) {
|
||||
SDL_FreeSurface(mask);
|
||||
}
|
||||
if (src_clone != NULL) {
|
||||
SDL_FreeSurface(src_clone);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
@@ -733,19 +838,14 @@ SW_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
|
||||
SDL_Surface *surface = SW_ActivateRenderer(renderer);
|
||||
Uint32 src_format;
|
||||
void *src_pixels;
|
||||
SDL_Rect final_rect;
|
||||
|
||||
if (!surface) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (renderer->viewport.x || renderer->viewport.y) {
|
||||
final_rect.x = renderer->viewport.x + rect->x;
|
||||
final_rect.y = renderer->viewport.y + rect->y;
|
||||
final_rect.w = rect->w;
|
||||
final_rect.h = rect->h;
|
||||
rect = &final_rect;
|
||||
}
|
||||
/* NOTE: The rect is already adjusted according to the viewport by
|
||||
* SDL_RenderReadPixels.
|
||||
*/
|
||||
|
||||
if (rect->x < 0 || rect->x+rect->w > surface->w ||
|
||||
rect->y < 0 || rect->y+rect->h > surface->h) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -76,11 +76,6 @@ to a situation where the program can segfault.
|
||||
*/
|
||||
#define GUARD_ROWS (2)
|
||||
|
||||
/* !
|
||||
\brief Lower limit of absolute zoom factor or rotation degrees.
|
||||
*/
|
||||
#define VALUE_LIMIT 0.001
|
||||
|
||||
/* !
|
||||
\brief Returns colorkey info for a surface
|
||||
*/
|
||||
@@ -142,7 +137,7 @@ SDLgfx_rotozoomSurfaceSizeTrig(int width, int height, double angle,
|
||||
cy = *cangle * y;
|
||||
sx = *sangle * x;
|
||||
sy = *sangle * y;
|
||||
|
||||
|
||||
dstwidthhalf = MAX((int)
|
||||
SDL_ceil(MAX(MAX(MAX(SDL_fabs(cx + sy), SDL_fabs(cx - sy)), SDL_fabs(-cx + sy)), SDL_fabs(-cx - sy))), 1);
|
||||
dstheighthalf = MAX((int)
|
||||
@@ -262,7 +257,7 @@ _transformSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int
|
||||
dy = (sdy >> 16);
|
||||
if (flipx) dx = sw - dx;
|
||||
if (flipy) dy = sh - dy;
|
||||
if ((unsigned)dx < (unsigned)sw && (unsigned)dy < (unsigned)sh) {
|
||||
if ((dx > -1) && (dy > -1) && (dx < (src->w-1)) && (dy < (src->h-1))) {
|
||||
sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy) + dx;
|
||||
c00 = *sp;
|
||||
sp += 1;
|
||||
@@ -390,10 +385,14 @@ transformSurfaceY(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin
|
||||
/* !
|
||||
\brief Rotates and zooms a surface with different horizontal and vertival scaling factors and optional anti-aliasing.
|
||||
|
||||
Rotates a 32bit or 8bit 'src' surface to newly created 'dst' surface.
|
||||
Rotates a 32-bit or 8-bit 'src' surface to newly created 'dst' surface.
|
||||
'angle' is the rotation in degrees, 'centerx' and 'centery' the rotation center. If 'smooth' is set
|
||||
then the destination 32bit surface is anti-aliased. If the surface is not 8bit
|
||||
or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
|
||||
then the destination 32-bit surface is anti-aliased. 8-bit surfaces must have a colorkey. 32-bit
|
||||
surfaces must have a 8888 layout with red, green, blue and alpha masks (any ordering goes).
|
||||
The blend mode of the 'src' surface has some effects on generation of the 'dst' surface: The NONE
|
||||
mode will set the BLEND mode on the 'dst' surface. The MOD mode either generates a white 'dst'
|
||||
surface and sets the colorkey or fills the it with the colorkey before copying the pixels.
|
||||
When using the NONE and MOD modes, color and alpha modulation must be applied before using this function.
|
||||
|
||||
\param src The surface to rotozoom.
|
||||
\param angle The angle to rotate in degrees.
|
||||
@@ -413,69 +412,47 @@ or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
|
||||
SDL_Surface *
|
||||
SDLgfx_rotateSurface(SDL_Surface * src, double angle, int centerx, int centery, int smooth, int flipx, int flipy, int dstwidth, int dstheight, double cangle, double sangle)
|
||||
{
|
||||
SDL_Surface *rz_src;
|
||||
SDL_Surface *rz_dst;
|
||||
int is32bit, angle90;
|
||||
int is8bit, angle90;
|
||||
int i;
|
||||
Uint8 r = 0, g = 0, b = 0;
|
||||
SDL_BlendMode blendmode;
|
||||
Uint32 colorkey = 0;
|
||||
int colorKeyAvailable = 0;
|
||||
int colorKeyAvailable = SDL_FALSE;
|
||||
double sangleinv, cangleinv;
|
||||
|
||||
/*
|
||||
* Sanity check
|
||||
*/
|
||||
/* Sanity check */
|
||||
if (src == NULL)
|
||||
return (NULL);
|
||||
return NULL;
|
||||
|
||||
if (src->flags & SDL_TRUE/* SDL_SRCCOLORKEY */)
|
||||
{
|
||||
colorkey = _colorkey(src);
|
||||
SDL_GetRGB(colorkey, src->format, &r, &g, &b);
|
||||
colorKeyAvailable = 1;
|
||||
}
|
||||
/*
|
||||
* Determine if source surface is 32bit or 8bit
|
||||
*/
|
||||
is32bit = (src->format->BitsPerPixel == 32);
|
||||
if ((is32bit) || (src->format->BitsPerPixel == 8)) {
|
||||
/*
|
||||
* Use source surface 'as is'
|
||||
*/
|
||||
rz_src = src;
|
||||
} else {
|
||||
rz_src = SDL_ConvertSurfaceFormat(src, SDL_PIXELFORMAT_ARGB32, src->flags);
|
||||
if (rz_src == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
is32bit = 1;
|
||||
if (SDL_GetColorKey(src, &colorkey) == 0) {
|
||||
colorKeyAvailable = SDL_TRUE;
|
||||
}
|
||||
|
||||
/* Determine target size */
|
||||
/* _rotozoomSurfaceSizeTrig(rz_src->w, rz_src->h, angle, &dstwidth, &dstheight, &cangle, &sangle); */
|
||||
/* This function requires a 32-bit surface or 8-bit surface with a colorkey */
|
||||
is8bit = src->format->BitsPerPixel == 8 && colorKeyAvailable;
|
||||
if (!(is8bit || (src->format->BitsPerPixel == 32 && src->format->Amask)))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Calculate target factors from sin/cos and zoom
|
||||
*/
|
||||
/* Calculate target factors from sin/cos and zoom */
|
||||
sangleinv = sangle*65536.0;
|
||||
cangleinv = cangle*65536.0;
|
||||
|
||||
/*
|
||||
* Alloc space to completely contain the rotated surface
|
||||
*/
|
||||
if (is32bit) {
|
||||
/*
|
||||
* Target surface is 32bit with source RGBA/ABGR ordering
|
||||
*/
|
||||
rz_dst =
|
||||
SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32,
|
||||
rz_src->format->Rmask, rz_src->format->Gmask,
|
||||
rz_src->format->Bmask, rz_src->format->Amask);
|
||||
/* Alloc space to completely contain the rotated surface */
|
||||
rz_dst = NULL;
|
||||
if (is8bit) {
|
||||
/* Target surface is 8 bit */
|
||||
rz_dst = SDL_CreateRGBSurface(0, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0);
|
||||
if (rz_dst != NULL) {
|
||||
for (i = 0; i < src->format->palette->ncolors; i++) {
|
||||
rz_dst->format->palette->colors[i] = src->format->palette->colors[i];
|
||||
}
|
||||
rz_dst->format->palette->ncolors = src->format->palette->ncolors;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Target surface is 8bit
|
||||
*/
|
||||
rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0);
|
||||
/* Target surface is 32 bit with source RGBA ordering */
|
||||
rz_dst = SDL_CreateRGBSurface(0, dstwidth, dstheight + GUARD_ROWS, 32,
|
||||
src->format->Rmask, src->format->Gmask,
|
||||
src->format->Bmask, src->format->Amask);
|
||||
}
|
||||
|
||||
/* Check target */
|
||||
@@ -485,17 +462,32 @@ SDLgfx_rotateSurface(SDL_Surface * src, double angle, int centerx, int centery,
|
||||
/* Adjust for guard rows */
|
||||
rz_dst->h = dstheight;
|
||||
|
||||
if (colorKeyAvailable == 1){
|
||||
colorkey = SDL_MapRGB(rz_dst->format, r, g, b);
|
||||
SDL_GetSurfaceBlendMode(src, &blendmode);
|
||||
|
||||
SDL_FillRect(rz_dst, NULL, colorkey );
|
||||
if (colorKeyAvailable == SDL_TRUE) {
|
||||
/* If available, the colorkey will be used to discard the pixels that are outside of the rotated area. */
|
||||
SDL_SetColorKey(rz_dst, SDL_TRUE, colorkey);
|
||||
SDL_FillRect(rz_dst, NULL, colorkey);
|
||||
} else if (blendmode == SDL_BLENDMODE_NONE) {
|
||||
blendmode = SDL_BLENDMODE_BLEND;
|
||||
} else if (blendmode == SDL_BLENDMODE_MOD) {
|
||||
/* Without a colorkey, the target texture has to be white for the MOD blend mode so
|
||||
* that the pixels outside the rotated area don't affect the destination surface.
|
||||
*/
|
||||
colorkey = SDL_MapRGBA(rz_dst->format, 255, 255, 255, 0);
|
||||
SDL_FillRect(rz_dst, NULL, colorkey);
|
||||
/* Setting a white colorkey for the destination surface makes the final blit discard
|
||||
* all pixels outside of the rotated area. This doesn't interfere with anything because
|
||||
* white pixels are already a no-op and the MOD blend mode does not interact with alpha.
|
||||
*/
|
||||
SDL_SetColorKey(rz_dst, SDL_TRUE, colorkey);
|
||||
}
|
||||
|
||||
/*
|
||||
* Lock source surface
|
||||
*/
|
||||
if (SDL_MUSTLOCK(rz_src)) {
|
||||
SDL_LockSurface(rz_src);
|
||||
SDL_SetSurfaceBlendMode(rz_dst, blendmode);
|
||||
|
||||
/* Lock source surface */
|
||||
if (SDL_MUSTLOCK(src)) {
|
||||
SDL_LockSurface(src);
|
||||
}
|
||||
|
||||
/* check if the rotation is a multiple of 90 degrees so we can take a fast path and also somewhat reduce
|
||||
@@ -510,70 +502,29 @@ SDLgfx_rotateSurface(SDL_Surface * src, double angle, int centerx, int centery,
|
||||
angle90 = -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check which kind of surface we have
|
||||
*/
|
||||
if (is32bit) {
|
||||
/*
|
||||
* Call the 32bit transformation routine to do the rotation (using alpha)
|
||||
*/
|
||||
if (angle90 >= 0) {
|
||||
transformSurfaceRGBA90(rz_src, rz_dst, angle90, flipx, flipy);
|
||||
} else {
|
||||
_transformSurfaceRGBA(rz_src, rz_dst, centerx, centery, (int) (sangleinv), (int) (cangleinv), flipx, flipy, smooth);
|
||||
}
|
||||
/*
|
||||
* Turn on source-alpha support
|
||||
*/
|
||||
/* SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255); */
|
||||
SDL_SetColorKey(rz_dst, /* SDL_SRCCOLORKEY */ SDL_TRUE | SDL_RLEACCEL, _colorkey(rz_src));
|
||||
} else {
|
||||
/*
|
||||
* Copy palette and colorkey info
|
||||
*/
|
||||
for (i = 0; i < rz_src->format->palette->ncolors; i++) {
|
||||
rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i];
|
||||
}
|
||||
rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors;
|
||||
/*
|
||||
* Call the 8bit transformation routine to do the rotation
|
||||
*/
|
||||
if (is8bit) {
|
||||
/* Call the 8-bit transformation routine to do the rotation */
|
||||
if(angle90 >= 0) {
|
||||
transformSurfaceY90(rz_src, rz_dst, angle90, flipx, flipy);
|
||||
transformSurfaceY90(src, rz_dst, angle90, flipx, flipy);
|
||||
} else {
|
||||
transformSurfaceY(rz_src, rz_dst, centerx, centery, (int)(sangleinv), (int)(cangleinv), flipx, flipy);
|
||||
transformSurfaceY(src, rz_dst, centerx, centery, (int)sangleinv, (int)cangleinv,
|
||||
flipx, flipy);
|
||||
}
|
||||
} else {
|
||||
/* Call the 32-bit transformation routine to do the rotation */
|
||||
if (angle90 >= 0) {
|
||||
transformSurfaceRGBA90(src, rz_dst, angle90, flipx, flipy);
|
||||
} else {
|
||||
_transformSurfaceRGBA(src, rz_dst, centerx, centery, (int)sangleinv, (int)cangleinv,
|
||||
flipx, flipy, smooth);
|
||||
}
|
||||
SDL_SetColorKey(rz_dst, /* SDL_SRCCOLORKEY */ SDL_TRUE | SDL_RLEACCEL, _colorkey(rz_src));
|
||||
}
|
||||
|
||||
/* copy alpha mod, color mod, and blend mode */
|
||||
{
|
||||
SDL_BlendMode blendMode;
|
||||
Uint8 alphaMod, cr, cg, cb;
|
||||
SDL_GetSurfaceAlphaMod(src, &alphaMod);
|
||||
SDL_GetSurfaceBlendMode(src, &blendMode);
|
||||
SDL_GetSurfaceColorMod(src, &cr, &cg, &cb);
|
||||
SDL_SetSurfaceAlphaMod(rz_dst, alphaMod);
|
||||
SDL_SetSurfaceBlendMode(rz_dst, blendMode);
|
||||
SDL_SetSurfaceColorMod(rz_dst, cr, cg, cb);
|
||||
/* Unlock source surface */
|
||||
if (SDL_MUSTLOCK(src)) {
|
||||
SDL_UnlockSurface(src);
|
||||
}
|
||||
|
||||
/*
|
||||
* Unlock source surface
|
||||
*/
|
||||
if (SDL_MUSTLOCK(rz_src)) {
|
||||
SDL_UnlockSurface(rz_src);
|
||||
}
|
||||
|
||||
/*
|
||||
* Cleanup temp surface
|
||||
*/
|
||||
if (rz_src != src) {
|
||||
SDL_FreeSurface(rz_src);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return destination surface
|
||||
*/
|
||||
return (rz_dst);
|
||||
/* Return rotated surface */
|
||||
return rz_dst;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
Reference in New Issue
Block a user