Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-fonts
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Aleksandr Isakov
wine-fonts
Commits
b2d6639f
Commit
b2d6639f
authored
Aug 03, 2021
by
Alistair Leslie-Hughes
Committed by
Vitaly Lipatov
Jul 30, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
d3dx11_42: Implement D3DX11CreateTextureFromMemory
Signed-off-by:
Alistair Leslie-Hughes
<
leslie_alistair@hotmail.com
>
parent
a30d962e
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
342 additions
and
5 deletions
+342
-5
texture.c
dlls/d3dx11_43/texture.c
+342
-5
No files found.
dlls/d3dx11_43/texture.c
View file @
b2d6639f
...
...
@@ -22,6 +22,7 @@
#include "wincodec.h"
#include "wine/debug.h"
#include "wine/heap.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
d3dx
);
...
...
@@ -43,6 +44,32 @@ file_formats[] =
{
&
GUID_ContainerFormatWmp
,
D3DX11_IFF_WMP
},
};
static
const
struct
{
const
GUID
*
wic_guid
;
DXGI_FORMAT
dxgi_format
;
}
wic_pixel_formats
[]
=
{
{
&
GUID_WICPixelFormatBlackWhite
,
DXGI_FORMAT_R1_UNORM
},
{
&
GUID_WICPixelFormat8bppAlpha
,
DXGI_FORMAT_A8_UNORM
},
{
&
GUID_WICPixelFormat8bppGray
,
DXGI_FORMAT_R8_UNORM
},
{
&
GUID_WICPixelFormat16bppGray
,
DXGI_FORMAT_R16_UNORM
},
{
&
GUID_WICPixelFormat16bppGrayHalf
,
DXGI_FORMAT_R16_FLOAT
},
{
&
GUID_WICPixelFormat32bppGrayFloat
,
DXGI_FORMAT_R32_FLOAT
},
{
&
GUID_WICPixelFormat16bppBGR565
,
DXGI_FORMAT_B5G6R5_UNORM
},
{
&
GUID_WICPixelFormat16bppBGRA5551
,
DXGI_FORMAT_B5G5R5A1_UNORM
},
{
&
GUID_WICPixelFormat32bppBGR
,
DXGI_FORMAT_B8G8R8X8_UNORM
},
{
&
GUID_WICPixelFormat32bppBGRA
,
DXGI_FORMAT_B8G8R8A8_UNORM
},
{
&
GUID_WICPixelFormat32bppRGBA
,
DXGI_FORMAT_R8G8B8A8_UNORM
},
{
&
GUID_WICPixelFormat32bppRGBA1010102
,
DXGI_FORMAT_R10G10B10A2_UNORM
},
{
&
GUID_WICPixelFormat32bppRGBA1010102XR
,
DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
},
{
&
GUID_WICPixelFormat64bppRGBA
,
DXGI_FORMAT_R16G16B16A16_UNORM
},
{
&
GUID_WICPixelFormat64bppRGBAHalf
,
DXGI_FORMAT_R16G16B16A16_FLOAT
},
{
&
GUID_WICPixelFormat96bppRGBFloat
,
DXGI_FORMAT_R32G32B32_FLOAT
},
{
&
GUID_WICPixelFormat128bppRGBAFloat
,
DXGI_FORMAT_R32G32B32A32_FLOAT
}
};
static
D3DX11_IMAGE_FILE_FORMAT
wic_container_guid_to_file_format
(
GUID
*
container_format
)
{
unsigned
int
i
;
...
...
@@ -95,6 +122,175 @@ static DXGI_FORMAT get_d3dx11_dds_format(DXGI_FORMAT format)
return
format
;
}
static
const
DXGI_FORMAT
block_compressed_formats
[]
=
{
DXGI_FORMAT_BC1_TYPELESS
,
DXGI_FORMAT_BC1_UNORM
,
DXGI_FORMAT_BC1_UNORM_SRGB
,
DXGI_FORMAT_BC2_TYPELESS
,
DXGI_FORMAT_BC2_UNORM
,
DXGI_FORMAT_BC2_UNORM_SRGB
,
DXGI_FORMAT_BC3_TYPELESS
,
DXGI_FORMAT_BC3_UNORM
,
DXGI_FORMAT_BC3_UNORM_SRGB
,
DXGI_FORMAT_BC4_TYPELESS
,
DXGI_FORMAT_BC4_UNORM
,
DXGI_FORMAT_BC4_SNORM
,
DXGI_FORMAT_BC5_TYPELESS
,
DXGI_FORMAT_BC5_UNORM
,
DXGI_FORMAT_BC5_SNORM
,
DXGI_FORMAT_BC6H_TYPELESS
,
DXGI_FORMAT_BC6H_UF16
,
DXGI_FORMAT_BC6H_SF16
,
DXGI_FORMAT_BC7_TYPELESS
,
DXGI_FORMAT_BC7_UNORM
,
DXGI_FORMAT_BC7_UNORM_SRGB
};
static
BOOL
is_block_compressed
(
DXGI_FORMAT
format
)
{
unsigned
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
block_compressed_formats
);
++
i
)
if
(
format
==
block_compressed_formats
[
i
])
return
TRUE
;
return
FALSE
;
}
static
unsigned
int
get_bpp_from_format
(
DXGI_FORMAT
format
)
{
switch
(
format
)
{
case
DXGI_FORMAT_R32G32B32A32_TYPELESS
:
case
DXGI_FORMAT_R32G32B32A32_FLOAT
:
case
DXGI_FORMAT_R32G32B32A32_UINT
:
case
DXGI_FORMAT_R32G32B32A32_SINT
:
return
128
;
case
DXGI_FORMAT_R32G32B32_TYPELESS
:
case
DXGI_FORMAT_R32G32B32_FLOAT
:
case
DXGI_FORMAT_R32G32B32_UINT
:
case
DXGI_FORMAT_R32G32B32_SINT
:
return
96
;
case
DXGI_FORMAT_R16G16B16A16_TYPELESS
:
case
DXGI_FORMAT_R16G16B16A16_FLOAT
:
case
DXGI_FORMAT_R16G16B16A16_UNORM
:
case
DXGI_FORMAT_R16G16B16A16_UINT
:
case
DXGI_FORMAT_R16G16B16A16_SNORM
:
case
DXGI_FORMAT_R16G16B16A16_SINT
:
case
DXGI_FORMAT_R32G32_TYPELESS
:
case
DXGI_FORMAT_R32G32_FLOAT
:
case
DXGI_FORMAT_R32G32_UINT
:
case
DXGI_FORMAT_R32G32_SINT
:
case
DXGI_FORMAT_R32G8X24_TYPELESS
:
case
DXGI_FORMAT_D32_FLOAT_S8X24_UINT
:
case
DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS
:
case
DXGI_FORMAT_X32_TYPELESS_G8X24_UINT
:
case
DXGI_FORMAT_Y416
:
case
DXGI_FORMAT_Y210
:
case
DXGI_FORMAT_Y216
:
return
64
;
case
DXGI_FORMAT_R10G10B10A2_TYPELESS
:
case
DXGI_FORMAT_R10G10B10A2_UNORM
:
case
DXGI_FORMAT_R10G10B10A2_UINT
:
case
DXGI_FORMAT_R11G11B10_FLOAT
:
case
DXGI_FORMAT_R8G8B8A8_TYPELESS
:
case
DXGI_FORMAT_R8G8B8A8_UNORM
:
case
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
:
case
DXGI_FORMAT_R8G8B8A8_UINT
:
case
DXGI_FORMAT_R8G8B8A8_SNORM
:
case
DXGI_FORMAT_R8G8B8A8_SINT
:
case
DXGI_FORMAT_R16G16_TYPELESS
:
case
DXGI_FORMAT_R16G16_FLOAT
:
case
DXGI_FORMAT_R16G16_UNORM
:
case
DXGI_FORMAT_R16G16_UINT
:
case
DXGI_FORMAT_R16G16_SNORM
:
case
DXGI_FORMAT_R16G16_SINT
:
case
DXGI_FORMAT_R32_TYPELESS
:
case
DXGI_FORMAT_D32_FLOAT
:
case
DXGI_FORMAT_R32_FLOAT
:
case
DXGI_FORMAT_R32_UINT
:
case
DXGI_FORMAT_R32_SINT
:
case
DXGI_FORMAT_R24G8_TYPELESS
:
case
DXGI_FORMAT_D24_UNORM_S8_UINT
:
case
DXGI_FORMAT_R24_UNORM_X8_TYPELESS
:
case
DXGI_FORMAT_X24_TYPELESS_G8_UINT
:
case
DXGI_FORMAT_R9G9B9E5_SHAREDEXP
:
case
DXGI_FORMAT_R8G8_B8G8_UNORM
:
case
DXGI_FORMAT_G8R8_G8B8_UNORM
:
case
DXGI_FORMAT_B8G8R8A8_UNORM
:
case
DXGI_FORMAT_B8G8R8X8_UNORM
:
case
DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
:
case
DXGI_FORMAT_B8G8R8A8_TYPELESS
:
case
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
:
case
DXGI_FORMAT_B8G8R8X8_TYPELESS
:
case
DXGI_FORMAT_B8G8R8X8_UNORM_SRGB
:
case
DXGI_FORMAT_AYUV
:
case
DXGI_FORMAT_Y410
:
case
DXGI_FORMAT_YUY2
:
return
32
;
case
DXGI_FORMAT_P010
:
case
DXGI_FORMAT_P016
:
return
24
;
case
DXGI_FORMAT_R8G8_TYPELESS
:
case
DXGI_FORMAT_R8G8_UNORM
:
case
DXGI_FORMAT_R8G8_UINT
:
case
DXGI_FORMAT_R8G8_SNORM
:
case
DXGI_FORMAT_R8G8_SINT
:
case
DXGI_FORMAT_R16_TYPELESS
:
case
DXGI_FORMAT_R16_FLOAT
:
case
DXGI_FORMAT_D16_UNORM
:
case
DXGI_FORMAT_R16_UNORM
:
case
DXGI_FORMAT_R16_UINT
:
case
DXGI_FORMAT_R16_SNORM
:
case
DXGI_FORMAT_R16_SINT
:
case
DXGI_FORMAT_B5G6R5_UNORM
:
case
DXGI_FORMAT_B5G5R5A1_UNORM
:
case
DXGI_FORMAT_A8P8
:
case
DXGI_FORMAT_B4G4R4A4_UNORM
:
return
16
;
case
DXGI_FORMAT_NV12
:
case
DXGI_FORMAT_420_OPAQUE
:
case
DXGI_FORMAT_NV11
:
return
12
;
case
DXGI_FORMAT_R8_TYPELESS
:
case
DXGI_FORMAT_R8_UNORM
:
case
DXGI_FORMAT_R8_UINT
:
case
DXGI_FORMAT_R8_SNORM
:
case
DXGI_FORMAT_R8_SINT
:
case
DXGI_FORMAT_A8_UNORM
:
case
DXGI_FORMAT_AI44
:
case
DXGI_FORMAT_IA44
:
case
DXGI_FORMAT_P8
:
case
DXGI_FORMAT_BC2_TYPELESS
:
case
DXGI_FORMAT_BC2_UNORM
:
case
DXGI_FORMAT_BC2_UNORM_SRGB
:
case
DXGI_FORMAT_BC3_TYPELESS
:
case
DXGI_FORMAT_BC3_UNORM
:
case
DXGI_FORMAT_BC3_UNORM_SRGB
:
case
DXGI_FORMAT_BC5_TYPELESS
:
case
DXGI_FORMAT_BC5_UNORM
:
case
DXGI_FORMAT_BC5_SNORM
:
case
DXGI_FORMAT_BC6H_TYPELESS
:
case
DXGI_FORMAT_BC6H_UF16
:
case
DXGI_FORMAT_BC6H_SF16
:
case
DXGI_FORMAT_BC7_TYPELESS
:
case
DXGI_FORMAT_BC7_UNORM
:
case
DXGI_FORMAT_BC7_UNORM_SRGB
:
return
8
;
case
DXGI_FORMAT_BC1_TYPELESS
:
case
DXGI_FORMAT_BC1_UNORM
:
case
DXGI_FORMAT_BC1_UNORM_SRGB
:
case
DXGI_FORMAT_BC4_TYPELESS
:
case
DXGI_FORMAT_BC4_UNORM
:
case
DXGI_FORMAT_BC4_SNORM
:
return
4
;
case
DXGI_FORMAT_R1_UNORM
:
return
1
;
default:
return
0
;
}
}
static
const
GUID
*
dxgi_format_to_wic_guid
(
DXGI_FORMAT
format
)
{
unsigned
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
wic_pixel_formats
);
++
i
)
{
if
(
wic_pixel_formats
[
i
].
dxgi_format
==
format
)
return
wic_pixel_formats
[
i
].
wic_guid
;
}
return
NULL
;
}
HRESULT
WINAPI
D3DX11GetImageInfoFromMemory
(
const
void
*
src_data
,
SIZE_T
src_data_size
,
ID3DX11ThreadPump
*
pump
,
D3DX11_IMAGE_INFO
*
img_info
,
HRESULT
*
hresult
)
{
...
...
@@ -229,14 +425,155 @@ HRESULT WINAPI D3DX11CreateTextureFromFileW(ID3D11Device *device, const WCHAR *f
return
E_NOTIMPL
;
}
HRESULT
WINAPI
D3DX11CreateTextureFromMemory
(
ID3D11Device
*
device
,
const
void
*
data
,
SIZE_T
data_size
,
D3DX11_IMAGE_LOAD_INFO
*
load_info
,
ID3DX11ThreadPump
*
pump
,
HRESULT
WINAPI
D3DX11CreateTextureFromMemory
(
ID3D11Device
*
device
,
const
void
*
src_
data
,
SIZE_T
src_
data_size
,
D3DX11_IMAGE_LOAD_INFO
*
load_info
,
ID3DX11ThreadPump
*
pump
,
ID3D11Resource
**
texture
,
HRESULT
*
hresult
)
{
FIXME
(
"device %p, data %p, data_size %Iu, load_info %p, pump %p, texture %p, hresult %p stub.
\n
"
,
device
,
data
,
data_size
,
load_info
,
pump
,
texture
,
hresult
);
unsigned
int
frame_count
,
width
,
height
,
stride
,
frame_size
;
IWICFormatConverter
*
converter
=
NULL
;
IWICDdsFrameDecode
*
dds_frame
=
NULL
;
D3D11_TEXTURE2D_DESC
texture_2d_desc
;
D3D11_SUBRESOURCE_DATA
resource_data
;
IWICBitmapFrameDecode
*
frame
=
NULL
;
IWICImagingFactory
*
factory
=
NULL
;
IWICBitmapDecoder
*
decoder
=
NULL
;
ID3D11Texture2D
*
texture_2d
;
D3DX11_IMAGE_INFO
img_info
;
IWICStream
*
stream
=
NULL
;
const
GUID
*
dst_format
;
BYTE
*
buffer
=
NULL
;
BOOL
can_convert
;
GUID
src_format
;
HRESULT
hr
;
return
E_NOTIMPL
;
TRACE
(
"device %p, data %p, data_size %Iu, load_info %p, pump %p, texture %p, hresult %p.
\n
"
,
device
,
src_data
,
src_data_size
,
load_info
,
pump
,
texture
,
hresult
);
if
(
!
src_data
||
!
src_data_size
||
!
texture
)
return
E_FAIL
;
if
(
load_info
)
FIXME
(
"load_info is ignored.
\n
"
);
if
(
pump
)
FIXME
(
"Thread pump is not supported yet.
\n
"
);
if
(
FAILED
(
D3DX11GetImageInfoFromMemory
(
src_data
,
src_data_size
,
NULL
,
&
img_info
,
NULL
)))
return
E_FAIL
;
if
(
img_info
.
MiscFlags
&
D3D11_RESOURCE_MISC_TEXTURECUBE
)
{
FIXME
(
"Cube map is not supported.
\n
"
);
return
E_FAIL
;
}
if
(
FAILED
(
hr
=
WICCreateImagingFactory_Proxy
(
WINCODEC_SDK_VERSION
,
&
factory
)))
goto
end
;
if
(
FAILED
(
hr
=
IWICImagingFactory_CreateStream
(
factory
,
&
stream
)))
goto
end
;
if
(
FAILED
(
hr
=
IWICStream_InitializeFromMemory
(
stream
,
(
BYTE
*
)
src_data
,
src_data_size
)))
goto
end
;
if
(
FAILED
(
hr
=
IWICImagingFactory_CreateDecoderFromStream
(
factory
,
(
IStream
*
)
stream
,
NULL
,
0
,
&
decoder
)))
goto
end
;
if
(
FAILED
(
hr
=
IWICBitmapDecoder_GetFrameCount
(
decoder
,
&
frame_count
))
||
!
frame_count
)
goto
end
;
if
(
FAILED
(
hr
=
IWICBitmapDecoder_GetFrame
(
decoder
,
0
,
&
frame
)))
goto
end
;
if
(
FAILED
(
hr
=
IWICBitmapFrameDecode_GetPixelFormat
(
frame
,
&
src_format
)))
goto
end
;
width
=
img_info
.
Width
;
height
=
img_info
.
Height
;
if
(
is_block_compressed
(
img_info
.
Format
))
{
width
=
(
width
+
3
)
&
~
3
;
height
=
(
height
+
3
)
&
~
3
;
}
stride
=
(
width
*
get_bpp_from_format
(
img_info
.
Format
)
+
7
)
/
8
;
frame_size
=
stride
*
height
;
if
(
!
(
buffer
=
heap_alloc
(
frame_size
)))
{
hr
=
E_FAIL
;
goto
end
;
}
if
(
is_block_compressed
(
img_info
.
Format
))
{
if
(
FAILED
(
hr
=
IWICBitmapFrameDecode_QueryInterface
(
frame
,
&
IID_IWICDdsFrameDecode
,
(
void
**
)
&
dds_frame
)))
goto
end
;
if
(
FAILED
(
hr
=
IWICDdsFrameDecode_CopyBlocks
(
dds_frame
,
NULL
,
stride
*
4
,
frame_size
,
buffer
)))
goto
end
;
}
else
{
if
(
!
(
dst_format
=
dxgi_format_to_wic_guid
(
img_info
.
Format
)))
{
hr
=
E_FAIL
;
FIXME
(
"Unsupported DXGI format %#x.
\n
"
,
img_info
.
Format
);
goto
end
;
}
if
(
IsEqualGUID
(
&
src_format
,
dst_format
))
{
if
(
FAILED
(
hr
=
IWICBitmapFrameDecode_CopyPixels
(
frame
,
NULL
,
stride
,
frame_size
,
buffer
)))
goto
end
;
}
else
{
if
(
FAILED
(
hr
=
IWICImagingFactory_CreateFormatConverter
(
factory
,
&
converter
)))
goto
end
;
if
(
FAILED
(
hr
=
IWICFormatConverter_CanConvert
(
converter
,
&
src_format
,
dst_format
,
&
can_convert
)))
goto
end
;
if
(
!
can_convert
)
{
WARN
(
"Format converting %s to %s is not supported by WIC.
\n
"
,
debugstr_guid
(
&
src_format
),
debugstr_guid
(
dst_format
));
goto
end
;
}
if
(
FAILED
(
hr
=
IWICFormatConverter_Initialize
(
converter
,
(
IWICBitmapSource
*
)
frame
,
dst_format
,
WICBitmapDitherTypeErrorDiffusion
,
0
,
0
,
WICBitmapPaletteTypeCustom
)))
goto
end
;
if
(
FAILED
(
hr
=
IWICFormatConverter_CopyPixels
(
converter
,
NULL
,
stride
,
frame_size
,
buffer
)))
goto
end
;
}
}
memset
(
&
texture_2d_desc
,
0
,
sizeof
(
texture_2d_desc
));
texture_2d_desc
.
Width
=
width
;
texture_2d_desc
.
Height
=
height
;
texture_2d_desc
.
MipLevels
=
1
;
texture_2d_desc
.
ArraySize
=
img_info
.
ArraySize
;
texture_2d_desc
.
Format
=
img_info
.
Format
;
texture_2d_desc
.
SampleDesc
.
Count
=
1
;
texture_2d_desc
.
Usage
=
D3D11_USAGE_DEFAULT
;
texture_2d_desc
.
BindFlags
=
D3D11_BIND_SHADER_RESOURCE
;
texture_2d_desc
.
MiscFlags
=
img_info
.
MiscFlags
;
resource_data
.
pSysMem
=
buffer
;
resource_data
.
SysMemPitch
=
stride
;
resource_data
.
SysMemSlicePitch
=
frame_size
;
if
(
FAILED
(
hr
=
ID3D11Device_CreateTexture2D
(
device
,
&
texture_2d_desc
,
&
resource_data
,
&
texture_2d
)))
goto
end
;
*
texture
=
(
ID3D11Resource
*
)
texture_2d
;
hr
=
S_OK
;
end:
if
(
converter
)
IWICFormatConverter_Release
(
converter
);
if
(
dds_frame
)
IWICDdsFrameDecode_Release
(
dds_frame
);
if
(
buffer
)
heap_free
(
buffer
);
if
(
frame
)
IWICBitmapFrameDecode_Release
(
frame
);
if
(
decoder
)
IWICBitmapDecoder_Release
(
decoder
);
if
(
stream
)
IWICStream_Release
(
stream
);
if
(
factory
)
IWICImagingFactory_Release
(
factory
);
return
hr
;
}
HRESULT
WINAPI
D3DX11SaveTextureToFileW
(
ID3D11DeviceContext
*
context
,
ID3D11Resource
*
texture
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment