Update SDL3 from 3.2.4 to 3.2.20
This commit is contained in:
+367
-316
File diff suppressed because it is too large
Load Diff
@@ -34,6 +34,7 @@ extern "C" {
|
||||
|
||||
typedef enum SDL_TextureAddressMode
|
||||
{
|
||||
SDL_TEXTURE_ADDRESS_INVALID = -1,
|
||||
SDL_TEXTURE_ADDRESS_AUTO,
|
||||
SDL_TEXTURE_ADDRESS_CLAMP,
|
||||
SDL_TEXTURE_ADDRESS_WRAP,
|
||||
@@ -65,8 +66,15 @@ typedef struct SDL_RenderViewState
|
||||
SDL_Rect pixel_clip_rect;
|
||||
bool clipping_enabled;
|
||||
SDL_FPoint scale;
|
||||
|
||||
// Support for logical output coordinates
|
||||
SDL_RendererLogicalPresentation logical_presentation_mode;
|
||||
int logical_w, logical_h;
|
||||
SDL_FRect logical_src_rect;
|
||||
SDL_FRect logical_dst_rect;
|
||||
SDL_FPoint logical_scale;
|
||||
SDL_FPoint logical_offset;
|
||||
|
||||
SDL_FPoint current_scale; // this is just `scale * logical_scale`, precalculated, since we use it a lot.
|
||||
} SDL_RenderViewState;
|
||||
|
||||
@@ -148,6 +156,7 @@ typedef struct SDL_RenderCommand
|
||||
SDL_FColor color;
|
||||
SDL_BlendMode blend;
|
||||
SDL_Texture *texture;
|
||||
SDL_ScaleMode texture_scale_mode;
|
||||
SDL_TextureAddressMode texture_address_mode;
|
||||
} draw;
|
||||
struct
|
||||
@@ -217,7 +226,6 @@ struct SDL_Renderer
|
||||
bool (*LockTexture)(SDL_Renderer *renderer, SDL_Texture *texture,
|
||||
const SDL_Rect *rect, void **pixels, int *pitch);
|
||||
void (*UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture);
|
||||
void (*SetTextureScaleMode)(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode);
|
||||
bool (*SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture);
|
||||
SDL_Surface *(*RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect);
|
||||
bool (*RenderPresent)(SDL_Renderer *renderer);
|
||||
@@ -248,18 +256,9 @@ struct SDL_Renderer
|
||||
Uint64 simulate_vsync_interval_ns;
|
||||
Uint64 last_present;
|
||||
|
||||
// Support for logical output coordinates
|
||||
SDL_RendererLogicalPresentation logical_presentation_mode;
|
||||
int logical_w, logical_h;
|
||||
SDL_FRect logical_src_rect;
|
||||
SDL_FRect logical_dst_rect;
|
||||
|
||||
SDL_RenderViewState *view;
|
||||
SDL_RenderViewState main_view;
|
||||
|
||||
// Cache the output size in pixels
|
||||
int output_pixel_w, output_pixel_h;
|
||||
|
||||
// The window pixel to point coordinate scale
|
||||
SDL_FPoint dpi_scale;
|
||||
|
||||
@@ -339,9 +338,6 @@ extern SDL_RenderDriver GPU_RenderDriver;
|
||||
// Clean up any renderers at shutdown
|
||||
extern void SDL_QuitRender(void);
|
||||
|
||||
// Handle window events for a renderer
|
||||
extern void SDL_RendererEventWatch(SDL_Renderer *renderer, SDL_Event *event);
|
||||
|
||||
// Add a supported texture format to a renderer
|
||||
extern bool SDL_AddSupportedTextureFormat(SDL_Renderer *renderer, SDL_PixelFormat format);
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ typedef struct
|
||||
bool updateSize;
|
||||
bool beginScene;
|
||||
bool enableSeparateAlphaBlend;
|
||||
D3DTEXTUREFILTERTYPE scaleMode[3];
|
||||
SDL_ScaleMode scaleMode[3];
|
||||
SDL_TextureAddressMode addressMode[3];
|
||||
IDirect3DSurface9 *defaultRenderTarget;
|
||||
IDirect3DSurface9 *currentRenderTarget;
|
||||
@@ -89,7 +89,6 @@ typedef struct
|
||||
typedef struct
|
||||
{
|
||||
D3D_TextureRep texture;
|
||||
D3DTEXTUREFILTERTYPE scaleMode;
|
||||
D3D9_Shader shader;
|
||||
const float *shader_params;
|
||||
|
||||
@@ -274,10 +273,14 @@ static void D3D_InitRenderState(D3D_RenderData *data)
|
||||
IDirect3DDevice9_SetTransform(device, D3DTS_VIEW, &matrix);
|
||||
|
||||
// Reset our current scale mode
|
||||
SDL_memset(data->scaleMode, 0xFF, sizeof(data->scaleMode));
|
||||
for (int i = 0; i < SDL_arraysize(data->scaleMode); ++i) {
|
||||
data->scaleMode[i] = SDL_SCALEMODE_INVALID;
|
||||
}
|
||||
|
||||
// Reset our current address mode
|
||||
SDL_zeroa(data->addressMode);
|
||||
for (int i = 0; i < SDL_arraysize(data->addressMode); ++i) {
|
||||
data->addressMode[i] = SDL_TEXTURE_ADDRESS_INVALID;
|
||||
}
|
||||
|
||||
// Start the render with beginScene
|
||||
data->beginScene = true;
|
||||
@@ -533,7 +536,6 @@ static bool D3D_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
|
||||
if (!texturedata) {
|
||||
return false;
|
||||
}
|
||||
texturedata->scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? D3DTEXF_POINT : D3DTEXF_LINEAR;
|
||||
|
||||
texture->internal = texturedata;
|
||||
|
||||
@@ -736,17 +738,6 @@ static void D3D_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
}
|
||||
}
|
||||
|
||||
static void D3D_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
|
||||
|
||||
if (!texturedata) {
|
||||
return;
|
||||
}
|
||||
|
||||
texturedata->scaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? D3DTEXF_POINT : D3DTEXF_LINEAR;
|
||||
}
|
||||
|
||||
static bool D3D_SetRenderTargetInternal(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
|
||||
@@ -926,12 +917,22 @@ static bool BindTextureRep(IDirect3DDevice9 *device, D3D_TextureRep *texture, DW
|
||||
return true;
|
||||
}
|
||||
|
||||
static void UpdateTextureScaleMode(D3D_RenderData *data, D3D_TextureData *texturedata, unsigned index)
|
||||
static void UpdateTextureScaleMode(D3D_RenderData *data, SDL_ScaleMode scaleMode, unsigned index)
|
||||
{
|
||||
if (texturedata->scaleMode != data->scaleMode[index]) {
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MINFILTER, texturedata->scaleMode);
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MAGFILTER, texturedata->scaleMode);
|
||||
data->scaleMode[index] = texturedata->scaleMode;
|
||||
if (scaleMode != data->scaleMode[index]) {
|
||||
switch (scaleMode) {
|
||||
case SDL_SCALEMODE_NEAREST:
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MINFILTER, D3DTEXF_POINT);
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
|
||||
break;
|
||||
case SDL_SCALEMODE_LINEAR:
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
data->scaleMode[index] = scaleMode;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -954,7 +955,7 @@ static void UpdateTextureAddressMode(D3D_RenderData *data, SDL_TextureAddressMod
|
||||
}
|
||||
}
|
||||
|
||||
static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, SDL_TextureAddressMode addressMode, D3D9_Shader *shader, const float **shader_params)
|
||||
static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, D3D9_Shader *shader, const float **shader_params)
|
||||
{
|
||||
D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
|
||||
|
||||
@@ -962,9 +963,6 @@ static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, SDL_Te
|
||||
return SDL_SetError("Texture is not currently available");
|
||||
}
|
||||
|
||||
UpdateTextureScaleMode(data, texturedata, 0);
|
||||
UpdateTextureAddressMode(data, addressMode, 0);
|
||||
|
||||
*shader = texturedata->shader;
|
||||
*shader_params = texturedata->shader_params;
|
||||
|
||||
@@ -973,11 +971,6 @@ static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, SDL_Te
|
||||
}
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (texturedata->yuv) {
|
||||
UpdateTextureScaleMode(data, texturedata, 1);
|
||||
UpdateTextureScaleMode(data, texturedata, 2);
|
||||
UpdateTextureAddressMode(data, addressMode, 1);
|
||||
UpdateTextureAddressMode(data, addressMode, 2);
|
||||
|
||||
if (!BindTextureRep(data->device, &texturedata->utexture, 1)) {
|
||||
return false;
|
||||
}
|
||||
@@ -1012,7 +1005,7 @@ static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
|
||||
IDirect3DDevice9_SetTexture(data->device, 2, NULL);
|
||||
}
|
||||
#endif
|
||||
if (texture && !SetupTextureState(data, texture, cmd->data.draw.texture_address_mode, &shader, &shader_params)) {
|
||||
if (texture && !SetupTextureState(data, texture, &shader, &shader_params)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1040,13 +1033,30 @@ static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
|
||||
data->drawstate.texture = texture;
|
||||
} else if (texture) {
|
||||
D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
|
||||
UpdateDirtyTexture(data->device, &texturedata->texture);
|
||||
if (texturedata) {
|
||||
UpdateDirtyTexture(data->device, &texturedata->texture);
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (texturedata->yuv) {
|
||||
UpdateDirtyTexture(data->device, &texturedata->utexture);
|
||||
UpdateDirtyTexture(data->device, &texturedata->vtexture);
|
||||
if (texturedata->yuv) {
|
||||
UpdateDirtyTexture(data->device, &texturedata->utexture);
|
||||
UpdateDirtyTexture(data->device, &texturedata->vtexture);
|
||||
}
|
||||
#endif // SDL_HAVE_YUV
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (texture) {
|
||||
UpdateTextureScaleMode(data, cmd->data.draw.texture_scale_mode, 0);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode, 0);
|
||||
|
||||
#ifdef SDL_HAVE_YUV
|
||||
D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
|
||||
if (texturedata && texturedata->yuv) {
|
||||
UpdateTextureScaleMode(data, cmd->data.draw.texture_scale_mode, 1);
|
||||
UpdateTextureScaleMode(data, cmd->data.draw.texture_scale_mode, 2);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode, 1);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode, 2);
|
||||
}
|
||||
#endif // SDL_HAVE_YUV
|
||||
}
|
||||
|
||||
if (blend != data->drawstate.blend) {
|
||||
@@ -1653,7 +1663,6 @@ static bool D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
|
||||
#endif
|
||||
renderer->LockTexture = D3D_LockTexture;
|
||||
renderer->UnlockTexture = D3D_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = D3D_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = D3D_SetRenderTarget;
|
||||
renderer->QueueSetViewport = D3D_QueueNoOp;
|
||||
renderer->QueueSetDrawColor = D3D_QueueNoOp;
|
||||
|
||||
@@ -122,7 +122,6 @@ typedef struct
|
||||
ID3D11Texture2D *stagingTexture;
|
||||
int lockedTexturePositionX;
|
||||
int lockedTexturePositionY;
|
||||
D3D11_FILTER scaleMode;
|
||||
D3D11_Shader shader;
|
||||
const float *YCbCr_matrix;
|
||||
#ifdef SDL_HAVE_YUV
|
||||
@@ -231,11 +230,14 @@ SDL_PixelFormat D3D11_DXGIFormatToSDLPixelFormat(DXGI_FORMAT dxgiFormat)
|
||||
case DXGI_FORMAT_B8G8R8A8_UNORM:
|
||||
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
|
||||
return SDL_PIXELFORMAT_ARGB8888;
|
||||
case DXGI_FORMAT_R8G8B8A8_UNORM:
|
||||
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
|
||||
return SDL_PIXELFORMAT_ABGR8888;
|
||||
case DXGI_FORMAT_B8G8R8X8_UNORM:
|
||||
case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
|
||||
return SDL_PIXELFORMAT_XRGB8888;
|
||||
case DXGI_FORMAT_R10G10B10A2_UNORM:
|
||||
return SDL_PIXELFORMAT_XBGR2101010;
|
||||
return SDL_PIXELFORMAT_ABGR2101010;
|
||||
case DXGI_FORMAT_R16G16B16A16_FLOAT:
|
||||
return SDL_PIXELFORMAT_RGBA64_FLOAT;
|
||||
default:
|
||||
@@ -248,13 +250,18 @@ static DXGI_FORMAT SDLPixelFormatToDXGITextureFormat(Uint32 format, Uint32 outpu
|
||||
switch (format) {
|
||||
case SDL_PIXELFORMAT_RGBA64_FLOAT:
|
||||
return DXGI_FORMAT_R16G16B16A16_FLOAT;
|
||||
case SDL_PIXELFORMAT_XBGR2101010:
|
||||
case SDL_PIXELFORMAT_ABGR2101010:
|
||||
return DXGI_FORMAT_R10G10B10A2_UNORM;
|
||||
case SDL_PIXELFORMAT_ARGB8888:
|
||||
if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
|
||||
}
|
||||
return DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
case SDL_PIXELFORMAT_ABGR8888:
|
||||
if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
|
||||
}
|
||||
return DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||
case SDL_PIXELFORMAT_XRGB8888:
|
||||
if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
|
||||
@@ -278,13 +285,18 @@ static DXGI_FORMAT SDLPixelFormatToDXGIMainResourceViewFormat(Uint32 format, Uin
|
||||
switch (format) {
|
||||
case SDL_PIXELFORMAT_RGBA64_FLOAT:
|
||||
return DXGI_FORMAT_R16G16B16A16_FLOAT;
|
||||
case SDL_PIXELFORMAT_XBGR2101010:
|
||||
case SDL_PIXELFORMAT_ABGR2101010:
|
||||
return DXGI_FORMAT_R10G10B10A2_UNORM;
|
||||
case SDL_PIXELFORMAT_ARGB8888:
|
||||
if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
|
||||
}
|
||||
return DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
case SDL_PIXELFORMAT_ABGR8888:
|
||||
if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
|
||||
}
|
||||
return DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||
case SDL_PIXELFORMAT_XRGB8888:
|
||||
if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
|
||||
@@ -1159,7 +1171,6 @@ static bool D3D11_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
||||
if (!textureData) {
|
||||
return false;
|
||||
}
|
||||
textureData->scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? D3D11_FILTER_MIN_MAG_MIP_POINT : D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
||||
|
||||
texture->internal = textureData;
|
||||
|
||||
@@ -1783,17 +1794,6 @@ static void D3D11_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
SAFE_RELEASE(textureData->stagingTexture);
|
||||
}
|
||||
|
||||
static void D3D11_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
|
||||
|
||||
if (!textureData) {
|
||||
return;
|
||||
}
|
||||
|
||||
textureData->scaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? D3D11_FILTER_MIN_MAG_MIP_POINT : D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
||||
}
|
||||
|
||||
static bool D3D11_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
|
||||
@@ -2305,8 +2305,8 @@ static bool D3D11_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
||||
|
||||
D3D11_SetupShaderConstants(renderer, cmd, texture, &constants);
|
||||
|
||||
switch (textureData->scaleMode) {
|
||||
case D3D11_FILTER_MIN_MAG_MIP_POINT:
|
||||
switch (cmd->data.draw.texture_scale_mode) {
|
||||
case SDL_SCALEMODE_NEAREST:
|
||||
switch (cmd->data.draw.texture_address_mode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
textureSampler = rendererData->samplers[D3D11_SAMPLER_NEAREST_CLAMP];
|
||||
@@ -2318,7 +2318,7 @@ static bool D3D11_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
||||
return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
|
||||
}
|
||||
break;
|
||||
case D3D11_FILTER_MIN_MAG_MIP_LINEAR:
|
||||
case SDL_SCALEMODE_LINEAR:
|
||||
switch (cmd->data.draw.texture_address_mode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
textureSampler = rendererData->samplers[D3D11_SAMPLER_LINEAR_CLAMP];
|
||||
@@ -2331,7 +2331,7 @@ static bool D3D11_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("Unknown scale mode: %d", textureData->scaleMode);
|
||||
return SDL_SetError("Unknown scale mode: %d", cmd->data.draw.texture_scale_mode);
|
||||
}
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (textureData->yuv) {
|
||||
@@ -2699,7 +2699,6 @@ static bool D3D11_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
|
||||
#endif
|
||||
renderer->LockTexture = D3D11_LockTexture;
|
||||
renderer->UnlockTexture = D3D11_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = D3D11_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = D3D11_SetRenderTarget;
|
||||
renderer->QueueSetViewport = D3D11_QueueNoOp;
|
||||
renderer->QueueSetDrawColor = D3D11_QueueNoOp;
|
||||
@@ -2718,8 +2717,9 @@ static bool D3D11_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
|
||||
|
||||
renderer->name = D3D11_RenderDriver.name;
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR2101010);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
|
||||
|
||||
@@ -685,12 +685,12 @@ attributes #2 = { nounwind readonly }
|
||||
#endif
|
||||
|
||||
const unsigned char g_main[] = {
|
||||
0x44, 0x58, 0x42, 0x43, 0x2b, 0xe5, 0x43, 0x0a, 0x03, 0x52, 0x0f, 0x2c,
|
||||
0xe8, 0x70, 0xa0, 0x5e, 0x29, 0xbe, 0x51, 0x24, 0x01, 0x00, 0x00, 0x00,
|
||||
0xc1, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||
0x44, 0x58, 0x42, 0x43, 0x78, 0xad, 0xb4, 0x13, 0x3d, 0x52, 0x26, 0xa9,
|
||||
0x43, 0x6f, 0x29, 0xd4, 0x3d, 0xe5, 0x45, 0x27, 0x01, 0x00, 0x00, 0x00,
|
||||
0xd9, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||
0x50, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00,
|
||||
0x61, 0x02, 0x00, 0x00, 0x49, 0x03, 0x00, 0x00, 0xc1, 0x0c, 0x00, 0x00,
|
||||
0xdd, 0x0c, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
|
||||
0x61, 0x02, 0x00, 0x00, 0x61, 0x03, 0x00, 0x00, 0xd9, 0x0c, 0x00, 0x00,
|
||||
0xf5, 0x0c, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31,
|
||||
0x83, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@@ -736,23 +736,25 @@ const unsigned char g_main[] = {
|
||||
0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53,
|
||||
0x30, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
|
||||
0x30, 0xf8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
|
||||
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00,
|
||||
0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00,
|
||||
0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
|
||||
0xff, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xff, 0x01, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00,
|
||||
0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||
0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||
0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00,
|
||||
0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
|
||||
0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
|
||||
0xff, 0x53, 0x54, 0x41, 0x54, 0x70, 0x09, 0x00, 0x00, 0x60, 0x00, 0x00,
|
||||
|
||||
@@ -152,12 +152,12 @@ attributes #2 = { nounwind readonly }
|
||||
#endif
|
||||
|
||||
const unsigned char g_main[] = {
|
||||
0x44, 0x58, 0x42, 0x43, 0x02, 0x08, 0x1c, 0x9e, 0xe7, 0x83, 0x00, 0x57,
|
||||
0x68, 0x79, 0x21, 0xa9, 0x0a, 0xf5, 0x0a, 0xa7, 0x01, 0x00, 0x00, 0x00,
|
||||
0x99, 0x0f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||
0x44, 0x58, 0x42, 0x43, 0xe0, 0x6a, 0x51, 0x4c, 0x14, 0x1a, 0x6a, 0x67,
|
||||
0x04, 0x23, 0x10, 0x54, 0xf8, 0xe3, 0xa6, 0x1a, 0x01, 0x00, 0x00, 0x00,
|
||||
0xb1, 0x0f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||
0x50, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00,
|
||||
0x01, 0x02, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x6d, 0x09, 0x00, 0x00,
|
||||
0x89, 0x09, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
|
||||
0x01, 0x02, 0x00, 0x00, 0x51, 0x02, 0x00, 0x00, 0x85, 0x09, 0x00, 0x00,
|
||||
0xa1, 0x09, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31,
|
||||
0x83, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@@ -195,10 +195,12 @@ const unsigned char g_main[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53,
|
||||
0x30, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
|
||||
0x30, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00,
|
||||
0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x18, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0x2c, 0x07, 0x00,
|
||||
0x00, 0x60, 0x00, 0x00, 0x00, 0xcb, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49,
|
||||
0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x07, 0x00,
|
||||
|
||||
@@ -180,12 +180,12 @@ attributes #2 = { nounwind readonly }
|
||||
#endif
|
||||
|
||||
const unsigned char g_main[] = {
|
||||
0x44, 0x58, 0x42, 0x43, 0x7e, 0x01, 0x52, 0x7e, 0xc9, 0xe3, 0xe4, 0xf6,
|
||||
0x3d, 0xab, 0x9a, 0xb9, 0xeb, 0xf9, 0xcb, 0xde, 0x01, 0x00, 0x00, 0x00,
|
||||
0xc9, 0x12, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||
0x44, 0x58, 0x42, 0x43, 0xb2, 0xdd, 0x4e, 0x8d, 0x7f, 0x3c, 0x1f, 0x5e,
|
||||
0x6f, 0x0e, 0x03, 0xe7, 0x8c, 0xce, 0x62, 0x95, 0x01, 0x00, 0x00, 0x00,
|
||||
0xe1, 0x12, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||
0x50, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00,
|
||||
0x31, 0x02, 0x00, 0x00, 0xc1, 0x02, 0x00, 0x00, 0x19, 0x0b, 0x00, 0x00,
|
||||
0x35, 0x0b, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
|
||||
0x31, 0x02, 0x00, 0x00, 0xd9, 0x02, 0x00, 0x00, 0x31, 0x0b, 0x00, 0x00,
|
||||
0x4d, 0x0b, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31,
|
||||
0x83, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@@ -227,16 +227,18 @@ const unsigned char g_main[] = {
|
||||
0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53,
|
||||
0x30, 0x88, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
|
||||
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00,
|
||||
0x30, 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
|
||||
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00,
|
||||
0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x68, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00,
|
||||
0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
|
||||
0xff, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
|
||||
0xff, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x53, 0x54, 0x41,
|
||||
0x54, 0x50, 0x08, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x14, 0x02, 0x00,
|
||||
|
||||
@@ -3,8 +3,8 @@ Disassembly failed
|
||||
#endif
|
||||
|
||||
const unsigned char g_AdvancedRS[] = {
|
||||
0x44, 0x58, 0x42, 0x43, 0xc2, 0xcd, 0x2f, 0xaf, 0x3b, 0x72, 0x07, 0x2a,
|
||||
0xa9, 0x73, 0x1b, 0xab, 0x8e, 0x46, 0xf7, 0x46, 0x01, 0x00, 0x00, 0x00,
|
||||
0x44, 0x58, 0x42, 0x43, 0x61, 0xd8, 0x65, 0x6e, 0x1d, 0x30, 0x64, 0x8a,
|
||||
0x54, 0x75, 0xb7, 0x59, 0xea, 0x11, 0x73, 0xec, 0x01, 0x00, 0x00, 0x00,
|
||||
0x24, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
|
||||
0x52, 0x54, 0x53, 0x30, 0xf8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@@ -16,7 +16,7 @@ const unsigned char g_AdvancedRS[] = {
|
||||
0x05, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00,
|
||||
|
||||
@@ -3,8 +3,8 @@ Disassembly failed
|
||||
#endif
|
||||
|
||||
const unsigned char g_ColorRS[] = {
|
||||
0x44, 0x58, 0x42, 0x43, 0x24, 0x3f, 0x6b, 0x5a, 0xb1, 0xd3, 0x78, 0x2f,
|
||||
0x7f, 0xd4, 0x83, 0xd9, 0x7d, 0x6b, 0xc4, 0x31, 0x01, 0x00, 0x00, 0x00,
|
||||
0x44, 0x58, 0x42, 0x43, 0x1a, 0x67, 0x3b, 0x20, 0xac, 0xdc, 0xbb, 0xa0,
|
||||
0x3c, 0x72, 0xa7, 0xdf, 0x14, 0xa5, 0x3a, 0x2e, 0x01, 0x00, 0x00, 0x00,
|
||||
0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
|
||||
0x52, 0x54, 0x53, 0x30, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@@ -12,5 +12,5 @@ const unsigned char g_ColorRS[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00
|
||||
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
@@ -3,8 +3,8 @@ Disassembly failed
|
||||
#endif
|
||||
|
||||
const unsigned char g_TextureRS[] = {
|
||||
0x44, 0x58, 0x42, 0x43, 0x25, 0x9c, 0x4f, 0xa4, 0x10, 0x16, 0x82, 0x9d,
|
||||
0x3d, 0x46, 0xb7, 0x5d, 0xf0, 0xc2, 0x90, 0xa7, 0x01, 0x00, 0x00, 0x00,
|
||||
0x44, 0x58, 0x42, 0x43, 0xbc, 0x46, 0x63, 0x56, 0xe3, 0xea, 0x41, 0x4c,
|
||||
0xf7, 0x90, 0x24, 0xc2, 0x14, 0x4d, 0x79, 0xdd, 0x01, 0x00, 0x00, 0x00,
|
||||
0xcc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
|
||||
0x52, 0x54, 0x53, 0x30, 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@@ -14,7 +14,7 @@ const unsigned char g_TextureRS[] = {
|
||||
0x05, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00,
|
||||
|
||||
@@ -236,8 +236,8 @@ attributes #2 = { nounwind readonly }
|
||||
#endif
|
||||
|
||||
const unsigned char g_mainAdvanced[] = {
|
||||
0x44, 0x58, 0x42, 0x43, 0x2a, 0x90, 0x76, 0x57, 0x08, 0xab, 0xff, 0xa1,
|
||||
0x21, 0xd0, 0xb4, 0x0c, 0x31, 0xf8, 0x05, 0x5d, 0x01, 0x00, 0x00, 0x00,
|
||||
0x44, 0x58, 0x42, 0x43, 0xff, 0x5d, 0x02, 0x19, 0xed, 0x89, 0xe9, 0x33,
|
||||
0xf6, 0x5b, 0x76, 0x8c, 0x9f, 0x8b, 0x4d, 0xf1, 0x01, 0x00, 0x00, 0x00,
|
||||
0x63, 0x13, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||
0x50, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00,
|
||||
0x87, 0x02, 0x00, 0x00, 0x87, 0x03, 0x00, 0x00, 0x3f, 0x0a, 0x00, 0x00,
|
||||
@@ -300,7 +300,7 @@ const unsigned char g_mainAdvanced[] = {
|
||||
0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
|
||||
0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80,
|
||||
0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||
0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00,
|
||||
|
||||
@@ -236,8 +236,8 @@ attributes #2 = { nounwind readonly }
|
||||
#endif
|
||||
|
||||
const unsigned char g_mainColor[] = {
|
||||
0x44, 0x58, 0x42, 0x43, 0xd2, 0x9c, 0xbb, 0x08, 0x88, 0xc9, 0x51, 0x6d,
|
||||
0x10, 0xea, 0x39, 0xeb, 0x7b, 0xab, 0xdf, 0x50, 0x01, 0x00, 0x00, 0x00,
|
||||
0x44, 0x58, 0x42, 0x43, 0x28, 0x20, 0xca, 0xe8, 0xab, 0xe5, 0x24, 0x7a,
|
||||
0x5d, 0x2b, 0x6f, 0xa4, 0x2c, 0x10, 0xa8, 0xb6, 0x01, 0x00, 0x00, 0x00,
|
||||
0xa3, 0x12, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||
0x50, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00,
|
||||
0x87, 0x02, 0x00, 0x00, 0xd7, 0x02, 0x00, 0x00, 0x87, 0x09, 0x00, 0x00,
|
||||
@@ -296,7 +296,7 @@ const unsigned char g_mainColor[] = {
|
||||
0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0xa8,
|
||||
0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0xa8,
|
||||
0x06, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0xaa, 0x01, 0x00, 0x00, 0x44,
|
||||
0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x90,
|
||||
0x06, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xa1,
|
||||
|
||||
@@ -236,8 +236,8 @@ attributes #2 = { nounwind readonly }
|
||||
#endif
|
||||
|
||||
const unsigned char g_mainTexture[] = {
|
||||
0x44, 0x58, 0x42, 0x43, 0x74, 0x5e, 0x15, 0x62, 0x5c, 0xf4, 0x2a, 0x49,
|
||||
0x52, 0xac, 0x1f, 0x81, 0x9a, 0xff, 0xaa, 0xbf, 0x01, 0x00, 0x00, 0x00,
|
||||
0x44, 0x58, 0x42, 0x43, 0xda, 0xc9, 0x75, 0xea, 0x0d, 0x18, 0xc7, 0xf5,
|
||||
0xb4, 0x80, 0x10, 0xd9, 0xd7, 0x88, 0x5a, 0x23, 0x01, 0x00, 0x00, 0x00,
|
||||
0xff, 0x12, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||
0x50, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00,
|
||||
0x87, 0x02, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0xdf, 0x09, 0x00, 0x00,
|
||||
@@ -298,7 +298,7 @@ const unsigned char g_mainTexture[] = {
|
||||
0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
|
||||
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68,
|
||||
0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||
0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x03,
|
||||
|
||||
@@ -124,7 +124,6 @@ typedef struct
|
||||
DXGI_FORMAT mainTextureFormat;
|
||||
ID3D12Resource *stagingBuffer;
|
||||
D3D12_RESOURCE_STATES stagingResourceState;
|
||||
D3D12_FILTER scaleMode;
|
||||
D3D12_Shader shader;
|
||||
const float *YCbCr_matrix;
|
||||
#ifdef SDL_HAVE_YUV
|
||||
@@ -298,11 +297,14 @@ static SDL_PixelFormat D3D12_DXGIFormatToSDLPixelFormat(DXGI_FORMAT dxgiFormat)
|
||||
case DXGI_FORMAT_B8G8R8A8_UNORM:
|
||||
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
|
||||
return SDL_PIXELFORMAT_ARGB8888;
|
||||
case DXGI_FORMAT_R8G8B8A8_UNORM:
|
||||
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
|
||||
return SDL_PIXELFORMAT_ABGR8888;
|
||||
case DXGI_FORMAT_B8G8R8X8_UNORM:
|
||||
case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
|
||||
return SDL_PIXELFORMAT_XRGB8888;
|
||||
case DXGI_FORMAT_R10G10B10A2_UNORM:
|
||||
return SDL_PIXELFORMAT_XBGR2101010;
|
||||
return SDL_PIXELFORMAT_ABGR2101010;
|
||||
case DXGI_FORMAT_R16G16B16A16_FLOAT:
|
||||
return SDL_PIXELFORMAT_RGBA64_FLOAT;
|
||||
default:
|
||||
@@ -315,13 +317,18 @@ static DXGI_FORMAT SDLPixelFormatToDXGITextureFormat(Uint32 format, Uint32 outpu
|
||||
switch (format) {
|
||||
case SDL_PIXELFORMAT_RGBA64_FLOAT:
|
||||
return DXGI_FORMAT_R16G16B16A16_FLOAT;
|
||||
case SDL_PIXELFORMAT_XBGR2101010:
|
||||
case SDL_PIXELFORMAT_ABGR2101010:
|
||||
return DXGI_FORMAT_R10G10B10A2_UNORM;
|
||||
case SDL_PIXELFORMAT_ARGB8888:
|
||||
if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
|
||||
}
|
||||
return DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
case SDL_PIXELFORMAT_ABGR8888:
|
||||
if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
|
||||
}
|
||||
return DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||
case SDL_PIXELFORMAT_XRGB8888:
|
||||
if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
|
||||
@@ -345,13 +352,18 @@ static DXGI_FORMAT SDLPixelFormatToDXGIMainResourceViewFormat(Uint32 format, Uin
|
||||
switch (format) {
|
||||
case SDL_PIXELFORMAT_RGBA64_FLOAT:
|
||||
return DXGI_FORMAT_R16G16B16A16_FLOAT;
|
||||
case SDL_PIXELFORMAT_XBGR2101010:
|
||||
case SDL_PIXELFORMAT_ABGR2101010:
|
||||
return DXGI_FORMAT_R10G10B10A2_UNORM;
|
||||
case SDL_PIXELFORMAT_ARGB8888:
|
||||
if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
|
||||
}
|
||||
return DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
case SDL_PIXELFORMAT_ABGR8888:
|
||||
if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
|
||||
}
|
||||
return DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||
case SDL_PIXELFORMAT_XRGB8888:
|
||||
if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
|
||||
@@ -1561,7 +1573,6 @@ static bool D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
||||
if (!textureData) {
|
||||
return false;
|
||||
}
|
||||
textureData->scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? D3D12_FILTER_MIN_MAG_MIP_POINT : D3D12_FILTER_MIN_MAG_MIP_LINEAR;
|
||||
|
||||
texture->internal = textureData;
|
||||
textureData->mainTextureFormat = textureFormat;
|
||||
@@ -1979,6 +1990,10 @@ static bool D3D12_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
|
||||
}
|
||||
}
|
||||
#endif // SDL_HAVE_YUV
|
||||
if (textureData->mainTextureResourceView.ptr == rendererData->currentShaderResource.ptr) {
|
||||
// We'll need to rebind this resource after updating it
|
||||
rendererData->currentShaderResource.ptr = 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2005,6 +2020,10 @@ static bool D3D12_UpdateTextureYUV(SDL_Renderer *renderer, SDL_Texture *texture,
|
||||
if (!D3D12_UpdateTextureInternal(rendererData, textureData->mainTextureV, 0, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, Vplane, Vpitch, &textureData->mainResourceStateV)) {
|
||||
return false;
|
||||
}
|
||||
if (textureData->mainTextureResourceView.ptr == rendererData->currentShaderResource.ptr) {
|
||||
// We'll need to rebind this resource after updating it
|
||||
rendererData->currentShaderResource.ptr = 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2023,10 +2042,13 @@ static bool D3D12_UpdateTextureNV(SDL_Renderer *renderer, SDL_Texture *texture,
|
||||
if (!D3D12_UpdateTextureInternal(rendererData, textureData->mainTexture, 0, rect->x, rect->y, rect->w, rect->h, Yplane, Ypitch, &textureData->mainResourceState)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!D3D12_UpdateTextureInternal(rendererData, textureData->mainTexture, 1, rect->x, rect->y, rect->w, rect->h, UVplane, UVpitch, &textureData->mainResourceState)) {
|
||||
return false;
|
||||
}
|
||||
if (textureData->mainTextureResourceView.ptr == rendererData->currentShaderResource.ptr) {
|
||||
// We'll need to rebind this resource after updating it
|
||||
rendererData->currentShaderResource.ptr = 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
@@ -2231,17 +2253,6 @@ static void D3D12_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
D3D_SAFE_RELEASE(textureData->stagingBuffer);
|
||||
}
|
||||
|
||||
static void D3D12_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
|
||||
|
||||
if (!textureData) {
|
||||
return;
|
||||
}
|
||||
|
||||
textureData->scaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? D3D12_FILTER_MIN_MAG_MIP_POINT : D3D12_FILTER_MIN_MAG_MIP_LINEAR;
|
||||
}
|
||||
|
||||
static bool D3D12_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
|
||||
@@ -2732,8 +2743,8 @@ static bool D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
||||
|
||||
D3D12_SetupShaderConstants(renderer, cmd, texture, &constants);
|
||||
|
||||
switch (textureData->scaleMode) {
|
||||
case D3D12_FILTER_MIN_MAG_MIP_POINT:
|
||||
switch (cmd->data.draw.texture_scale_mode) {
|
||||
case SDL_SCALEMODE_NEAREST:
|
||||
switch (cmd->data.draw.texture_address_mode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
textureSampler = &rendererData->samplers[D3D12_SAMPLER_NEAREST_CLAMP];
|
||||
@@ -2745,7 +2756,7 @@ static bool D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
||||
return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
|
||||
}
|
||||
break;
|
||||
case D3D12_FILTER_MIN_MAG_MIP_LINEAR:
|
||||
case SDL_SCALEMODE_LINEAR:
|
||||
switch (cmd->data.draw.texture_address_mode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
textureSampler = &rendererData->samplers[D3D12_SAMPLER_LINEAR_CLAMP];
|
||||
@@ -2758,7 +2769,7 @@ static bool D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("Unknown scale mode: %d", textureData->scaleMode);
|
||||
return SDL_SetError("Unknown scale mode: %d", cmd->data.draw.texture_scale_mode);
|
||||
}
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (textureData->yuv) {
|
||||
@@ -3235,7 +3246,6 @@ bool D3D12_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Proper
|
||||
#endif
|
||||
renderer->LockTexture = D3D12_LockTexture;
|
||||
renderer->UnlockTexture = D3D12_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = D3D12_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = D3D12_SetRenderTarget;
|
||||
renderer->QueueSetViewport = D3D12_QueueNoOp;
|
||||
renderer->QueueSetDrawColor = D3D12_QueueNoOp;
|
||||
@@ -3254,8 +3264,9 @@ bool D3D12_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Proper
|
||||
|
||||
renderer->name = D3D12_RenderDriver.name;
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR2101010);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
|
||||
|
||||
@@ -36,58 +36,50 @@ struct GPU_PipelineCacheKeyStruct
|
||||
Uint64 primitive_type : 3;
|
||||
};
|
||||
|
||||
typedef union GPU_PipelineCacheKey
|
||||
typedef union GPU_PipelineCacheKeyConverter
|
||||
{
|
||||
struct GPU_PipelineCacheKeyStruct as_struct;
|
||||
Uint64 as_uint64;
|
||||
} GPU_PipelineCacheKey;
|
||||
} GPU_PipelineCacheKeyConverter;
|
||||
|
||||
SDL_COMPILE_TIME_ASSERT(GPU_PipelineCacheKey_Size, sizeof(GPU_PipelineCacheKey) <= sizeof(Uint64));
|
||||
SDL_COMPILE_TIME_ASSERT(GPU_PipelineCacheKeyConverter_Size, sizeof(GPU_PipelineCacheKeyConverter) <= sizeof(Uint64));
|
||||
|
||||
typedef struct GPU_PipelineCacheEntry
|
||||
static Uint32 SDLCALL HashPipelineCacheKey(void *userdata, const void *key)
|
||||
{
|
||||
GPU_PipelineCacheKey key;
|
||||
SDL_GPUGraphicsPipeline *pipeline;
|
||||
} GPU_PipelineCacheEntry;
|
||||
const GPU_PipelineParameters *params = (const GPU_PipelineParameters *) key;
|
||||
GPU_PipelineCacheKeyConverter cvt;
|
||||
cvt.as_uint64 = 0;
|
||||
cvt.as_struct.blend_mode = params->blend_mode;
|
||||
cvt.as_struct.frag_shader = params->frag_shader;
|
||||
cvt.as_struct.vert_shader = params->vert_shader;
|
||||
cvt.as_struct.attachment_format = params->attachment_format;
|
||||
cvt.as_struct.primitive_type = params->primitive_type;
|
||||
|
||||
static Uint32 HashPipelineCacheKey(const GPU_PipelineCacheKey *key)
|
||||
{
|
||||
Uint64 x = key->as_uint64;
|
||||
// 64-bit uint hash function stolen from taisei (which stole it from somewhere else)
|
||||
Uint64 x = cvt.as_uint64;
|
||||
x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9);
|
||||
x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb);
|
||||
x = x ^ (x >> 31);
|
||||
return (Uint32)(x & 0xffffffff);
|
||||
}
|
||||
|
||||
static Uint32 HashPassthrough(const void *key, void *data)
|
||||
static bool SDLCALL MatchPipelineCacheKey(void *userdata, const void *a, const void *b)
|
||||
{
|
||||
// double-cast to silence a clang warning
|
||||
return (Uint32)(uintptr_t)key;
|
||||
return (SDL_memcmp(a, b, sizeof (GPU_PipelineParameters)) == 0);
|
||||
}
|
||||
|
||||
static bool MatchPipelineCacheKey(const void *a, const void *b, void *data)
|
||||
static void SDLCALL DestroyPipelineCacheHashItem(void *userdata, const void *key, const void *value)
|
||||
{
|
||||
return a == b;
|
||||
}
|
||||
|
||||
static void NukePipelineCacheEntry(const void *key, const void *value, void *data)
|
||||
{
|
||||
GPU_PipelineCacheEntry *entry = (GPU_PipelineCacheEntry *)value;
|
||||
SDL_GPUDevice *device = data;
|
||||
|
||||
SDL_ReleaseGPUGraphicsPipeline(device, entry->pipeline);
|
||||
SDL_free(entry);
|
||||
SDL_GPUGraphicsPipeline *pipeline = (SDL_GPUGraphicsPipeline *) value;
|
||||
SDL_GPUDevice *device = (SDL_GPUDevice *) userdata;
|
||||
SDL_ReleaseGPUGraphicsPipeline(device, pipeline);
|
||||
SDL_free((GPU_PipelineParameters *) key);
|
||||
}
|
||||
|
||||
bool GPU_InitPipelineCache(GPU_PipelineCache *cache, SDL_GPUDevice *device)
|
||||
{
|
||||
// FIXME how many buckets do we need?
|
||||
cache->table = SDL_CreateHashTable(device, 32, HashPassthrough, MatchPipelineCacheKey, NukePipelineCacheEntry, false, true);
|
||||
if (!cache->table) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
cache->table = SDL_CreateHashTable(0, false, HashPipelineCacheKey, MatchPipelineCacheKey, DestroyPipelineCacheHashItem, device);
|
||||
return (cache->table != NULL);
|
||||
}
|
||||
|
||||
void GPU_DestroyPipelineCache(GPU_PipelineCache *cache)
|
||||
@@ -180,45 +172,30 @@ static SDL_GPUGraphicsPipeline *MakePipeline(SDL_GPUDevice *device, GPU_Shaders
|
||||
return SDL_CreateGPUGraphicsPipeline(device, &pci);
|
||||
}
|
||||
|
||||
static GPU_PipelineCacheKey MakePipelineCacheKey(const GPU_PipelineParameters *params)
|
||||
{
|
||||
GPU_PipelineCacheKey key;
|
||||
SDL_zero(key);
|
||||
key.as_struct.blend_mode = params->blend_mode;
|
||||
key.as_struct.frag_shader = params->frag_shader;
|
||||
key.as_struct.vert_shader = params->vert_shader;
|
||||
key.as_struct.attachment_format = params->attachment_format;
|
||||
key.as_struct.primitive_type = params->primitive_type;
|
||||
return key;
|
||||
}
|
||||
|
||||
SDL_GPUGraphicsPipeline *GPU_GetPipeline(GPU_PipelineCache *cache, GPU_Shaders *shaders, SDL_GPUDevice *device, const GPU_PipelineParameters *params)
|
||||
{
|
||||
GPU_PipelineCacheKey key = MakePipelineCacheKey(params);
|
||||
void *keyval = (void *)(uintptr_t)HashPipelineCacheKey(&key);
|
||||
SDL_GPUGraphicsPipeline *pipeline = NULL;
|
||||
if (!SDL_FindInHashTable(cache->table, params, (const void **) &pipeline)) {
|
||||
bool inserted = false;
|
||||
// !!! FIXME: why don't we have an SDL_alloc_copy function/macro?
|
||||
GPU_PipelineParameters *paramscpy = (GPU_PipelineParameters *) SDL_malloc(sizeof (*paramscpy));
|
||||
if (paramscpy) {
|
||||
SDL_copyp(paramscpy, params);
|
||||
pipeline = MakePipeline(device, shaders, params);
|
||||
if (pipeline) {
|
||||
inserted = SDL_InsertIntoHashTable(cache->table, paramscpy, pipeline, false);
|
||||
}
|
||||
}
|
||||
|
||||
void *iter = NULL;
|
||||
GPU_PipelineCacheEntry *entry = NULL;
|
||||
|
||||
while (SDL_IterateHashTableKey(cache->table, keyval, (const void **)&entry, &iter)) {
|
||||
if (entry->key.as_uint64 == key.as_uint64) {
|
||||
return entry->pipeline;
|
||||
if (!inserted) {
|
||||
SDL_free(paramscpy);
|
||||
if (pipeline) {
|
||||
SDL_ReleaseGPUGraphicsPipeline(device, pipeline);
|
||||
pipeline = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pipeline = MakePipeline(device, shaders, params);
|
||||
|
||||
if (pipeline == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
entry = SDL_malloc(sizeof(*entry));
|
||||
entry->key = key;
|
||||
entry->pipeline = pipeline;
|
||||
|
||||
SDL_InsertIntoHashTable(cache->table, keyval, entry);
|
||||
|
||||
return pipeline;
|
||||
}
|
||||
|
||||
|
||||
@@ -335,11 +335,6 @@ static void GPU_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
GPU_UpdateTexture(renderer, texture, rect, pixels, data->pitch);
|
||||
}
|
||||
|
||||
static void GPU_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scale_mode)
|
||||
{
|
||||
// nothing to do in this backend.
|
||||
}
|
||||
|
||||
static bool GPU_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
|
||||
@@ -450,7 +445,6 @@ static void GPU_InvalidateCachedState(SDL_Renderer *renderer)
|
||||
{
|
||||
GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
|
||||
|
||||
data->state.render_target = NULL;
|
||||
data->state.scissor_enabled = false;
|
||||
}
|
||||
|
||||
@@ -494,8 +488,7 @@ static void PushUniforms(GPU_RenderData *data, SDL_RenderCommand *cmd)
|
||||
SDL_PushGPUVertexUniformData(data->state.command_buffer, 0, &uniforms, sizeof(uniforms));
|
||||
}
|
||||
|
||||
static SDL_GPUSampler **SamplerPointer(
|
||||
GPU_RenderData *data, SDL_TextureAddressMode address_mode, SDL_ScaleMode scale_mode)
|
||||
static SDL_GPUSampler **SamplerPointer(GPU_RenderData *data, SDL_TextureAddressMode address_mode, SDL_ScaleMode scale_mode)
|
||||
{
|
||||
return &data->samplers[scale_mode][address_mode - 1];
|
||||
}
|
||||
@@ -575,7 +568,7 @@ static void Draw(
|
||||
if (tdata) {
|
||||
SDL_GPUTextureSamplerBinding sampler_bind;
|
||||
SDL_zero(sampler_bind);
|
||||
sampler_bind.sampler = *SamplerPointer(data, cmd->data.draw.texture_address_mode, cmd->data.draw.texture->scaleMode);
|
||||
sampler_bind.sampler = *SamplerPointer(data, cmd->data.draw.texture_address_mode, cmd->data.draw.texture_scale_mode);
|
||||
sampler_bind.texture = tdata->texture;
|
||||
SDL_BindGPUFragmentSamplers(pass, 0, &sampler_bind, 1);
|
||||
}
|
||||
@@ -785,6 +778,8 @@ static bool GPU_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
||||
same texture, we can combine them all into a single draw call. */
|
||||
SDL_Texture *thistexture = cmd->data.draw.texture;
|
||||
SDL_BlendMode thisblend = cmd->data.draw.blend;
|
||||
SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
|
||||
SDL_TextureAddressMode thisaddressmode = cmd->data.draw.texture_address_mode;
|
||||
const SDL_RenderCommandType thiscmdtype = cmd->command;
|
||||
SDL_RenderCommand *finalcmd = cmd;
|
||||
SDL_RenderCommand *nextcmd = cmd->next;
|
||||
@@ -795,7 +790,10 @@ static bool GPU_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
||||
const SDL_RenderCommandType nextcmdtype = nextcmd->command;
|
||||
if (nextcmdtype != thiscmdtype) {
|
||||
break; // can't go any further on this draw call, different render command up next.
|
||||
} else if (nextcmd->data.draw.texture != thistexture || nextcmd->data.draw.blend != thisblend) {
|
||||
} else if (nextcmd->data.draw.texture != thistexture ||
|
||||
nextcmd->data.draw.texture_scale_mode != thisscalemode ||
|
||||
nextcmd->data.draw.texture_address_mode != thisaddressmode ||
|
||||
nextcmd->data.draw.blend != thisblend) {
|
||||
// FIXME should we check address mode too?
|
||||
break; // can't go any further on this draw call, different texture/blendmode copy up next.
|
||||
} else {
|
||||
@@ -1176,7 +1174,6 @@ static bool GPU_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
|
||||
renderer->UpdateTexture = GPU_UpdateTexture;
|
||||
renderer->LockTexture = GPU_LockTexture;
|
||||
renderer->UnlockTexture = GPU_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = GPU_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = GPU_SetRenderTarget;
|
||||
renderer->QueueSetViewport = GPU_QueueNoOp;
|
||||
renderer->QueueSetDrawColor = GPU_QueueNoOp;
|
||||
@@ -1242,10 +1239,10 @@ static bool GPU_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
|
||||
|
||||
SDL_SetGPUAllowedFramesInFlight(data->device, 1);
|
||||
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA32);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX32);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX32);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX32);
|
||||
|
||||
SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 16384);
|
||||
|
||||
|
||||
@@ -79,15 +79,10 @@ static const size_t CONSTANTS_OFFSET_DECODE_BT2020_LIMITED = ALIGN_CONSTANTS(16,
|
||||
static const size_t CONSTANTS_OFFSET_DECODE_BT2020_FULL = ALIGN_CONSTANTS(16, CONSTANTS_OFFSET_DECODE_BT2020_LIMITED + sizeof(float) * 4 * 4);
|
||||
static const size_t CONSTANTS_LENGTH = CONSTANTS_OFFSET_DECODE_BT2020_FULL + sizeof(float) * 4 * 4;
|
||||
|
||||
// Sampler types
|
||||
typedef enum
|
||||
{
|
||||
SDL_METAL_SAMPLER_NEAREST_CLAMP,
|
||||
SDL_METAL_SAMPLER_NEAREST_WRAP,
|
||||
SDL_METAL_SAMPLER_LINEAR_CLAMP,
|
||||
SDL_METAL_SAMPLER_LINEAR_WRAP,
|
||||
SDL_NUM_METAL_SAMPLERS
|
||||
} SDL_METAL_sampler_type;
|
||||
#define RENDER_SAMPLER_HASHKEY(scale_mode, address_u, address_v) \
|
||||
(((scale_mode == SDL_SCALEMODE_NEAREST) << 0) | \
|
||||
((address_u == SDL_TEXTURE_ADDRESS_WRAP) << 1) | \
|
||||
((address_v == SDL_TEXTURE_ADDRESS_WRAP) << 2))
|
||||
|
||||
typedef enum SDL_MetalVertexFunction
|
||||
{
|
||||
@@ -139,7 +134,7 @@ typedef struct METAL_ShaderPipelines
|
||||
@property(nonatomic, retain) id<MTLRenderCommandEncoder> mtlcmdencoder;
|
||||
@property(nonatomic, retain) id<MTLLibrary> mtllibrary;
|
||||
@property(nonatomic, retain) id<CAMetalDrawable> mtlbackbuffer;
|
||||
@property(nonatomic, retain) NSMutableArray<id<MTLSamplerState>> *mtlsamplers;
|
||||
@property(nonatomic, retain) NSMutableDictionary<NSNumber *, id<MTLSamplerState>> *mtlsamplers;
|
||||
@property(nonatomic, retain) id<MTLBuffer> mtlbufconstants;
|
||||
@property(nonatomic, retain) id<MTLBuffer> mtlbufquadindices;
|
||||
@property(nonatomic, assign) SDL_MetalView mtlview;
|
||||
@@ -1070,10 +1065,6 @@ static void METAL_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
}
|
||||
}
|
||||
|
||||
static void METAL_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
}
|
||||
|
||||
static bool METAL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
@autoreleasepool {
|
||||
@@ -1299,6 +1290,9 @@ typedef struct
|
||||
__unsafe_unretained id<MTLBuffer> vertex_buffer;
|
||||
size_t constants_offset;
|
||||
SDL_Texture *texture;
|
||||
SDL_ScaleMode texture_scale_mode;
|
||||
SDL_TextureAddressMode texture_address_mode_u;
|
||||
SDL_TextureAddressMode texture_address_mode_v;
|
||||
bool cliprect_dirty;
|
||||
bool cliprect_enabled;
|
||||
SDL_Rect cliprect;
|
||||
@@ -1456,6 +1450,58 @@ static bool SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, c
|
||||
return true;
|
||||
}
|
||||
|
||||
static id<MTLSamplerState> GetSampler(SDL3METAL_RenderData *data, SDL_ScaleMode scale_mode, SDL_TextureAddressMode address_u, SDL_TextureAddressMode address_v)
|
||||
{
|
||||
NSNumber *key = [NSNumber numberWithInteger:RENDER_SAMPLER_HASHKEY(scale_mode, address_u, address_v)];
|
||||
id<MTLSamplerState> mtlsampler = data.mtlsamplers[key];
|
||||
if (mtlsampler == nil) {
|
||||
MTLSamplerDescriptor *samplerdesc;
|
||||
samplerdesc = [[MTLSamplerDescriptor alloc] init];
|
||||
switch (scale_mode) {
|
||||
case SDL_SCALEMODE_NEAREST:
|
||||
samplerdesc.minFilter = MTLSamplerMinMagFilterNearest;
|
||||
samplerdesc.magFilter = MTLSamplerMinMagFilterNearest;
|
||||
break;
|
||||
case SDL_SCALEMODE_LINEAR:
|
||||
samplerdesc.minFilter = MTLSamplerMinMagFilterLinear;
|
||||
samplerdesc.magFilter = MTLSamplerMinMagFilterLinear;
|
||||
break;
|
||||
default:
|
||||
SDL_SetError("Unknown scale mode: %d", scale_mode);
|
||||
return nil;
|
||||
}
|
||||
switch (address_u) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
samplerdesc.sAddressMode = MTLSamplerAddressModeClampToEdge;
|
||||
break;
|
||||
case SDL_TEXTURE_ADDRESS_WRAP:
|
||||
samplerdesc.sAddressMode = MTLSamplerAddressModeRepeat;
|
||||
break;
|
||||
default:
|
||||
SDL_SetError("Unknown texture address mode: %d", address_u);
|
||||
return nil;
|
||||
}
|
||||
switch (address_v) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
samplerdesc.tAddressMode = MTLSamplerAddressModeClampToEdge;
|
||||
break;
|
||||
case SDL_TEXTURE_ADDRESS_WRAP:
|
||||
samplerdesc.tAddressMode = MTLSamplerAddressModeRepeat;
|
||||
break;
|
||||
default:
|
||||
SDL_SetError("Unknown texture address mode: %d", address_v);
|
||||
return nil;
|
||||
}
|
||||
mtlsampler = [data.mtldevice newSamplerStateWithDescriptor:samplerdesc];
|
||||
if (mtlsampler == nil) {
|
||||
SDL_SetError("Couldn't create sampler");
|
||||
return nil;
|
||||
}
|
||||
data.mtlsamplers[key] = mtlsampler;
|
||||
}
|
||||
return mtlsampler;
|
||||
}
|
||||
|
||||
static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const size_t constants_offset,
|
||||
id<MTLBuffer> mtlbufvertex, METAL_DrawStateCache *statecache)
|
||||
{
|
||||
@@ -1471,33 +1517,6 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, c
|
||||
}
|
||||
|
||||
if (texture != statecache->texture) {
|
||||
id<MTLSamplerState> mtlsampler;
|
||||
|
||||
if (texture->scaleMode == SDL_SCALEMODE_NEAREST) {
|
||||
switch (cmd->data.draw.texture_address_mode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
mtlsampler = data.mtlsamplers[SDL_METAL_SAMPLER_NEAREST_CLAMP];
|
||||
break;
|
||||
case SDL_TEXTURE_ADDRESS_WRAP:
|
||||
mtlsampler = data.mtlsamplers[SDL_METAL_SAMPLER_NEAREST_WRAP];
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
|
||||
}
|
||||
} else {
|
||||
switch (cmd->data.draw.texture_address_mode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
mtlsampler = data.mtlsamplers[SDL_METAL_SAMPLER_LINEAR_CLAMP];
|
||||
break;
|
||||
case SDL_TEXTURE_ADDRESS_WRAP:
|
||||
mtlsampler = data.mtlsamplers[SDL_METAL_SAMPLER_LINEAR_WRAP];
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
|
||||
}
|
||||
}
|
||||
[data.mtlcmdencoder setFragmentSamplerState:mtlsampler atIndex:0];
|
||||
|
||||
[data.mtlcmdencoder setFragmentTexture:texturedata.mtltexture atIndex:0];
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (texturedata.yuv || texturedata.nv12) {
|
||||
@@ -1507,6 +1526,20 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, c
|
||||
#endif
|
||||
statecache->texture = texture;
|
||||
}
|
||||
|
||||
if (cmd->data.draw.texture_scale_mode != statecache->texture_scale_mode ||
|
||||
cmd->data.draw.texture_address_mode != statecache->texture_address_mode_u ||
|
||||
cmd->data.draw.texture_address_mode != statecache->texture_address_mode_v) {
|
||||
id<MTLSamplerState> mtlsampler = GetSampler(data, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode, cmd->data.draw.texture_address_mode);
|
||||
if (mtlsampler == nil) {
|
||||
return false;
|
||||
}
|
||||
[data.mtlcmdencoder setFragmentSamplerState:mtlsampler atIndex:0];
|
||||
|
||||
statecache->texture_scale_mode = cmd->data.draw.texture_scale_mode;
|
||||
statecache->texture_address_mode_u = cmd->data.draw.texture_address_mode;
|
||||
statecache->texture_address_mode_v = cmd->data.draw.texture_address_mode;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1527,6 +1560,9 @@ static bool METAL_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
|
||||
statecache.vertex_buffer = nil;
|
||||
statecache.constants_offset = CONSTANTS_OFFSET_INVALID;
|
||||
statecache.texture = NULL;
|
||||
statecache.texture_scale_mode = SDL_SCALEMODE_INVALID;
|
||||
statecache.texture_address_mode_u = SDL_TEXTURE_ADDRESS_INVALID;
|
||||
statecache.texture_address_mode_v = SDL_TEXTURE_ADDRESS_INVALID;
|
||||
statecache.shader_constants_dirty = true;
|
||||
statecache.cliprect_dirty = true;
|
||||
statecache.viewport_dirty = true;
|
||||
@@ -1887,7 +1923,6 @@ static bool METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
|
||||
int maxtexsize, quadcount = UINT16_MAX / 4;
|
||||
UInt16 *indexdata;
|
||||
size_t indicessize = sizeof(UInt16) * quadcount * 6;
|
||||
MTLSamplerDescriptor *samplerdesc;
|
||||
id<MTLCommandQueue> mtlcmdqueue;
|
||||
id<MTLLibrary> mtllibrary;
|
||||
id<MTLBuffer> mtlbufconstantstaging, mtlbufquadindicesstaging, mtlbufconstants, mtlbufquadindices;
|
||||
@@ -2047,27 +2082,7 @@ static bool METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
|
||||
data.allpipelines = NULL;
|
||||
ChooseShaderPipelines(data, MTLPixelFormatBGRA8Unorm);
|
||||
|
||||
static struct
|
||||
{
|
||||
MTLSamplerMinMagFilter filter;
|
||||
MTLSamplerAddressMode address;
|
||||
} samplerParams[] = {
|
||||
{ MTLSamplerMinMagFilterNearest, MTLSamplerAddressModeClampToEdge },
|
||||
{ MTLSamplerMinMagFilterNearest, MTLSamplerAddressModeRepeat },
|
||||
{ MTLSamplerMinMagFilterLinear, MTLSamplerAddressModeClampToEdge },
|
||||
{ MTLSamplerMinMagFilterLinear, MTLSamplerAddressModeRepeat },
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(samplerParams_SIZE, SDL_arraysize(samplerParams) == SDL_NUM_METAL_SAMPLERS);
|
||||
|
||||
data.mtlsamplers = [[NSMutableArray<id<MTLSamplerState>> alloc] init];
|
||||
samplerdesc = [[MTLSamplerDescriptor alloc] init];
|
||||
for (int i = 0; i < SDL_arraysize(samplerParams); ++i) {
|
||||
samplerdesc.minFilter = samplerParams[i].filter;
|
||||
samplerdesc.magFilter = samplerParams[i].filter;
|
||||
samplerdesc.sAddressMode = samplerParams[i].address;
|
||||
samplerdesc.tAddressMode = samplerParams[i].address;
|
||||
[data.mtlsamplers addObject:[data.mtldevice newSamplerStateWithDescriptor:samplerdesc]];
|
||||
}
|
||||
data.mtlsamplers = [[NSMutableDictionary<NSNumber *, id<MTLSamplerState>> alloc] init];
|
||||
|
||||
mtlbufconstantstaging = [data.mtldevice newBufferWithLength:CONSTANTS_LENGTH options:MTLResourceStorageModeShared];
|
||||
|
||||
@@ -2129,7 +2144,6 @@ static bool METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
|
||||
#endif
|
||||
renderer->LockTexture = METAL_LockTexture;
|
||||
renderer->UnlockTexture = METAL_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = METAL_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = METAL_SetRenderTarget;
|
||||
renderer->QueueSetViewport = METAL_QueueSetViewport;
|
||||
renderer->QueueSetDrawColor = METAL_QueueNoOp;
|
||||
|
||||
@@ -137,7 +137,6 @@ typedef struct
|
||||
void *pixels;
|
||||
int pitch;
|
||||
SDL_Rect locked_rect;
|
||||
|
||||
#ifdef SDL_HAVE_YUV
|
||||
// YUV texture support
|
||||
bool yuv;
|
||||
@@ -147,7 +146,8 @@ typedef struct
|
||||
GLuint vtexture;
|
||||
bool vtexture_external;
|
||||
#endif
|
||||
|
||||
SDL_ScaleMode texture_scale_mode;
|
||||
SDL_TextureAddressMode texture_address_mode;
|
||||
GL_FBOList *fbo;
|
||||
} GL_TextureData;
|
||||
|
||||
@@ -447,7 +447,6 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
|
||||
GLint internalFormat;
|
||||
GLenum format, type;
|
||||
int texture_w, texture_h;
|
||||
GLenum scaleMode;
|
||||
|
||||
GL_ActivateRenderer(renderer);
|
||||
|
||||
@@ -536,11 +535,10 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
|
||||
|
||||
data->format = format;
|
||||
data->formattype = type;
|
||||
scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? GL_NEAREST : GL_LINEAR;
|
||||
data->texture_scale_mode = SDL_SCALEMODE_INVALID;
|
||||
data->texture_address_mode = SDL_TEXTURE_ADDRESS_INVALID;
|
||||
renderdata->glEnable(textype);
|
||||
renderdata->glBindTexture(textype, data->texture);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, scaleMode);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, scaleMode);
|
||||
#ifdef SDL_PLATFORM_MACOS
|
||||
#ifndef GL_TEXTURE_STORAGE_HINT_APPLE
|
||||
#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
|
||||
@@ -596,19 +594,11 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
|
||||
}
|
||||
|
||||
renderdata->glBindTexture(textype, data->utexture);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER,
|
||||
scaleMode);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER,
|
||||
scaleMode);
|
||||
renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w + 1) / 2,
|
||||
(texture_h + 1) / 2, 0, format, type, NULL);
|
||||
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER, data->utexture);
|
||||
|
||||
renderdata->glBindTexture(textype, data->vtexture);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER,
|
||||
scaleMode);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER,
|
||||
scaleMode);
|
||||
renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w + 1) / 2,
|
||||
(texture_h + 1) / 2, 0, format, type, NULL);
|
||||
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER, data->vtexture);
|
||||
@@ -625,10 +615,6 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
|
||||
renderdata->glGenTextures(1, &data->utexture);
|
||||
}
|
||||
renderdata->glBindTexture(textype, data->utexture);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER,
|
||||
scaleMode);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER,
|
||||
scaleMode);
|
||||
renderdata->glTexImage2D(textype, 0, GL_LUMINANCE_ALPHA, (texture_w + 1) / 2,
|
||||
(texture_h + 1) / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
||||
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER, data->utexture);
|
||||
@@ -822,38 +808,6 @@ static void GL_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch);
|
||||
}
|
||||
|
||||
static void GL_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
GL_RenderData *renderdata = (GL_RenderData *)renderer->internal;
|
||||
const GLenum textype = renderdata->textype;
|
||||
GL_TextureData *data = (GL_TextureData *)texture->internal;
|
||||
GLenum glScaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? GL_NEAREST : GL_LINEAR;
|
||||
|
||||
renderdata->glBindTexture(textype, data->texture);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, glScaleMode);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, glScaleMode);
|
||||
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (texture->format == SDL_PIXELFORMAT_YV12 ||
|
||||
texture->format == SDL_PIXELFORMAT_IYUV) {
|
||||
renderdata->glBindTexture(textype, data->utexture);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, glScaleMode);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, glScaleMode);
|
||||
|
||||
renderdata->glBindTexture(textype, data->vtexture);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, glScaleMode);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, glScaleMode);
|
||||
}
|
||||
|
||||
if (texture->format == SDL_PIXELFORMAT_NV12 ||
|
||||
texture->format == SDL_PIXELFORMAT_NV21) {
|
||||
renderdata->glBindTexture(textype, data->utexture);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, glScaleMode);
|
||||
renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, glScaleMode);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool GL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
GL_RenderData *data = (GL_RenderData *)renderer->internal;
|
||||
@@ -1120,6 +1074,23 @@ static bool SetDrawState(GL_RenderData *data, const SDL_RenderCommand *cmd, cons
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool SetTextureScaleMode(GL_RenderData *data, GLenum textype, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
switch (scaleMode) {
|
||||
case SDL_SCALEMODE_NEAREST:
|
||||
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
break;
|
||||
case SDL_SCALEMODE_LINEAR:
|
||||
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("Unknown texture scale mode: %d", scaleMode);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool SetTextureAddressMode(GL_RenderData *data, GLenum textype, SDL_TextureAddressMode addressMode)
|
||||
{
|
||||
switch (addressMode) {
|
||||
@@ -1140,41 +1111,23 @@ static bool SetTextureAddressMode(GL_RenderData *data, GLenum textype, SDL_Textu
|
||||
static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
|
||||
{
|
||||
SDL_Texture *texture = cmd->data.draw.texture;
|
||||
const GL_TextureData *texturedata = (GL_TextureData *)texture->internal;
|
||||
GL_TextureData *texturedata = (GL_TextureData *)texture->internal;
|
||||
const GLenum textype = data->textype;
|
||||
|
||||
SetDrawState(data, cmd, texturedata->shader, texturedata->shader_params);
|
||||
|
||||
if (texture != data->drawstate.texture) {
|
||||
const GLenum textype = data->textype;
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (texturedata->yuv) {
|
||||
if (data->GL_ARB_multitexture_supported) {
|
||||
data->glActiveTextureARB(GL_TEXTURE2_ARB);
|
||||
}
|
||||
data->glActiveTextureARB(GL_TEXTURE2_ARB);
|
||||
data->glBindTexture(textype, texturedata->vtexture);
|
||||
|
||||
if (!SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (data->GL_ARB_multitexture_supported) {
|
||||
data->glActiveTextureARB(GL_TEXTURE1_ARB);
|
||||
}
|
||||
data->glActiveTextureARB(GL_TEXTURE1_ARB);
|
||||
data->glBindTexture(textype, texturedata->utexture);
|
||||
|
||||
if (!SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (texturedata->nv12) {
|
||||
if (data->GL_ARB_multitexture_supported) {
|
||||
data->glActiveTextureARB(GL_TEXTURE1_ARB);
|
||||
}
|
||||
data->glActiveTextureARB(GL_TEXTURE1_ARB);
|
||||
data->glBindTexture(textype, texturedata->utexture);
|
||||
|
||||
if (!SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (data->GL_ARB_multitexture_supported) {
|
||||
@@ -1182,11 +1135,67 @@ static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
|
||||
}
|
||||
data->glBindTexture(textype, texturedata->texture);
|
||||
|
||||
data->drawstate.texture = texture;
|
||||
}
|
||||
|
||||
if (cmd->data.draw.texture_scale_mode != texturedata->texture_scale_mode) {
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (texturedata->yuv) {
|
||||
data->glActiveTextureARB(GL_TEXTURE2);
|
||||
if (!SetTextureScaleMode(data, textype, cmd->data.draw.texture_scale_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->glActiveTextureARB(GL_TEXTURE1);
|
||||
if (!SetTextureScaleMode(data, textype, cmd->data.draw.texture_scale_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->glActiveTextureARB(GL_TEXTURE0);
|
||||
} else if (texturedata->nv12) {
|
||||
data->glActiveTextureARB(GL_TEXTURE1);
|
||||
if (!SetTextureScaleMode(data, textype, cmd->data.draw.texture_scale_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->glActiveTextureARB(GL_TEXTURE0);
|
||||
}
|
||||
#endif
|
||||
if (!SetTextureScaleMode(data, textype, cmd->data.draw.texture_scale_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
texturedata->texture_scale_mode = cmd->data.draw.texture_scale_mode;
|
||||
}
|
||||
|
||||
if (cmd->data.draw.texture_address_mode != texturedata->texture_address_mode) {
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (texturedata->yuv) {
|
||||
data->glActiveTextureARB(GL_TEXTURE2);
|
||||
if (!SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->glActiveTextureARB(GL_TEXTURE1);
|
||||
if (!SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->glActiveTextureARB(GL_TEXTURE0_ARB);
|
||||
} else if (texturedata->nv12) {
|
||||
data->glActiveTextureARB(GL_TEXTURE1);
|
||||
if (!SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->glActiveTextureARB(GL_TEXTURE0);
|
||||
}
|
||||
#endif
|
||||
if (!SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->drawstate.texture = texture;
|
||||
texturedata->texture_address_mode = cmd->data.draw.texture_address_mode;
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -1372,6 +1381,8 @@ static bool GL_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
||||
same texture, we can combine them all into a single draw call. */
|
||||
SDL_Texture *thistexture = cmd->data.draw.texture;
|
||||
SDL_BlendMode thisblend = cmd->data.draw.blend;
|
||||
SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
|
||||
SDL_TextureAddressMode thisaddressmode = cmd->data.draw.texture_address_mode;
|
||||
const SDL_RenderCommandType thiscmdtype = cmd->command;
|
||||
SDL_RenderCommand *finalcmd = cmd;
|
||||
SDL_RenderCommand *nextcmd = cmd->next;
|
||||
@@ -1381,7 +1392,10 @@ static bool GL_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
||||
const SDL_RenderCommandType nextcmdtype = nextcmd->command;
|
||||
if (nextcmdtype != thiscmdtype) {
|
||||
break; // can't go any further on this draw call, different render command up next.
|
||||
} else if (nextcmd->data.draw.texture != thistexture || nextcmd->data.draw.blend != thisblend) {
|
||||
} else if (nextcmd->data.draw.texture != thistexture ||
|
||||
nextcmd->data.draw.texture_scale_mode != thisscalemode ||
|
||||
nextcmd->data.draw.texture_address_mode != thisaddressmode ||
|
||||
nextcmd->data.draw.blend != thisblend) {
|
||||
break; // can't go any further on this draw call, different texture/blendmode copy up next.
|
||||
} else {
|
||||
finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
|
||||
@@ -1656,7 +1670,6 @@ static bool GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr
|
||||
#endif
|
||||
renderer->LockTexture = GL_LockTexture;
|
||||
renderer->UnlockTexture = GL_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = GL_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = GL_SetRenderTarget;
|
||||
renderer->QueueSetViewport = GL_QueueNoOp;
|
||||
renderer->QueueSetDrawColor = GL_QueueNoOp;
|
||||
|
||||
@@ -76,6 +76,8 @@ typedef struct GLES2_TextureData
|
||||
GLuint texture_u;
|
||||
GLuint texture_u_external;
|
||||
#endif
|
||||
SDL_ScaleMode texture_scale_mode;
|
||||
SDL_TextureAddressMode texture_address_mode;
|
||||
GLES2_FBOList *fbo;
|
||||
} GLES2_TextureData;
|
||||
|
||||
@@ -168,6 +170,7 @@ typedef struct GLES2_RenderData
|
||||
|
||||
bool debug_enabled;
|
||||
|
||||
bool GL_OES_EGL_image_external_supported;
|
||||
bool GL_EXT_blend_minmax_supported;
|
||||
|
||||
#define SDL_PROC(ret, func, params) ret (APIENTRY *func) params;
|
||||
@@ -987,8 +990,8 @@ static bool SetDrawState(GLES2_RenderData *data, const SDL_RenderCommand *cmd, c
|
||||
}
|
||||
|
||||
if (texture) {
|
||||
SDL_Vertex *verts = (SDL_Vertex *)(((Uint8 *)vertices) + cmd->data.draw.first);
|
||||
data->glVertexAttribPointer(GLES2_ATTRIBUTE_TEXCOORD, 2, GL_FLOAT, GL_FALSE, stride, (const GLvoid *)&verts->tex_coord);
|
||||
uintptr_t base = (uintptr_t)vertices + cmd->data.draw.first; // address of first vertex, or base offset when using VBOs.
|
||||
data->glVertexAttribPointer(GLES2_ATTRIBUTE_TEXCOORD, 2, GL_FLOAT, GL_FALSE, stride, (const GLvoid *)(base + offsetof(SDL_Vertex, tex_coord)));
|
||||
}
|
||||
|
||||
if (!GLES2_SelectProgram(data, imgsrc, texture ? texture->colorspace : SDL_COLORSPACE_SRGB)) {
|
||||
@@ -1021,14 +1024,31 @@ static bool SetDrawState(GLES2_RenderData *data, const SDL_RenderCommand *cmd, c
|
||||
|
||||
// all drawing commands use this
|
||||
{
|
||||
SDL_VertexSolid *verts = (SDL_VertexSolid *)(((Uint8 *)vertices) + cmd->data.draw.first);
|
||||
data->glVertexAttribPointer(GLES2_ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, stride, (const GLvoid *)&verts->position);
|
||||
data->glVertexAttribPointer(GLES2_ATTRIBUTE_COLOR, 4, GL_FLOAT, GL_TRUE /* Normalized */, stride, (const GLvoid *)&verts->color);
|
||||
uintptr_t base = (uintptr_t)vertices + cmd->data.draw.first; // address of first vertex, or base offset when using VBOs.
|
||||
data->glVertexAttribPointer(GLES2_ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, stride, (const GLvoid *)(base + offsetof(SDL_VertexSolid, position)));
|
||||
data->glVertexAttribPointer(GLES2_ATTRIBUTE_COLOR, 4, GL_FLOAT, GL_TRUE /* Normalized */, stride, (const GLvoid *)(base + offsetof(SDL_VertexSolid, color)));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool SetTextureScaleMode(GLES2_RenderData *data, GLenum textype, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
switch (scaleMode) {
|
||||
case SDL_SCALEMODE_NEAREST:
|
||||
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
break;
|
||||
case SDL_SCALEMODE_LINEAR:
|
||||
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("Unknown texture scale mode: %d", scaleMode);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool SetTextureAddressMode(GLES2_RenderData *data, GLenum textype, SDL_TextureAddressMode addressMode)
|
||||
{
|
||||
switch (addressMode) {
|
||||
@@ -1051,6 +1071,7 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, v
|
||||
GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
|
||||
GLES2_ImageSource sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;
|
||||
SDL_Texture *texture = cmd->data.draw.texture;
|
||||
GLES2_TextureData *tdata = (GLES2_TextureData *)texture->internal;
|
||||
int ret;
|
||||
|
||||
// Pick an appropriate shader
|
||||
@@ -1172,19 +1193,66 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, v
|
||||
ret = SetDrawState(data, cmd, sourceType, vertices);
|
||||
|
||||
if (texture != data->drawstate.texture) {
|
||||
GLES2_TextureData *tdata = (GLES2_TextureData *)texture->internal;
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (tdata->yuv) {
|
||||
data->glActiveTexture(GL_TEXTURE2);
|
||||
data->glBindTexture(tdata->texture_type, tdata->texture_v);
|
||||
|
||||
data->glActiveTexture(GL_TEXTURE1);
|
||||
data->glBindTexture(tdata->texture_type, tdata->texture_u);
|
||||
|
||||
data->glActiveTexture(GL_TEXTURE0);
|
||||
} else if (tdata->nv12) {
|
||||
data->glActiveTexture(GL_TEXTURE1);
|
||||
data->glBindTexture(tdata->texture_type, tdata->texture_u);
|
||||
|
||||
data->glActiveTexture(GL_TEXTURE0);
|
||||
}
|
||||
#endif
|
||||
data->glBindTexture(tdata->texture_type, tdata->texture);
|
||||
|
||||
data->drawstate.texture = texture;
|
||||
}
|
||||
|
||||
if (cmd->data.draw.texture_scale_mode != tdata->texture_scale_mode) {
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (tdata->yuv) {
|
||||
data->glActiveTexture(GL_TEXTURE2);
|
||||
if (!SetTextureScaleMode(data, tdata->texture_type, cmd->data.draw.texture_scale_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->glActiveTexture(GL_TEXTURE1);
|
||||
if (!SetTextureScaleMode(data, tdata->texture_type, cmd->data.draw.texture_scale_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->glActiveTexture(GL_TEXTURE0);
|
||||
} else if (tdata->nv12) {
|
||||
data->glActiveTexture(GL_TEXTURE1);
|
||||
if (!SetTextureScaleMode(data, tdata->texture_type, cmd->data.draw.texture_scale_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->glActiveTexture(GL_TEXTURE0);
|
||||
}
|
||||
#endif
|
||||
if (!SetTextureScaleMode(data, tdata->texture_type, cmd->data.draw.texture_scale_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
tdata->texture_scale_mode = cmd->data.draw.texture_scale_mode;
|
||||
}
|
||||
|
||||
if (cmd->data.draw.texture_address_mode != tdata->texture_address_mode) {
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (tdata->yuv) {
|
||||
data->glActiveTexture(GL_TEXTURE2);
|
||||
if (!SetTextureAddressMode(data, tdata->texture_type, cmd->data.draw.texture_address_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->glActiveTexture(GL_TEXTURE1);
|
||||
data->glBindTexture(tdata->texture_type, tdata->texture_u);
|
||||
|
||||
if (!SetTextureAddressMode(data, tdata->texture_type, cmd->data.draw.texture_address_mode)) {
|
||||
return false;
|
||||
}
|
||||
@@ -1192,8 +1260,6 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, v
|
||||
data->glActiveTexture(GL_TEXTURE0);
|
||||
} else if (tdata->nv12) {
|
||||
data->glActiveTexture(GL_TEXTURE1);
|
||||
data->glBindTexture(tdata->texture_type, tdata->texture_u);
|
||||
|
||||
if (!SetTextureAddressMode(data, tdata->texture_type, cmd->data.draw.texture_address_mode)) {
|
||||
return false;
|
||||
}
|
||||
@@ -1201,13 +1267,11 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, v
|
||||
data->glActiveTexture(GL_TEXTURE0);
|
||||
}
|
||||
#endif
|
||||
data->glBindTexture(tdata->texture_type, tdata->texture);
|
||||
|
||||
if (!SetTextureAddressMode(data, tdata->texture_type, cmd->data.draw.texture_address_mode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
data->drawstate.texture = texture;
|
||||
tdata->texture_address_mode = cmd->data.draw.texture_address_mode;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -1269,7 +1333,8 @@ static bool GLES2_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
|
||||
if (data->current_vertex_buffer >= SDL_arraysize(data->vertex_buffers)) {
|
||||
data->current_vertex_buffer = 0;
|
||||
}
|
||||
vertices = NULL; // attrib pointers will be offsets into the VBO.
|
||||
// attrib pointers will be offsets into the VBO.
|
||||
vertices = (void *)(uintptr_t)0; // must be the exact value 0, not NULL (the representation of NULL is not guaranteed to be 0).
|
||||
#endif
|
||||
|
||||
while (cmd) {
|
||||
@@ -1384,6 +1449,8 @@ static bool GLES2_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
|
||||
same texture, we can combine them all into a single draw call. */
|
||||
SDL_Texture *thistexture = cmd->data.draw.texture;
|
||||
SDL_BlendMode thisblend = cmd->data.draw.blend;
|
||||
SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
|
||||
SDL_TextureAddressMode thisaddressmode = cmd->data.draw.texture_address_mode;
|
||||
const SDL_RenderCommandType thiscmdtype = cmd->command;
|
||||
SDL_RenderCommand *finalcmd = cmd;
|
||||
SDL_RenderCommand *nextcmd = cmd->next;
|
||||
@@ -1393,7 +1460,10 @@ static bool GLES2_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
|
||||
const SDL_RenderCommandType nextcmdtype = nextcmd->command;
|
||||
if (nextcmdtype != thiscmdtype) {
|
||||
break; // can't go any further on this draw call, different render command up next.
|
||||
} else if (nextcmd->data.draw.texture != thistexture || nextcmd->data.draw.blend != thisblend) {
|
||||
} else if (nextcmd->data.draw.texture != thistexture ||
|
||||
nextcmd->data.draw.texture_scale_mode != thisscalemode ||
|
||||
nextcmd->data.draw.texture_address_mode != thisaddressmode ||
|
||||
nextcmd->data.draw.blend != thisblend) {
|
||||
break; // can't go any further on this draw call, different texture/blendmode copy up next.
|
||||
} else {
|
||||
finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
|
||||
@@ -1486,7 +1556,6 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
||||
GLES2_TextureData *data;
|
||||
GLenum format;
|
||||
GLenum type;
|
||||
GLenum scaleMode;
|
||||
|
||||
GLES2_ActivateRenderer(renderer);
|
||||
|
||||
@@ -1512,9 +1581,12 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
||||
#endif
|
||||
#ifdef GL_TEXTURE_EXTERNAL_OES
|
||||
case SDL_PIXELFORMAT_EXTERNAL_OES:
|
||||
format = GL_NONE;
|
||||
type = GL_NONE;
|
||||
break;
|
||||
if (renderdata->GL_OES_EGL_image_external_supported) {
|
||||
format = GL_NONE;
|
||||
type = GL_NONE;
|
||||
break;
|
||||
}
|
||||
SDL_FALLTHROUGH;
|
||||
#endif
|
||||
default:
|
||||
return SDL_SetError("Texture format not supported");
|
||||
@@ -1544,7 +1616,8 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
||||
data->texture_u = 0;
|
||||
data->texture_v = 0;
|
||||
#endif
|
||||
scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? GL_NEAREST : GL_LINEAR;
|
||||
data->texture_scale_mode = SDL_SCALEMODE_INVALID;
|
||||
data->texture_address_mode = SDL_TEXTURE_ADDRESS_INVALID;
|
||||
|
||||
// Allocate a blob for image renderdata
|
||||
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
||||
@@ -1578,13 +1651,13 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
||||
} else {
|
||||
renderdata->glGenTextures(1, &data->texture_v);
|
||||
if (!GL_CheckError("glGenTexures()", renderer)) {
|
||||
SDL_free(data->pixel_data);
|
||||
SDL_free(data);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
renderdata->glActiveTexture(GL_TEXTURE2);
|
||||
renderdata->glBindTexture(data->texture_type, data->texture_v);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);
|
||||
renderdata->glTexImage2D(data->texture_type, 0, format, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, format, type, NULL);
|
||||
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER, data->texture_v);
|
||||
|
||||
@@ -1594,20 +1667,24 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
||||
} else {
|
||||
renderdata->glGenTextures(1, &data->texture_u);
|
||||
if (!GL_CheckError("glGenTexures()", renderer)) {
|
||||
SDL_free(data->pixel_data);
|
||||
SDL_free(data);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
renderdata->glActiveTexture(GL_TEXTURE1);
|
||||
renderdata->glBindTexture(data->texture_type, data->texture_u);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);
|
||||
renderdata->glTexImage2D(data->texture_type, 0, format, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, format, type, NULL);
|
||||
if (!GL_CheckError("glTexImage2D()", renderer)) {
|
||||
SDL_free(data->pixel_data);
|
||||
SDL_free(data);
|
||||
return false;
|
||||
}
|
||||
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER, data->texture_u);
|
||||
|
||||
if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
|
||||
SDL_free(data->pixel_data);
|
||||
SDL_free(data);
|
||||
return SDL_SetError("Unsupported YUV colorspace");
|
||||
}
|
||||
} else if (data->nv12) {
|
||||
@@ -1617,20 +1694,24 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
||||
} else {
|
||||
renderdata->glGenTextures(1, &data->texture_u);
|
||||
if (!GL_CheckError("glGenTexures()", renderer)) {
|
||||
SDL_free(data->pixel_data);
|
||||
SDL_free(data);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
renderdata->glActiveTexture(GL_TEXTURE1);
|
||||
renderdata->glBindTexture(data->texture_type, data->texture_u);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);
|
||||
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)) {
|
||||
SDL_free(data->pixel_data);
|
||||
SDL_free(data);
|
||||
return false;
|
||||
}
|
||||
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER, data->texture_u);
|
||||
|
||||
if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
|
||||
SDL_free(data->pixel_data);
|
||||
SDL_free(data);
|
||||
return SDL_SetError("Unsupported YUV colorspace");
|
||||
}
|
||||
}
|
||||
@@ -1642,14 +1723,14 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
||||
} else {
|
||||
renderdata->glGenTextures(1, &data->texture);
|
||||
if (!GL_CheckError("glGenTexures()", renderer)) {
|
||||
SDL_free(data->pixel_data);
|
||||
SDL_free(data);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
texture->internal = data;
|
||||
renderdata->glActiveTexture(GL_TEXTURE0);
|
||||
renderdata->glBindTexture(data->texture_type, data->texture);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);
|
||||
if (texture->format != SDL_PIXELFORMAT_EXTERNAL_OES) {
|
||||
renderdata->glTexImage2D(data->texture_type, 0, format, texture->w, texture->h, 0, format, type, NULL);
|
||||
if (!GL_CheckError("glTexImage2D()", renderer)) {
|
||||
@@ -1900,37 +1981,6 @@ static void GLES2_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
GLES2_UpdateTexture(renderer, texture, &rect, tdata->pixel_data, tdata->pitch);
|
||||
}
|
||||
|
||||
static void GLES2_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
GLES2_RenderData *renderdata = (GLES2_RenderData *)renderer->internal;
|
||||
GLES2_TextureData *data = (GLES2_TextureData *)texture->internal;
|
||||
GLenum glScaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? GL_NEAREST : GL_LINEAR;
|
||||
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (data->yuv) {
|
||||
renderdata->glActiveTexture(GL_TEXTURE2);
|
||||
renderdata->glBindTexture(data->texture_type, data->texture_v);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, glScaleMode);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, glScaleMode);
|
||||
|
||||
renderdata->glActiveTexture(GL_TEXTURE1);
|
||||
renderdata->glBindTexture(data->texture_type, data->texture_u);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, glScaleMode);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, glScaleMode);
|
||||
} else if (data->nv12) {
|
||||
renderdata->glActiveTexture(GL_TEXTURE1);
|
||||
renderdata->glBindTexture(data->texture_type, data->texture_u);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, glScaleMode);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, glScaleMode);
|
||||
}
|
||||
#endif
|
||||
|
||||
renderdata->glActiveTexture(GL_TEXTURE0);
|
||||
renderdata->glBindTexture(data->texture_type, data->texture);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, glScaleMode);
|
||||
renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, glScaleMode);
|
||||
}
|
||||
|
||||
static bool GLES2_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
|
||||
@@ -2099,8 +2149,8 @@ static bool GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
|
||||
renderer->window = window;
|
||||
|
||||
renderer->name = GLES2_RenderDriver.name;
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA32);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX32);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX32);
|
||||
|
||||
@@ -2151,7 +2201,6 @@ static bool GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
|
||||
#endif
|
||||
renderer->LockTexture = GLES2_LockTexture;
|
||||
renderer->UnlockTexture = GLES2_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = GLES2_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = GLES2_SetRenderTarget;
|
||||
renderer->QueueSetViewport = GLES2_QueueNoOp;
|
||||
renderer->QueueSetDrawColor = GLES2_QueueNoOp;
|
||||
@@ -2172,7 +2221,11 @@ static bool GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
|
||||
#endif
|
||||
#ifdef GL_TEXTURE_EXTERNAL_OES
|
||||
if (GLES2_CacheShader(data, GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES, GL_FRAGMENT_SHADER)) {
|
||||
if (SDL_GL_ExtensionSupported("GL_OES_EGL_image_external")) {
|
||||
data->GL_OES_EGL_image_external_supported = true;
|
||||
if (!GLES2_CacheShader(data, GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES, GL_FRAGMENT_SHADER)) {
|
||||
goto error;
|
||||
}
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_EXTERNAL_OES);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -60,7 +60,7 @@ typedef struct
|
||||
static int vsync_sema_id = 0;
|
||||
|
||||
// PRIVATE METHODS
|
||||
static int vsync_handler(void)
|
||||
static int vsync_handler(int reason)
|
||||
{
|
||||
iSignalSema(vsync_sema_id);
|
||||
|
||||
@@ -195,21 +195,6 @@ static bool PS2_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
|
||||
return true;
|
||||
}
|
||||
|
||||
static void PS2_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
GSTEXTURE *ps2_texture = (GSTEXTURE *)texture->internal;
|
||||
/*
|
||||
set texture filtering according to scaleMode
|
||||
supported hint values are nearest (0, default) or linear (1)
|
||||
gskit scale mode is either GS_FILTER_NEAREST (good for tile-map)
|
||||
or GS_FILTER_LINEAR (good for scaling)
|
||||
*/
|
||||
uint32_t gsKitScaleMode = (scaleMode == SDL_SCALEMODE_NEAREST
|
||||
? GS_FILTER_NEAREST
|
||||
: GS_FILTER_LINEAR);
|
||||
ps2_texture->Filter = gsKitScaleMode;
|
||||
}
|
||||
|
||||
static bool PS2_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
return true;
|
||||
@@ -458,6 +443,16 @@ static bool PS2_RenderGeometry(SDL_Renderer *renderer, void *vertices, SDL_Rende
|
||||
const GSPRIMUVPOINT *verts = (GSPRIMUVPOINT *) (vertices + cmd->data.draw.first);
|
||||
GSTEXTURE *ps2_tex = (GSTEXTURE *)cmd->data.draw.texture->internal;
|
||||
|
||||
switch (cmd->data.draw.texture_scale_mode) {
|
||||
case SDL_SCALEMODE_NEAREST:
|
||||
ps2_tex->Filter = GS_FILTER_NEAREST;
|
||||
break;
|
||||
case SDL_SCALEMODE_LINEAR:
|
||||
ps2_tex->Filter = GS_FILTER_LINEAR;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
gsKit_TexManager_bind(data->gsGlobal, ps2_tex);
|
||||
gsKit_prim_list_triangle_goraud_texture_uv_3d(data->gsGlobal, ps2_tex, count, verts);
|
||||
} else {
|
||||
@@ -695,7 +690,6 @@ static bool PS2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
|
||||
renderer->UpdateTexture = PS2_UpdateTexture;
|
||||
renderer->LockTexture = PS2_LockTexture;
|
||||
renderer->UnlockTexture = PS2_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = PS2_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = PS2_SetRenderTarget;
|
||||
renderer->QueueSetViewport = PS2_QueueSetViewport;
|
||||
renderer->QueueSetDrawColor = PS2_QueueNoOp;
|
||||
|
||||
@@ -75,6 +75,8 @@ typedef struct
|
||||
unsigned int color;
|
||||
int shadeModel;
|
||||
SDL_Texture *texture;
|
||||
SDL_ScaleMode texture_scale_mode;
|
||||
SDL_TextureAddressMode texture_address_mode;
|
||||
} PSP_BlendState;
|
||||
|
||||
typedef struct
|
||||
@@ -538,20 +540,44 @@ static bool TextureShouldSwizzle(PSP_TextureData *psp_texture, SDL_Texture *text
|
||||
return !((texture->access == SDL_TEXTUREACCESS_TARGET) && InVram(psp_texture->data)) && texture->access != SDL_TEXTUREACCESS_STREAMING && (texture->w >= 16 || texture->h >= 16);
|
||||
}
|
||||
|
||||
static void SetTextureAddressMode(SDL_TextureAddressMode addressMode)
|
||||
{
|
||||
switch (addressMode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
sceGuTexWrap(GU_CLAMP, GU_CLAMP);
|
||||
break;
|
||||
case SDL_TEXTURE_ADDRESS_WRAP:
|
||||
sceGuTexWrap(GU_REPEAT, GU_REPEAT);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void SetTextureScaleMode(SDL_ScaleMode scaleMode)
|
||||
{
|
||||
switch (scaleMode) {
|
||||
case SDL_SCALEMODE_NEAREST:
|
||||
sceGuTexFilter(GU_NEAREST, GU_NEAREST);
|
||||
break;
|
||||
case SDL_SCALEMODE_LINEAR:
|
||||
sceGuTexFilter(GU_LINEAR, GU_LINEAR);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void TextureActivate(SDL_Texture *texture)
|
||||
{
|
||||
PSP_TextureData *psp_texture = (PSP_TextureData *)texture->internal;
|
||||
int scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? GU_NEAREST : GU_LINEAR;
|
||||
|
||||
// Swizzling is useless with small textures.
|
||||
if (TextureShouldSwizzle(psp_texture, texture)) {
|
||||
TextureSwizzle(psp_texture, NULL);
|
||||
}
|
||||
|
||||
sceGuTexWrap(GU_REPEAT, GU_REPEAT);
|
||||
sceGuTexMode(psp_texture->format, 0, 0, psp_texture->swizzled);
|
||||
sceGuTexFilter(scaleMode, scaleMode); // GU_NEAREST good for tile-map
|
||||
// GU_LINEAR good for scaling
|
||||
sceGuTexImage(0, psp_texture->textureWidth, psp_texture->textureHeight, psp_texture->textureWidth, psp_texture->data);
|
||||
}
|
||||
|
||||
@@ -608,11 +634,6 @@ static void PSP_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
PSP_UpdateTexture(renderer, texture, &rect, psp_texture->data, psp_texture->pitch);
|
||||
}
|
||||
|
||||
static void PSP_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
// Nothing to do because TextureActivate takes care of it
|
||||
}
|
||||
|
||||
static bool PSP_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
return true;
|
||||
@@ -1034,6 +1055,11 @@ static void PSP_SetBlendState(PSP_RenderData *data, PSP_BlendState *state)
|
||||
}
|
||||
}
|
||||
|
||||
if (state->texture) {
|
||||
SetTextureScaleMode(state->texture_scale_mode);
|
||||
SetTextureAddressMode(state->texture_address_mode);
|
||||
}
|
||||
|
||||
*current = *state;
|
||||
}
|
||||
|
||||
@@ -1117,6 +1143,8 @@ static bool PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
||||
PSP_BlendState state = {
|
||||
.color = drawstate.color,
|
||||
.texture = NULL,
|
||||
.texture_scale_mode = SDL_SCALEMODE_INVALID,
|
||||
.texture_address_mode = SDL_TEXTURE_ADDRESS_INVALID,
|
||||
.mode = cmd->data.draw.blend,
|
||||
.shadeModel = GU_FLAT
|
||||
};
|
||||
@@ -1132,6 +1160,8 @@ static bool PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
||||
PSP_BlendState state = {
|
||||
.color = drawstate.color,
|
||||
.texture = NULL,
|
||||
.texture_scale_mode = SDL_SCALEMODE_INVALID,
|
||||
.texture_address_mode = SDL_TEXTURE_ADDRESS_INVALID,
|
||||
.mode = cmd->data.draw.blend,
|
||||
.shadeModel = GU_FLAT
|
||||
};
|
||||
@@ -1147,6 +1177,8 @@ static bool PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
||||
PSP_BlendState state = {
|
||||
.color = drawstate.color,
|
||||
.texture = NULL,
|
||||
.texture_scale_mode = SDL_SCALEMODE_INVALID,
|
||||
.texture_address_mode = SDL_TEXTURE_ADDRESS_INVALID,
|
||||
.mode = cmd->data.draw.blend,
|
||||
.shadeModel = GU_FLAT
|
||||
};
|
||||
@@ -1162,6 +1194,8 @@ static bool PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
||||
PSP_BlendState state = {
|
||||
.color = drawstate.color,
|
||||
.texture = cmd->data.draw.texture,
|
||||
.texture_scale_mode = cmd->data.draw.texture_scale_mode,
|
||||
.texture_address_mode = cmd->data.draw.texture_address_mode,
|
||||
.mode = cmd->data.draw.blend,
|
||||
.shadeModel = GU_SMOOTH
|
||||
};
|
||||
@@ -1176,6 +1210,8 @@ static bool PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
||||
PSP_BlendState state = {
|
||||
.color = drawstate.color,
|
||||
.texture = cmd->data.draw.texture,
|
||||
.texture_scale_mode = cmd->data.draw.texture_scale_mode,
|
||||
.texture_address_mode = cmd->data.draw.texture_address_mode,
|
||||
.mode = cmd->data.draw.blend,
|
||||
.shadeModel = GU_SMOOTH
|
||||
};
|
||||
@@ -1197,11 +1233,12 @@ static bool PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
||||
const VertTCV *verts = (VertTCV *)(gpumem + cmd->data.draw.first);
|
||||
PSP_BlendState state = {
|
||||
.color = drawstate.color,
|
||||
.texture = NULL,
|
||||
.texture = cmd->data.draw.texture,
|
||||
.texture_scale_mode = cmd->data.draw.texture_scale_mode,
|
||||
.texture_address_mode = cmd->data.draw.texture_address_mode,
|
||||
.mode = cmd->data.draw.blend,
|
||||
.shadeModel = GU_FLAT
|
||||
.shadeModel = GU_SMOOTH
|
||||
};
|
||||
TextureActivate(cmd->data.draw.texture);
|
||||
PSP_SetBlendState(data, &state);
|
||||
sceGuDrawArray(GU_TRIANGLES, GU_TEXTURE_32BITF | GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
|
||||
}
|
||||
@@ -1310,7 +1347,6 @@ static bool PSP_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
|
||||
renderer->UpdateTexture = PSP_UpdateTexture;
|
||||
renderer->LockTexture = PSP_LockTexture;
|
||||
renderer->UnlockTexture = PSP_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = PSP_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = PSP_SetRenderTarget;
|
||||
renderer->QueueSetViewport = PSP_QueueNoOp;
|
||||
renderer->QueueSetDrawColor = PSP_QueueNoOp;
|
||||
|
||||
@@ -171,10 +171,6 @@ static void SW_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
}
|
||||
|
||||
static void SW_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
}
|
||||
|
||||
static bool SW_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
SW_RenderData *data = (SW_RenderData *)renderer->internal;
|
||||
@@ -317,7 +313,7 @@ static bool Blit_to_Screen(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *sur
|
||||
|
||||
static bool SW_RenderCopyEx(SDL_Renderer *renderer, SDL_Surface *surface, SDL_Texture *texture,
|
||||
const SDL_Rect *srcrect, const SDL_Rect *final_rect,
|
||||
const double angle, const SDL_FPoint *center, const SDL_FlipMode flip, float scale_x, float scale_y)
|
||||
const double angle, const SDL_FPoint *center, const SDL_FlipMode flip, float scale_x, float scale_y, const SDL_ScaleMode scaleMode)
|
||||
{
|
||||
SDL_Surface *src = (SDL_Surface *)texture->internal;
|
||||
SDL_Rect tmp_rect;
|
||||
@@ -412,7 +408,7 @@ static bool SW_RenderCopyEx(SDL_Renderer *renderer, SDL_Surface *surface, SDL_Te
|
||||
result = false;
|
||||
} else {
|
||||
SDL_SetSurfaceBlendMode(src_clone, SDL_BLENDMODE_NONE);
|
||||
result = SDL_BlitSurfaceScaled(src_clone, srcrect, src_scaled, &scale_rect, texture->scaleMode);
|
||||
result = SDL_BlitSurfaceScaled(src_clone, srcrect, src_scaled, &scale_rect, scaleMode);
|
||||
SDL_DestroySurface(src_clone);
|
||||
src_clone = src_scaled;
|
||||
src_scaled = NULL;
|
||||
@@ -429,7 +425,7 @@ static bool SW_RenderCopyEx(SDL_Renderer *renderer, SDL_Surface *surface, SDL_Te
|
||||
SDLgfx_rotozoomSurfaceSizeTrig(tmp_rect.w, tmp_rect.h, angle, center,
|
||||
&rect_dest, &cangle, &sangle);
|
||||
src_rotated = SDLgfx_rotateSurface(src_clone, angle,
|
||||
(texture->scaleMode == SDL_SCALEMODE_NEAREST) ? 0 : 1, flip & SDL_FLIP_HORIZONTAL, flip & SDL_FLIP_VERTICAL,
|
||||
(scaleMode == SDL_SCALEMODE_NEAREST) ? 0 : 1, flip & SDL_FLIP_HORIZONTAL, flip & SDL_FLIP_VERTICAL,
|
||||
&rect_dest, cangle, sangle, center);
|
||||
if (!src_rotated) {
|
||||
result = false;
|
||||
@@ -460,7 +456,7 @@ static bool SW_RenderCopyEx(SDL_Renderer *renderer, SDL_Surface *surface, SDL_Te
|
||||
SDL_SetSurfaceColorMod(src_rotated, rMod, gMod, bMod);
|
||||
}
|
||||
// Renderer scaling, if needed
|
||||
result = Blit_to_Screen(src_rotated, NULL, surface, &tmp_rect, scale_x, scale_y, texture->scaleMode);
|
||||
result = Blit_to_Screen(src_rotated, NULL, surface, &tmp_rect, scale_x, scale_y, scaleMode);
|
||||
} 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.
|
||||
@@ -470,7 +466,7 @@ static bool SW_RenderCopyEx(SDL_Renderer *renderer, SDL_Surface *surface, SDL_Te
|
||||
SDL_Rect mask_rect = tmp_rect;
|
||||
SDL_SetSurfaceBlendMode(mask_rotated, SDL_BLENDMODE_NONE);
|
||||
// Renderer scaling, if needed
|
||||
result = Blit_to_Screen(mask_rotated, NULL, surface, &mask_rect, scale_x, scale_y, texture->scaleMode);
|
||||
result = Blit_to_Screen(mask_rotated, NULL, surface, &mask_rect, scale_x, scale_y, scaleMode);
|
||||
if (result) {
|
||||
/* 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
|
||||
@@ -479,7 +475,7 @@ static bool SW_RenderCopyEx(SDL_Renderer *renderer, SDL_Surface *surface, SDL_Te
|
||||
SDL_SetSurfaceColorMod(src_rotated, 0, 0, 0);
|
||||
mask_rect = tmp_rect;
|
||||
// Renderer scaling, if needed
|
||||
result = Blit_to_Screen(src_rotated, NULL, surface, &mask_rect, scale_x, scale_y, texture->scaleMode);
|
||||
result = Blit_to_Screen(src_rotated, NULL, surface, &mask_rect, scale_x, scale_y, scaleMode);
|
||||
if (result) {
|
||||
/* 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
|
||||
@@ -492,7 +488,7 @@ static bool SW_RenderCopyEx(SDL_Renderer *renderer, SDL_Surface *surface, SDL_Te
|
||||
} else {
|
||||
SDL_SetSurfaceBlendMode(src_rotated_rgb, SDL_BLENDMODE_ADD);
|
||||
// Renderer scaling, if needed
|
||||
result = Blit_to_Screen(src_rotated_rgb, NULL, surface, &tmp_rect, scale_x, scale_y, texture->scaleMode);
|
||||
result = Blit_to_Screen(src_rotated_rgb, NULL, surface, &tmp_rect, scale_x, scale_y, scaleMode);
|
||||
SDL_DestroySurface(src_rotated_rgb);
|
||||
}
|
||||
}
|
||||
@@ -858,7 +854,7 @@ static bool SW_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
||||
SDL_SetSurfaceColorMod(src, 255, 255, 255);
|
||||
SDL_SetSurfaceAlphaMod(src, 255);
|
||||
|
||||
SDL_BlitSurfaceScaled(src, srcrect, tmp, &r, texture->scaleMode);
|
||||
SDL_BlitSurfaceScaled(src, srcrect, tmp, &r, cmd->data.draw.texture_scale_mode);
|
||||
|
||||
SDL_SetSurfaceColorMod(tmp, rMod, gMod, bMod);
|
||||
SDL_SetSurfaceAlphaMod(tmp, alphaMod);
|
||||
@@ -869,7 +865,7 @@ static bool SW_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
||||
// No need to set back r/g/b/a/blendmode to 'src' since it's done in PrepTextureForCopy()
|
||||
}
|
||||
} else {
|
||||
SDL_BlitSurfaceScaled(src, srcrect, surface, dstrect, texture->scaleMode);
|
||||
SDL_BlitSurfaceScaled(src, srcrect, surface, dstrect, cmd->data.draw.texture_scale_mode);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -889,7 +885,7 @@ static bool SW_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
||||
|
||||
SW_RenderCopyEx(renderer, surface, cmd->data.draw.texture, ©data->srcrect,
|
||||
©data->dstrect, copydata->angle, ©data->center, copydata->flip,
|
||||
copydata->scale_x, copydata->scale_y);
|
||||
copydata->scale_x, copydata->scale_y, cmd->data.draw.texture_scale_mode);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1135,7 +1131,6 @@ bool SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface, S
|
||||
renderer->UpdateTexture = SW_UpdateTexture;
|
||||
renderer->LockTexture = SW_LockTexture;
|
||||
renderer->UnlockTexture = SW_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = SW_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = SW_SetRenderTarget;
|
||||
renderer->QueueSetViewport = SW_QueueNoOp;
|
||||
renderer->QueueSetDrawColor = SW_QueueNoOp;
|
||||
|
||||
@@ -70,8 +70,6 @@ static bool VITA_GXM_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
|
||||
static void VITA_GXM_UnlockTexture(SDL_Renderer *renderer,
|
||||
SDL_Texture *texture);
|
||||
|
||||
static void VITA_GXM_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode);
|
||||
|
||||
static bool VITA_GXM_SetRenderTarget(SDL_Renderer *renderer,
|
||||
SDL_Texture *texture);
|
||||
|
||||
@@ -216,7 +214,6 @@ static bool VITA_GXM_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window,
|
||||
#endif
|
||||
renderer->LockTexture = VITA_GXM_LockTexture;
|
||||
renderer->UnlockTexture = VITA_GXM_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = VITA_GXM_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = VITA_GXM_SetRenderTarget;
|
||||
renderer->QueueSetViewport = VITA_GXM_QueueNoOp;
|
||||
renderer->QueueSetDrawColor = VITA_GXM_QueueSetDrawColor;
|
||||
@@ -295,9 +292,10 @@ static bool VITA_GXM_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
|
||||
texture->internal = vita_texture;
|
||||
vita_texture->scale_mode = SDL_SCALEMODE_INVALID;
|
||||
vita_texture->address_mode = SDL_TEXTURE_ADDRESS_INVALID;
|
||||
|
||||
VITA_GXM_SetTextureScaleMode(renderer, texture, texture->scaleMode);
|
||||
texture->internal = vita_texture;
|
||||
|
||||
#ifdef SDL_HAVE_YUV
|
||||
vita_texture->yuv = ((texture->format == SDL_PIXELFORMAT_IYUV) || (texture->format == SDL_PIXELFORMAT_YV12));
|
||||
@@ -582,25 +580,6 @@ static void VITA_GXM_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
// This really improves framerate when using lock/unlock.
|
||||
}
|
||||
|
||||
static void VITA_GXM_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)texture->internal;
|
||||
|
||||
/*
|
||||
set texture filtering according to scaleMode
|
||||
supported hint values are nearest (0, default) or linear (1)
|
||||
vitaScaleMode is either SCE_GXM_TEXTURE_FILTER_POINT (good for tile-map)
|
||||
or SCE_GXM_TEXTURE_FILTER_LINEAR (good for scaling)
|
||||
*/
|
||||
|
||||
int vitaScaleMode = (scaleMode == SDL_SCALEMODE_NEAREST
|
||||
? SCE_GXM_TEXTURE_FILTER_POINT
|
||||
: SCE_GXM_TEXTURE_FILTER_LINEAR);
|
||||
gxm_texture_set_filters(vita_texture->tex, vitaScaleMode, vitaScaleMode);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static bool VITA_GXM_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
return true;
|
||||
@@ -909,9 +888,41 @@ static bool SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd
|
||||
}
|
||||
}
|
||||
|
||||
if (texture) {
|
||||
VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)texture->internal;
|
||||
|
||||
if (cmd->data.draw.texture_scale_mode != vita_texture->scale_mode) {
|
||||
switch (cmd->data.draw.texture_scale_mode) {
|
||||
case SDL_SCALEMODE_NEAREST:
|
||||
gxm_texture_set_filters(vita_texture->tex, SCE_GXM_TEXTURE_FILTER_POINT, SCE_GXM_TEXTURE_FILTER_POINT);
|
||||
break;
|
||||
case SDL_SCALEMODE_LINEAR:
|
||||
gxm_texture_set_filters(vita_texture->tex, SCE_GXM_TEXTURE_FILTER_LINEAR, SCE_GXM_TEXTURE_FILTER_LINEAR);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
vita_texture->scale_mode = cmd->data.draw.texture_scale_mode;
|
||||
}
|
||||
|
||||
if (cmd->data.draw.texture_address_mode != vita_texture->address_mode) {
|
||||
switch (cmd->data.draw.texture_address_mode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
gxm_texture_set_address_mode(vita_texture->tex, SCE_GXM_TEXTURE_ADDR_CLAMP, SCE_GXM_TEXTURE_ADDR_CLAMP);
|
||||
break;
|
||||
case SDL_TEXTURE_ADDRESS_WRAP:
|
||||
gxm_texture_set_address_mode(vita_texture->tex, SCE_GXM_TEXTURE_ADDR_REPEAT, SCE_GXM_TEXTURE_ADDR_REPEAT);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
vita_texture->address_mode = cmd->data.draw.texture_address_mode;
|
||||
}
|
||||
}
|
||||
|
||||
if (texture != data->drawstate.texture) {
|
||||
if (texture) {
|
||||
VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)cmd->data.draw.texture->internal;
|
||||
VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)texture->internal;
|
||||
sceGxmSetFragmentTexture(data->gxm_context, 0, &vita_texture->tex->gxm_tex);
|
||||
}
|
||||
data->drawstate.texture = texture;
|
||||
|
||||
@@ -1122,6 +1122,12 @@ gxm_texture *create_gxm_texture(VITA_GXM_RenderData *data, unsigned int w, unsig
|
||||
return texture;
|
||||
}
|
||||
|
||||
void gxm_texture_set_address_mode(gxm_texture *texture, SceGxmTextureAddrMode u_mode, SceGxmTextureAddrMode v_mode)
|
||||
{
|
||||
sceGxmTextureSetUAddrMode(&texture->gxm_tex, u_mode);
|
||||
sceGxmTextureSetVAddrMode(&texture->gxm_tex, v_mode);
|
||||
}
|
||||
|
||||
void gxm_texture_set_filters(gxm_texture *texture, SceGxmTextureFilter min_filter, SceGxmTextureFilter mag_filter)
|
||||
{
|
||||
sceGxmTextureSetMinFilter(&texture->gxm_tex, min_filter);
|
||||
|
||||
@@ -49,6 +49,7 @@ void gxm_finish(SDL_Renderer *renderer);
|
||||
gxm_texture *create_gxm_texture(VITA_GXM_RenderData *data, unsigned int w, unsigned int h, SceGxmTextureFormat format, unsigned int isRenderTarget, unsigned int *return_w, unsigned int *return_h, unsigned int *return_pitch, float *return_wscale);
|
||||
void free_gxm_texture(VITA_GXM_RenderData *data, gxm_texture *texture);
|
||||
|
||||
void gxm_texture_set_address_mode(gxm_texture *texture, SceGxmTextureAddrMode u_mode, SceGxmTextureAddrMode v_mode);
|
||||
void gxm_texture_set_filters(gxm_texture *texture, SceGxmTextureFilter min_filter, SceGxmTextureFilter mag_filter);
|
||||
SceGxmTextureFormat gxm_texture_get_format(const gxm_texture *texture);
|
||||
|
||||
|
||||
@@ -205,6 +205,8 @@ typedef struct
|
||||
float wscale;
|
||||
bool yuv;
|
||||
bool nv12;
|
||||
SDL_ScaleMode scale_mode;
|
||||
SDL_TextureAddressMode address_mode;
|
||||
} VITA_GXM_TextureData;
|
||||
|
||||
#endif // SDL_RENDER_VITA_GXM_TYPES_H
|
||||
|
||||
@@ -255,7 +255,6 @@ typedef struct
|
||||
VkRenderPass mainRenderpasses[VULKAN_RENDERPASS_COUNT];
|
||||
VkFramebuffer mainFramebuffer;
|
||||
VULKAN_Buffer stagingBuffer;
|
||||
VkFilter scaleMode;
|
||||
SDL_Rect lockedRect;
|
||||
int width;
|
||||
int height;
|
||||
@@ -398,6 +397,8 @@ static SDL_PixelFormat VULKAN_VkFormatToSDLPixelFormat(VkFormat vkFormat)
|
||||
switch (vkFormat) {
|
||||
case VK_FORMAT_B8G8R8A8_UNORM:
|
||||
return SDL_PIXELFORMAT_ARGB8888;
|
||||
case VK_FORMAT_R8G8B8A8_UNORM:
|
||||
return SDL_PIXELFORMAT_ABGR8888;
|
||||
case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
|
||||
return SDL_PIXELFORMAT_ABGR2101010;
|
||||
case VK_FORMAT_R16G16B16A16_SFLOAT:
|
||||
@@ -452,6 +453,11 @@ static VkFormat SDLPixelFormatToVkTextureFormat(Uint32 format, Uint32 output_col
|
||||
return VK_FORMAT_B8G8R8A8_SRGB;
|
||||
}
|
||||
return VK_FORMAT_B8G8R8A8_UNORM;
|
||||
case SDL_PIXELFORMAT_ABGR8888:
|
||||
if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
return VK_FORMAT_R8G8B8A8_SRGB;
|
||||
}
|
||||
return VK_FORMAT_R8G8B8A8_UNORM;
|
||||
case SDL_PIXELFORMAT_YUY2:
|
||||
return VK_FORMAT_G8B8G8R8_422_UNORM;
|
||||
case SDL_PIXELFORMAT_UYVY:
|
||||
@@ -1228,7 +1234,7 @@ static VULKAN_PipelineState *VULKAN_CreatePipelineState(SDL_Renderer *renderer,
|
||||
|
||||
// Input assembly
|
||||
inputAssemblyStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
|
||||
inputAssemblyStateCreateInfo.topology = ( VkPrimitiveTopology ) topology;
|
||||
inputAssemblyStateCreateInfo.topology = topology;
|
||||
inputAssemblyStateCreateInfo.primitiveRestartEnable = VK_FALSE;
|
||||
|
||||
viewportStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
|
||||
@@ -2593,7 +2599,6 @@ static bool VULKAN_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, S
|
||||
} else {
|
||||
textureData->shader = SHADER_ADVANCED;
|
||||
}
|
||||
textureData->scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? VK_FILTER_NEAREST : VK_FILTER_LINEAR;
|
||||
|
||||
#ifdef SDL_HAVE_YUV
|
||||
// YUV textures must have even width and height. Also create Ycbcr conversion
|
||||
@@ -3086,17 +3091,6 @@ static void VULKAN_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
VULKAN_DestroyBuffer(rendererData, &textureData->stagingBuffer);
|
||||
}
|
||||
|
||||
static void VULKAN_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
VULKAN_TextureData *textureData = (VULKAN_TextureData *)texture->internal;
|
||||
|
||||
if (!textureData) {
|
||||
return;
|
||||
}
|
||||
|
||||
textureData->scaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? VK_FILTER_NEAREST : VK_FILTER_LINEAR;
|
||||
}
|
||||
|
||||
static bool VULKAN_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
|
||||
@@ -3253,7 +3247,7 @@ static bool VULKAN_UpdateVertexBuffer(SDL_Renderer *renderer,
|
||||
|
||||
stateCache->vertexBuffer = vertexBuffer->buffer;
|
||||
|
||||
rendererData->currentVertexBuffer++;
|
||||
rendererData->currentVertexBuffer = vbidx + 1;
|
||||
if (rendererData->currentVertexBuffer >= SDL_VULKAN_NUM_VERTEX_BUFFERS) {
|
||||
rendererData->currentVertexBuffer = 0;
|
||||
rendererData->issueBatch = true;
|
||||
@@ -3768,8 +3762,8 @@ static bool VULKAN_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand
|
||||
|
||||
VULKAN_SetupShaderConstants(renderer, cmd, texture, &constants);
|
||||
|
||||
switch (textureData->scaleMode) {
|
||||
case VK_FILTER_NEAREST:
|
||||
switch (cmd->data.draw.texture_scale_mode) {
|
||||
case SDL_SCALEMODE_NEAREST:
|
||||
switch (cmd->data.draw.texture_address_mode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
textureSampler = rendererData->samplers[VULKAN_SAMPLER_NEAREST_CLAMP];
|
||||
@@ -3781,7 +3775,7 @@ static bool VULKAN_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand
|
||||
return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
|
||||
}
|
||||
break;
|
||||
case VK_FILTER_LINEAR:
|
||||
case SDL_SCALEMODE_LINEAR:
|
||||
switch (cmd->data.draw.texture_address_mode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
textureSampler = rendererData->samplers[VULKAN_SAMPLER_LINEAR_CLAMP];
|
||||
@@ -3794,7 +3788,7 @@ static bool VULKAN_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("Unknown scale mode: %d", textureData->scaleMode);
|
||||
return SDL_SetError("Unknown scale mode: %d", cmd->data.draw.texture_scale_mode);
|
||||
}
|
||||
|
||||
if (textureData->mainImage.imageLayout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
|
||||
@@ -4283,7 +4277,6 @@ static bool VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SD
|
||||
#endif
|
||||
renderer->LockTexture = VULKAN_LockTexture;
|
||||
renderer->UnlockTexture = VULKAN_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = VULKAN_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = VULKAN_SetRenderTarget;
|
||||
renderer->QueueSetViewport = VULKAN_QueueNoOp;
|
||||
renderer->QueueSetDrawColor = VULKAN_QueueNoOp;
|
||||
@@ -4303,6 +4296,7 @@ static bool VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SD
|
||||
|
||||
renderer->name = VULKAN_RenderDriver.name;
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
|
||||
SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 16384);
|
||||
|
||||
Reference in New Issue
Block a user