Added support for floating point texture formats

main
Sam Lantinga 2024-02-01 11:22:04 -08:00
parent 90597aeaef
commit 7561116873
3 changed files with 29 additions and 5 deletions

View File

@ -1383,6 +1383,17 @@ SDL_Texture *SDL_CreateTextureFromSurface(SDL_Renderer *renderer, SDL_Surface *s
}
}
/* Look for floating point pixel formats if needed */
if (format == SDL_PIXELFORMAT_UNKNOWN &&
(SDL_ISPIXELFORMAT_10BIT(fmt->format) || SDL_ISPIXELFORMAT_FLOAT(fmt->format))) {
for (i = 0; i < (int)renderer->info.num_texture_formats; ++i) {
if (SDL_ISPIXELFORMAT_FLOAT(renderer->info.texture_formats[i])) {
format = renderer->info.texture_formats[i];
break;
}
}
}
/* Fallback, choose a valid pixel format */
if (format == SDL_PIXELFORMAT_UNKNOWN) {
format = renderer->info.texture_formats[0];
@ -1410,9 +1421,12 @@ SDL_Texture *SDL_CreateTextureFromSurface(SDL_Renderer *renderer, SDL_Surface *s
}
if ((SDL_COLORSPACETRANSFER(colorspace) == SDL_TRANSFER_CHARACTERISTICS_PQ && !SDL_ISPIXELFORMAT_10BIT(format)) ||
(colorspace == SDL_COLORSPACE_SCRGB && !SDL_ISPIXELFORMAT_FLOAT(format))) {
/* Need to do SDR conversion */
colorspace = SDL_COLORSPACE_SRGB;
colorspace == SDL_COLORSPACE_SCRGB) {
if (SDL_ISPIXELFORMAT_FLOAT(format)) {
colorspace = SDL_COLORSPACE_SCRGB;
} else {
colorspace = SDL_COLORSPACE_SRGB;
}
}
props = SDL_CreateProperties();

View File

@ -217,6 +217,8 @@ Uint32 D3D11_DXGIFormatToSDLPixelFormat(DXGI_FORMAT dxgiFormat)
static DXGI_FORMAT SDLPixelFormatToDXGITextureFormat(Uint32 format, Uint32 colorspace, SDL_bool colorspace_conversion)
{
switch (format) {
case SDL_PIXELFORMAT_RGBA64_FLOAT:
return DXGI_FORMAT_R16G16B16A16_FLOAT;
case SDL_PIXELFORMAT_ARGB8888:
if (colorspace_conversion && colorspace == SDL_COLORSPACE_SRGB) {
return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
@ -241,6 +243,8 @@ static DXGI_FORMAT SDLPixelFormatToDXGITextureFormat(Uint32 format, Uint32 color
static DXGI_FORMAT SDLPixelFormatToDXGIMainResourceViewFormat(Uint32 format, Uint32 colorspace, SDL_bool colorspace_conversion)
{
switch (format) {
case SDL_PIXELFORMAT_RGBA64_FLOAT:
return DXGI_FORMAT_R16G16B16A16_FLOAT;
case SDL_PIXELFORMAT_ARGB8888:
if (colorspace_conversion && colorspace == SDL_COLORSPACE_SRGB) {
return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
@ -2603,10 +2607,11 @@ SDL_RenderDriver D3D11_RenderDriver = {
"direct3d11",
(SDL_RENDERER_ACCELERATED |
SDL_RENDERER_PRESENTVSYNC), /* flags. see SDL_RendererFlags */
6, /* num_texture_formats */
7, /* num_texture_formats */
{ /* texture_formats */
SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_XRGB8888,
SDL_PIXELFORMAT_RGBA64_FLOAT,
SDL_PIXELFORMAT_YV12,
SDL_PIXELFORMAT_IYUV,
SDL_PIXELFORMAT_NV12,

View File

@ -291,6 +291,8 @@ Uint32 D3D12_DXGIFormatToSDLPixelFormat(DXGI_FORMAT dxgiFormat)
static DXGI_FORMAT SDLPixelFormatToDXGITextureFormat(Uint32 format, Uint32 colorspace, SDL_bool colorspace_conversion)
{
switch (format) {
case SDL_PIXELFORMAT_RGBA64_FLOAT:
return DXGI_FORMAT_R16G16B16A16_FLOAT;
case SDL_PIXELFORMAT_ARGB8888:
if (colorspace_conversion && colorspace == SDL_COLORSPACE_SRGB) {
return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
@ -315,6 +317,8 @@ static DXGI_FORMAT SDLPixelFormatToDXGITextureFormat(Uint32 format, Uint32 color
static DXGI_FORMAT SDLPixelFormatToDXGIMainResourceViewFormat(Uint32 format, Uint32 colorspace, SDL_bool colorspace_conversion)
{
switch (format) {
case SDL_PIXELFORMAT_RGBA64_FLOAT:
return DXGI_FORMAT_R16G16B16A16_FLOAT;
case SDL_PIXELFORMAT_ARGB8888:
if (colorspace_conversion && colorspace == SDL_COLORSPACE_SRGB) {
return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
@ -3113,10 +3117,11 @@ SDL_RenderDriver D3D12_RenderDriver = {
"direct3d12",
(SDL_RENDERER_ACCELERATED |
SDL_RENDERER_PRESENTVSYNC), /* flags. see SDL_RendererFlags */
6, /* num_texture_formats */
7, /* num_texture_formats */
{ /* texture_formats */
SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_XRGB8888,
SDL_PIXELFORMAT_RGBA64_FLOAT,
SDL_PIXELFORMAT_YV12,
SDL_PIXELFORMAT_IYUV,
SDL_PIXELFORMAT_NV12,