dludwig@8400
|
1 |
/*
|
dludwig@8400
|
2 |
Simple DirectMedia Layer
|
slouken@8615
|
3 |
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
dludwig@8400
|
4 |
|
dludwig@8400
|
5 |
This software is provided 'as-is', without any express or implied
|
dludwig@8400
|
6 |
warranty. In no event will the authors be held liable for any damages
|
dludwig@8400
|
7 |
arising from the use of this software.
|
dludwig@8400
|
8 |
|
dludwig@8400
|
9 |
Permission is granted to anyone to use this software for any purpose,
|
dludwig@8400
|
10 |
including commercial applications, and to alter it and redistribute it
|
dludwig@8400
|
11 |
freely, subject to the following restrictions:
|
dludwig@8400
|
12 |
|
dludwig@8400
|
13 |
1. The origin of this software must not be misrepresented; you must not
|
dludwig@8400
|
14 |
claim that you wrote the original software. If you use this software
|
dludwig@8400
|
15 |
in a product, an acknowledgment in the product documentation would be
|
dludwig@8400
|
16 |
appreciated but is not required.
|
dludwig@8400
|
17 |
2. Altered source versions must be plainly marked as such, and must not be
|
dludwig@8400
|
18 |
misrepresented as being the original software.
|
dludwig@8400
|
19 |
3. This notice may not be removed or altered from any source distribution.
|
dludwig@8400
|
20 |
*/
|
slouken@8591
|
21 |
#include "../../SDL_internal.h"
|
dludwig@8400
|
22 |
|
dludwig@8400
|
23 |
#if SDL_VIDEO_RENDER_D3D11 && !SDL_RENDER_DISABLED
|
dludwig@8400
|
24 |
|
slouken@8591
|
25 |
#define COBJMACROS
|
dludwig@8400
|
26 |
#include "../../core/windows/SDL_windows.h"
|
dludwig@8533
|
27 |
#include "SDL_hints.h"
|
slouken@8591
|
28 |
#include "SDL_loadso.h"
|
dludwig@8400
|
29 |
#include "SDL_syswm.h"
|
dludwig@8400
|
30 |
#include "../SDL_sysrender.h"
|
slouken@8599
|
31 |
#include "../SDL_d3dmath.h"
|
dludwig@8400
|
32 |
|
slouken@8591
|
33 |
#include <d3d11_1.h>
|
dludwig@8559
|
34 |
|
dludwig@8400
|
35 |
|
dludwig@8608
|
36 |
#ifdef __WINRT__
|
dludwig@8608
|
37 |
|
dludwig@8679
|
38 |
#if NTDDI_VERSION > NTDDI_WIN8
|
dludwig@8679
|
39 |
#include <DXGI1_3.h>
|
dludwig@8679
|
40 |
#endif
|
dludwig@8679
|
41 |
|
slouken@8609
|
42 |
#include "SDL_render_winrt.h"
|
dludwig@8608
|
43 |
|
dludwig@8608
|
44 |
#if WINAPI_FAMILY == WINAPI_FAMILY_APP
|
dludwig@8608
|
45 |
#include <windows.ui.xaml.media.dxinterop.h>
|
dludwig@8608
|
46 |
/* TODO, WinRT, XAML: get the ISwapChainBackgroundPanelNative from something other than a global var */
|
dludwig@8608
|
47 |
extern ISwapChainBackgroundPanelNative * WINRT_GlobalSwapChainBackgroundPanelNative;
|
dludwig@8608
|
48 |
#endif /* WINAPI_FAMILY == WINAPI_FAMILY_APP */
|
dludwig@8608
|
49 |
|
dludwig@8608
|
50 |
#endif /* __WINRT__ */
|
dludwig@8608
|
51 |
|
dludwig@8608
|
52 |
|
slouken@8596
|
53 |
#define SAFE_RELEASE(X) if ((X)) { IUnknown_Release(SDL_static_cast(IUnknown*, X)); X = NULL; }
|
slouken@8591
|
54 |
|
dludwig@8540
|
55 |
|
dludwig@8559
|
56 |
/* Vertex shader, common values */
|
slouken@8591
|
57 |
typedef struct
|
slouken@8582
|
58 |
{
|
slouken@8591
|
59 |
Float4X4 model;
|
slouken@8591
|
60 |
Float4X4 projectionAndView;
|
slouken@8591
|
61 |
} VertexShaderConstants;
|
dludwig@8559
|
62 |
|
dludwig@8559
|
63 |
/* Per-vertex data */
|
slouken@8591
|
64 |
typedef struct
|
slouken@8582
|
65 |
{
|
slouken@8591
|
66 |
Float3 pos;
|
slouken@8591
|
67 |
Float2 tex;
|
slouken@8591
|
68 |
Float4 color;
|
slouken@8591
|
69 |
} VertexPositionColor;
|
dludwig@8559
|
70 |
|
dludwig@8559
|
71 |
/* Per-texture data */
|
dludwig@8559
|
72 |
typedef struct
|
dludwig@8559
|
73 |
{
|
slouken@8591
|
74 |
ID3D11Texture2D *mainTexture;
|
slouken@8591
|
75 |
ID3D11ShaderResourceView *mainTextureResourceView;
|
slouken@8591
|
76 |
ID3D11RenderTargetView *mainTextureRenderTargetView;
|
slouken@8591
|
77 |
ID3D11Texture2D *stagingTexture;
|
slouken@8591
|
78 |
int lockedTexturePositionX;
|
slouken@8591
|
79 |
int lockedTexturePositionY;
|
dludwig@8559
|
80 |
D3D11_FILTER scaleMode;
|
slouken@8595
|
81 |
|
slouken@8595
|
82 |
/* YV12 texture support */
|
slouken@8595
|
83 |
SDL_bool yuv;
|
slouken@8595
|
84 |
ID3D11Texture2D *mainTextureU;
|
slouken@8595
|
85 |
ID3D11ShaderResourceView *mainTextureResourceViewU;
|
slouken@8595
|
86 |
ID3D11Texture2D *mainTextureV;
|
slouken@8595
|
87 |
ID3D11ShaderResourceView *mainTextureResourceViewV;
|
slouken@8595
|
88 |
Uint8 *pixels;
|
slouken@8595
|
89 |
int pitch;
|
slouken@8595
|
90 |
SDL_Rect locked_rect;
|
dludwig@8559
|
91 |
} D3D11_TextureData;
|
dludwig@8559
|
92 |
|
dludwig@8559
|
93 |
/* Private renderer data */
|
dludwig@8559
|
94 |
typedef struct
|
dludwig@8559
|
95 |
{
|
slouken@8596
|
96 |
void *hDXGIMod;
|
slouken@8591
|
97 |
void *hD3D11Mod;
|
slouken@8596
|
98 |
IDXGIFactory2 *dxgiFactory;
|
slouken@8596
|
99 |
IDXGIAdapter *dxgiAdapter;
|
slouken@8591
|
100 |
ID3D11Device1 *d3dDevice;
|
slouken@8591
|
101 |
ID3D11DeviceContext1 *d3dContext;
|
slouken@8591
|
102 |
IDXGISwapChain1 *swapChain;
|
slouken@8591
|
103 |
DXGI_SWAP_EFFECT swapEffect;
|
slouken@8591
|
104 |
ID3D11RenderTargetView *mainRenderTargetView;
|
slouken@8591
|
105 |
ID3D11RenderTargetView *currentOffscreenRenderTargetView;
|
slouken@8591
|
106 |
ID3D11InputLayout *inputLayout;
|
slouken@8591
|
107 |
ID3D11Buffer *vertexBuffer;
|
slouken@8591
|
108 |
ID3D11VertexShader *vertexShader;
|
slouken@8595
|
109 |
ID3D11PixelShader *colorPixelShader;
|
slouken@8591
|
110 |
ID3D11PixelShader *texturePixelShader;
|
slouken@8595
|
111 |
ID3D11PixelShader *yuvPixelShader;
|
slouken@8591
|
112 |
ID3D11BlendState *blendModeBlend;
|
slouken@8591
|
113 |
ID3D11BlendState *blendModeAdd;
|
slouken@8591
|
114 |
ID3D11BlendState *blendModeMod;
|
slouken@8591
|
115 |
ID3D11SamplerState *nearestPixelSampler;
|
slouken@8591
|
116 |
ID3D11SamplerState *linearSampler;
|
dludwig@8569
|
117 |
D3D_FEATURE_LEVEL featureLevel;
|
dludwig@8569
|
118 |
|
slouken@8591
|
119 |
/* Rasterizers */
|
slouken@8591
|
120 |
ID3D11RasterizerState *mainRasterizer;
|
slouken@8591
|
121 |
ID3D11RasterizerState *clippedRasterizer;
|
dludwig@8559
|
122 |
|
slouken@8591
|
123 |
/* Vertex buffer constants */
|
dludwig@8560
|
124 |
VertexShaderConstants vertexShaderConstantsData;
|
slouken@8591
|
125 |
ID3D11Buffer *vertexShaderConstants;
|
dludwig@8559
|
126 |
|
slouken@8591
|
127 |
/* Cached renderer properties */
|
slouken@8591
|
128 |
DXGI_MODE_ROTATION rotation;
|
slouken@8591
|
129 |
ID3D11RenderTargetView *currentRenderTargetView;
|
slouken@8591
|
130 |
ID3D11RasterizerState *currentRasterizerState;
|
slouken@8591
|
131 |
ID3D11BlendState *currentBlendState;
|
slouken@8591
|
132 |
ID3D11PixelShader *currentShader;
|
slouken@8591
|
133 |
ID3D11ShaderResourceView *currentShaderResource;
|
slouken@8591
|
134 |
ID3D11SamplerState *currentSampler;
|
dludwig@8559
|
135 |
} D3D11_RenderData;
|
dludwig@8559
|
136 |
|
dludwig@8559
|
137 |
|
slouken@8591
|
138 |
/* Defined here so we don't have to include uuid.lib */
|
slouken@8591
|
139 |
static const GUID IID_IDXGIFactory2 = { 0x50c83a1c, 0xe072, 0x4c48, { 0x87, 0xb0, 0x36, 0x30, 0xfa, 0x36, 0xa6, 0xd0 } };
|
slouken@8591
|
140 |
static const GUID IID_IDXGIDevice1 = { 0x77db970f, 0x6276, 0x48ba, { 0xba, 0x28, 0x07, 0x01, 0x43, 0xb4, 0x39, 0x2c } };
|
dludwig@8679
|
141 |
static const GUID IID_IDXGIDevice3 = { 0x6007896c, 0x3244, 0x4afd, { 0xbf, 0x18, 0xa6, 0xd3, 0xbe, 0xda, 0x50, 0x23 } };
|
slouken@8591
|
142 |
static const GUID IID_ID3D11Texture2D = { 0x6f15aaf2, 0xd208, 0x4e89, { 0x9a, 0xb4, 0x48, 0x95, 0x35, 0xd3, 0x4f, 0x9c } };
|
slouken@8591
|
143 |
static const GUID IID_ID3D11Device1 = { 0xa04bfb29, 0x08ef, 0x43d6, { 0xa4, 0x9c, 0xa9, 0xbd, 0xbd, 0xcb, 0xe6, 0x86 } };
|
slouken@8591
|
144 |
static const GUID IID_ID3D11DeviceContext1 = { 0xbb2c6faa, 0xb5fb, 0x4082, { 0x8e, 0x6b, 0x38, 0x8b, 0x8c, 0xfa, 0x90, 0xe1 } };
|
slouken@8591
|
145 |
static const GUID IID_ID3D11Debug = { 0x79cf2233, 0x7536, 0x4948, { 0x9d, 0x36, 0x1e, 0x46, 0x92, 0xdc, 0x57, 0x60 } };
|
slouken@8591
|
146 |
|
dludwig@8563
|
147 |
/* Direct3D 11.x shaders
|
dludwig@8563
|
148 |
|
dludwig@8563
|
149 |
SDL's shaders are compiled into SDL itself, to simplify distribution.
|
dludwig@8563
|
150 |
|
dludwig@8563
|
151 |
All Direct3D 11.x shaders were compiled with the following:
|
slouken@8582
|
152 |
|
slouken@8582
|
153 |
fxc /E"main" /T "<TYPE>" /Fo"<OUTPUT FILE>" "<INPUT FILE>"
|
slouken@8582
|
154 |
|
slouken@8582
|
155 |
Variables:
|
slouken@8582
|
156 |
- <TYPE>: the type of shader. A table of utilized shader types is
|
slouken@8582
|
157 |
listed below.
|
slouken@8582
|
158 |
- <OUTPUT FILE>: where to store compiled output
|
slouken@8582
|
159 |
- <INPUT FILE>: where to read shader source code from
|
slouken@8582
|
160 |
|
slouken@8582
|
161 |
Shader types:
|
slouken@8582
|
162 |
- ps_4_0_level_9_1: Pixel shader for Windows 8+, including Windows RT
|
slouken@8582
|
163 |
- vs_4_0_level_9_1: Vertex shader for Windows 8+, including Windows RT
|
slouken@8582
|
164 |
- ps_4_0_level_9_3: Pixel shader for Windows Phone 8
|
slouken@8582
|
165 |
- vs_4_0_level_9_3: Vertex shader for Windows Phone 8
|
slouken@8582
|
166 |
|
slouken@8582
|
167 |
|
slouken@8582
|
168 |
Shader object code was converted to a list of DWORDs via the following
|
slouken@8582
|
169 |
*nix style command (available separately from Windows + MSVC):
|
slouken@8582
|
170 |
|
slouken@8582
|
171 |
hexdump -v -e '6/4 "0x%08.8x, " "\n"' <FILE>
|
slouken@8582
|
172 |
*/
|
slouken@8582
|
173 |
#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
slouken@8582
|
174 |
#define D3D11_USE_SHADER_MODEL_4_0_level_9_3
|
slouken@8582
|
175 |
#else
|
slouken@8582
|
176 |
#define D3D11_USE_SHADER_MODEL_4_0_level_9_1
|
slouken@8582
|
177 |
#endif
|
slouken@8582
|
178 |
|
slouken@8595
|
179 |
/* The color-only-rendering pixel shader:
|
slouken@8595
|
180 |
|
slouken@8595
|
181 |
--- D3D11_PixelShader_Colors.hlsl ---
|
slouken@8595
|
182 |
struct PixelShaderInput
|
slouken@8595
|
183 |
{
|
slouken@8595
|
184 |
float4 pos : SV_POSITION;
|
slouken@8595
|
185 |
float2 tex : TEXCOORD0;
|
slouken@8595
|
186 |
float4 color : COLOR0;
|
slouken@8595
|
187 |
};
|
slouken@8595
|
188 |
|
slouken@8595
|
189 |
float4 main(PixelShaderInput input) : SV_TARGET
|
slouken@8595
|
190 |
{
|
slouken@8595
|
191 |
return input.color;
|
slouken@8595
|
192 |
}
|
slouken@8595
|
193 |
*/
|
slouken@8595
|
194 |
#if defined(D3D11_USE_SHADER_MODEL_4_0_level_9_1)
|
slouken@8595
|
195 |
static const DWORD D3D11_PixelShader_Colors[] = {
|
slouken@8595
|
196 |
0x43425844, 0xd74c28fe, 0xa1eb8804, 0x269d512a, 0x7699723d, 0x00000001,
|
slouken@8595
|
197 |
0x00000240, 0x00000006, 0x00000038, 0x00000084, 0x000000c4, 0x00000140,
|
slouken@8595
|
198 |
0x00000198, 0x0000020c, 0x396e6f41, 0x00000044, 0x00000044, 0xffff0200,
|
slouken@8595
|
199 |
0x00000020, 0x00000024, 0x00240000, 0x00240000, 0x00240000, 0x00240000,
|
slouken@8595
|
200 |
0x00240000, 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0001, 0x02000001,
|
slouken@8595
|
201 |
0x800f0800, 0xb0e40001, 0x0000ffff, 0x52444853, 0x00000038, 0x00000040,
|
slouken@8595
|
202 |
0x0000000e, 0x03001062, 0x001010f2, 0x00000002, 0x03000065, 0x001020f2,
|
slouken@8595
|
203 |
0x00000000, 0x05000036, 0x001020f2, 0x00000000, 0x00101e46, 0x00000002,
|
slouken@8595
|
204 |
0x0100003e, 0x54415453, 0x00000074, 0x00000002, 0x00000000, 0x00000000,
|
slouken@8595
|
205 |
0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000,
|
slouken@8595
|
206 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8595
|
207 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000,
|
slouken@8595
|
208 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8595
|
209 |
0x00000000, 0x00000000, 0x46454452, 0x00000050, 0x00000000, 0x00000000,
|
slouken@8595
|
210 |
0x00000000, 0x0000001c, 0xffff0400, 0x00000100, 0x0000001c, 0x7263694d,
|
slouken@8595
|
211 |
0x666f736f, 0x52282074, 0x4c482029, 0x53204c53, 0x65646168, 0x6f432072,
|
slouken@8595
|
212 |
0x6c69706d, 0x39207265, 0x2e30332e, 0x30303239, 0x3336312e, 0xab003438,
|
slouken@8595
|
213 |
0x4e475349, 0x0000006c, 0x00000003, 0x00000008, 0x00000050, 0x00000000,
|
slouken@8595
|
214 |
0x00000001, 0x00000003, 0x00000000, 0x0000000f, 0x0000005c, 0x00000000,
|
slouken@8595
|
215 |
0x00000000, 0x00000003, 0x00000001, 0x00000003, 0x00000065, 0x00000000,
|
slouken@8595
|
216 |
0x00000000, 0x00000003, 0x00000002, 0x00000f0f, 0x505f5653, 0x5449534f,
|
slouken@8595
|
217 |
0x004e4f49, 0x43584554, 0x44524f4f, 0x4c4f4300, 0xab00524f, 0x4e47534f,
|
slouken@8595
|
218 |
0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000,
|
slouken@8595
|
219 |
0x00000003, 0x00000000, 0x0000000f, 0x545f5653, 0x45475241, 0xabab0054
|
slouken@8595
|
220 |
};
|
slouken@8595
|
221 |
#elif defined(D3D11_USE_SHADER_MODEL_4_0_level_9_3)
|
slouken@8595
|
222 |
static const DWORD D3D11_PixelShader_Colors[] = {
|
slouken@8595
|
223 |
0x43425844, 0x93f6ccfc, 0x5f919270, 0x7a11aa4f, 0x9148e931, 0x00000001,
|
slouken@8595
|
224 |
0x00000240, 0x00000006, 0x00000038, 0x00000084, 0x000000c4, 0x00000140,
|
slouken@8595
|
225 |
0x00000198, 0x0000020c, 0x396e6f41, 0x00000044, 0x00000044, 0xffff0200,
|
slouken@8595
|
226 |
0x00000020, 0x00000024, 0x00240000, 0x00240000, 0x00240000, 0x00240000,
|
slouken@8595
|
227 |
0x00240000, 0xffff0201, 0x0200001f, 0x80000000, 0xb00f0001, 0x02000001,
|
slouken@8595
|
228 |
0x800f0800, 0xb0e40001, 0x0000ffff, 0x52444853, 0x00000038, 0x00000040,
|
slouken@8595
|
229 |
0x0000000e, 0x03001062, 0x001010f2, 0x00000002, 0x03000065, 0x001020f2,
|
slouken@8595
|
230 |
0x00000000, 0x05000036, 0x001020f2, 0x00000000, 0x00101e46, 0x00000002,
|
slouken@8595
|
231 |
0x0100003e, 0x54415453, 0x00000074, 0x00000002, 0x00000000, 0x00000000,
|
slouken@8595
|
232 |
0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000,
|
slouken@8595
|
233 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8595
|
234 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000,
|
slouken@8595
|
235 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8595
|
236 |
0x00000000, 0x00000000, 0x46454452, 0x00000050, 0x00000000, 0x00000000,
|
slouken@8595
|
237 |
0x00000000, 0x0000001c, 0xffff0400, 0x00000100, 0x0000001c, 0x7263694d,
|
slouken@8595
|
238 |
0x666f736f, 0x52282074, 0x4c482029, 0x53204c53, 0x65646168, 0x6f432072,
|
slouken@8595
|
239 |
0x6c69706d, 0x39207265, 0x2e30332e, 0x30303239, 0x3336312e, 0xab003438,
|
slouken@8595
|
240 |
0x4e475349, 0x0000006c, 0x00000003, 0x00000008, 0x00000050, 0x00000000,
|
slouken@8595
|
241 |
0x00000001, 0x00000003, 0x00000000, 0x0000000f, 0x0000005c, 0x00000000,
|
slouken@8595
|
242 |
0x00000000, 0x00000003, 0x00000001, 0x00000003, 0x00000065, 0x00000000,
|
slouken@8595
|
243 |
0x00000000, 0x00000003, 0x00000002, 0x00000f0f, 0x505f5653, 0x5449534f,
|
slouken@8595
|
244 |
0x004e4f49, 0x43584554, 0x44524f4f, 0x4c4f4300, 0xab00524f, 0x4e47534f,
|
slouken@8595
|
245 |
0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000,
|
slouken@8595
|
246 |
0x00000003, 0x00000000, 0x0000000f, 0x545f5653, 0x45475241, 0xabab0054
|
slouken@8595
|
247 |
};
|
slouken@8595
|
248 |
#else
|
slouken@8595
|
249 |
#error "An appropriate 'colors' pixel shader is not defined."
|
slouken@8595
|
250 |
#endif
|
slouken@8595
|
251 |
|
slouken@8582
|
252 |
/* The texture-rendering pixel shader:
|
slouken@8582
|
253 |
|
slouken@8582
|
254 |
--- D3D11_PixelShader_Textures.hlsl ---
|
slouken@8582
|
255 |
Texture2D theTexture : register(t0);
|
slouken@8582
|
256 |
SamplerState theSampler : register(s0);
|
slouken@8582
|
257 |
|
slouken@8582
|
258 |
struct PixelShaderInput
|
slouken@8582
|
259 |
{
|
slouken@8582
|
260 |
float4 pos : SV_POSITION;
|
slouken@8582
|
261 |
float2 tex : TEXCOORD0;
|
slouken@8582
|
262 |
float4 color : COLOR0;
|
slouken@8582
|
263 |
};
|
slouken@8582
|
264 |
|
slouken@8582
|
265 |
float4 main(PixelShaderInput input) : SV_TARGET
|
slouken@8582
|
266 |
{
|
slouken@8582
|
267 |
return theTexture.Sample(theSampler, input.tex) * input.color;
|
slouken@8582
|
268 |
}
|
slouken@8582
|
269 |
*/
|
slouken@8582
|
270 |
#if defined(D3D11_USE_SHADER_MODEL_4_0_level_9_1)
|
slouken@8582
|
271 |
static const DWORD D3D11_PixelShader_Textures[] = {
|
slouken@8582
|
272 |
0x43425844, 0x6299b59f, 0x155258f2, 0x873ab86a, 0xfcbb6dcd, 0x00000001,
|
slouken@8582
|
273 |
0x00000330, 0x00000006, 0x00000038, 0x000000c0, 0x0000015c, 0x000001d8,
|
slouken@8582
|
274 |
0x00000288, 0x000002fc, 0x396e6f41, 0x00000080, 0x00000080, 0xffff0200,
|
slouken@8582
|
275 |
0x00000058, 0x00000028, 0x00280000, 0x00280000, 0x00280000, 0x00240001,
|
slouken@8582
|
276 |
0x00280000, 0x00000000, 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000,
|
slouken@8582
|
277 |
0x0200001f, 0x80000000, 0xb00f0001, 0x0200001f, 0x90000000, 0xa00f0800,
|
slouken@8582
|
278 |
0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000005, 0x800f0000,
|
slouken@8582
|
279 |
0x80e40000, 0xb0e40001, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff,
|
slouken@8582
|
280 |
0x52444853, 0x00000094, 0x00000040, 0x00000025, 0x0300005a, 0x00106000,
|
slouken@8582
|
281 |
0x00000000, 0x04001858, 0x00107000, 0x00000000, 0x00005555, 0x03001062,
|
slouken@8582
|
282 |
0x00101032, 0x00000001, 0x03001062, 0x001010f2, 0x00000002, 0x03000065,
|
slouken@8582
|
283 |
0x001020f2, 0x00000000, 0x02000068, 0x00000001, 0x09000045, 0x001000f2,
|
slouken@8582
|
284 |
0x00000000, 0x00101046, 0x00000001, 0x00107e46, 0x00000000, 0x00106000,
|
slouken@8582
|
285 |
0x00000000, 0x07000038, 0x001020f2, 0x00000000, 0x00100e46, 0x00000000,
|
slouken@8582
|
286 |
0x00101e46, 0x00000002, 0x0100003e, 0x54415453, 0x00000074, 0x00000003,
|
slouken@8582
|
287 |
0x00000001, 0x00000000, 0x00000003, 0x00000001, 0x00000000, 0x00000000,
|
slouken@8582
|
288 |
0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
289 |
0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
290 |
0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
291 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x46454452, 0x000000a8,
|
slouken@8582
|
292 |
0x00000000, 0x00000000, 0x00000002, 0x0000001c, 0xffff0400, 0x00000100,
|
slouken@8582
|
293 |
0x00000072, 0x0000005c, 0x00000003, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
294 |
0x00000000, 0x00000001, 0x00000001, 0x00000067, 0x00000002, 0x00000005,
|
slouken@8582
|
295 |
0x00000004, 0xffffffff, 0x00000000, 0x00000001, 0x0000000d, 0x53656874,
|
slouken@8582
|
296 |
0x6c706d61, 0x74007265, 0x65546568, 0x72757478, 0x694d0065, 0x736f7263,
|
slouken@8582
|
297 |
0x2074666f, 0x20295228, 0x4c534c48, 0x61685320, 0x20726564, 0x706d6f43,
|
slouken@8582
|
298 |
0x72656c69, 0x332e3920, 0x32392e30, 0x312e3030, 0x34383336, 0xababab00,
|
slouken@8582
|
299 |
0x4e475349, 0x0000006c, 0x00000003, 0x00000008, 0x00000050, 0x00000000,
|
slouken@8582
|
300 |
0x00000001, 0x00000003, 0x00000000, 0x0000000f, 0x0000005c, 0x00000000,
|
slouken@8582
|
301 |
0x00000000, 0x00000003, 0x00000001, 0x00000303, 0x00000065, 0x00000000,
|
slouken@8582
|
302 |
0x00000000, 0x00000003, 0x00000002, 0x00000f0f, 0x505f5653, 0x5449534f,
|
slouken@8582
|
303 |
0x004e4f49, 0x43584554, 0x44524f4f, 0x4c4f4300, 0xab00524f, 0x4e47534f,
|
slouken@8582
|
304 |
0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000,
|
slouken@8582
|
305 |
0x00000003, 0x00000000, 0x0000000f, 0x545f5653, 0x45475241, 0xabab0054
|
dludwig@8563
|
306 |
};
|
dludwig@8563
|
307 |
#elif defined(D3D11_USE_SHADER_MODEL_4_0_level_9_3)
|
dludwig@8563
|
308 |
static const DWORD D3D11_PixelShader_Textures[] = {
|
slouken@8582
|
309 |
0x43425844, 0x5876569a, 0x01b6c87e, 0x8447454f, 0xc7f3ef10, 0x00000001,
|
slouken@8582
|
310 |
0x00000330, 0x00000006, 0x00000038, 0x000000c0, 0x0000015c, 0x000001d8,
|
slouken@8582
|
311 |
0x00000288, 0x000002fc, 0x396e6f41, 0x00000080, 0x00000080, 0xffff0200,
|
slouken@8582
|
312 |
0x00000058, 0x00000028, 0x00280000, 0x00280000, 0x00280000, 0x00240001,
|
slouken@8582
|
313 |
0x00280000, 0x00000000, 0xffff0201, 0x0200001f, 0x80000000, 0xb0030000,
|
slouken@8582
|
314 |
0x0200001f, 0x80000000, 0xb00f0001, 0x0200001f, 0x90000000, 0xa00f0800,
|
slouken@8582
|
315 |
0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000005, 0x800f0000,
|
slouken@8582
|
316 |
0x80e40000, 0xb0e40001, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff,
|
slouken@8582
|
317 |
0x52444853, 0x00000094, 0x00000040, 0x00000025, 0x0300005a, 0x00106000,
|
slouken@8582
|
318 |
0x00000000, 0x04001858, 0x00107000, 0x00000000, 0x00005555, 0x03001062,
|
slouken@8582
|
319 |
0x00101032, 0x00000001, 0x03001062, 0x001010f2, 0x00000002, 0x03000065,
|
slouken@8582
|
320 |
0x001020f2, 0x00000000, 0x02000068, 0x00000001, 0x09000045, 0x001000f2,
|
slouken@8582
|
321 |
0x00000000, 0x00101046, 0x00000001, 0x00107e46, 0x00000000, 0x00106000,
|
slouken@8582
|
322 |
0x00000000, 0x07000038, 0x001020f2, 0x00000000, 0x00100e46, 0x00000000,
|
slouken@8582
|
323 |
0x00101e46, 0x00000002, 0x0100003e, 0x54415453, 0x00000074, 0x00000003,
|
slouken@8582
|
324 |
0x00000001, 0x00000000, 0x00000003, 0x00000001, 0x00000000, 0x00000000,
|
slouken@8582
|
325 |
0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
326 |
0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
327 |
0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
328 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x46454452, 0x000000a8,
|
slouken@8582
|
329 |
0x00000000, 0x00000000, 0x00000002, 0x0000001c, 0xffff0400, 0x00000100,
|
slouken@8582
|
330 |
0x00000072, 0x0000005c, 0x00000003, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
331 |
0x00000000, 0x00000001, 0x00000001, 0x00000067, 0x00000002, 0x00000005,
|
slouken@8582
|
332 |
0x00000004, 0xffffffff, 0x00000000, 0x00000001, 0x0000000d, 0x53656874,
|
slouken@8582
|
333 |
0x6c706d61, 0x74007265, 0x65546568, 0x72757478, 0x694d0065, 0x736f7263,
|
slouken@8582
|
334 |
0x2074666f, 0x20295228, 0x4c534c48, 0x61685320, 0x20726564, 0x706d6f43,
|
slouken@8582
|
335 |
0x72656c69, 0x332e3920, 0x32392e30, 0x312e3030, 0x34383336, 0xababab00,
|
slouken@8582
|
336 |
0x4e475349, 0x0000006c, 0x00000003, 0x00000008, 0x00000050, 0x00000000,
|
slouken@8582
|
337 |
0x00000001, 0x00000003, 0x00000000, 0x0000000f, 0x0000005c, 0x00000000,
|
slouken@8582
|
338 |
0x00000000, 0x00000003, 0x00000001, 0x00000303, 0x00000065, 0x00000000,
|
slouken@8582
|
339 |
0x00000000, 0x00000003, 0x00000002, 0x00000f0f, 0x505f5653, 0x5449534f,
|
slouken@8582
|
340 |
0x004e4f49, 0x43584554, 0x44524f4f, 0x4c4f4300, 0xab00524f, 0x4e47534f,
|
slouken@8582
|
341 |
0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000,
|
dludwig@8563
|
342 |
0x00000003, 0x00000000, 0x0000000f, 0x545f5653, 0x45475241, 0xabab0054
|
dludwig@8563
|
343 |
};
|
dludwig@8563
|
344 |
#else
|
dludwig@8563
|
345 |
#error "An appropriate 'textures' pixel shader is not defined"
|
dludwig@8563
|
346 |
#endif
|
dludwig@8563
|
347 |
|
slouken@8595
|
348 |
/* The yuv-rendering pixel shader:
|
slouken@8595
|
349 |
|
slouken@8595
|
350 |
--- D3D11_PixelShader_YUV.hlsl ---
|
slouken@8595
|
351 |
Texture2D theTextureY : register(t0);
|
slouken@8595
|
352 |
Texture2D theTextureU : register(t1);
|
slouken@8595
|
353 |
Texture2D theTextureV : register(t2);
|
slouken@8595
|
354 |
SamplerState theSampler : register(s0);
|
slouken@8595
|
355 |
|
slouken@8595
|
356 |
struct PixelShaderInput
|
slouken@8595
|
357 |
{
|
slouken@8595
|
358 |
float4 pos : SV_POSITION;
|
slouken@8595
|
359 |
float2 tex : TEXCOORD0;
|
slouken@8595
|
360 |
float4 color : COLOR0;
|
slouken@8595
|
361 |
};
|
dludwig@8563
|
362 |
|
slouken@8596
|
363 |
float4 main(PixelShaderInput input) : SV_TARGET
|
slouken@8596
|
364 |
{
|
slouken@8596
|
365 |
const float3 offset = {-0.0625, -0.5, -0.5};
|
slouken@8596
|
366 |
const float3 Rcoeff = {1.164, 0.000, 1.596};
|
slouken@8596
|
367 |
const float3 Gcoeff = {1.164, -0.391, -0.813};
|
slouken@8596
|
368 |
const float3 Bcoeff = {1.164, 2.018, 0.000};
|
slouken@8596
|
369 |
|
slouken@8596
|
370 |
float4 Output;
|
slouken@8596
|
371 |
|
slouken@8596
|
372 |
float3 yuv;
|
slouken@8596
|
373 |
yuv.x = theTextureY.Sample(theSampler, input.tex).r;
|
slouken@8596
|
374 |
yuv.y = theTextureU.Sample(theSampler, input.tex).r;
|
slouken@8596
|
375 |
yuv.z = theTextureV.Sample(theSampler, input.tex).r;
|
slouken@8596
|
376 |
|
slouken@8596
|
377 |
yuv += offset;
|
slouken@8596
|
378 |
Output.r = dot(yuv, Rcoeff);
|
slouken@8596
|
379 |
Output.g = dot(yuv, Gcoeff);
|
slouken@8596
|
380 |
Output.b = dot(yuv, Bcoeff);
|
slouken@8596
|
381 |
Output.a = 1.0f;
|
slouken@8596
|
382 |
|
slouken@8596
|
383 |
return Output * input.color;
|
slouken@8596
|
384 |
}
|
slouken@8582
|
385 |
|
slouken@8582
|
386 |
*/
|
dludwig@8563
|
387 |
#if defined(D3D11_USE_SHADER_MODEL_4_0_level_9_1)
|
slouken@8595
|
388 |
static const DWORD D3D11_PixelShader_YUV[] = {
|
slouken@8596
|
389 |
0x43425844, 0x04e69cba, 0x74ce6dd2, 0x7fcf84cb, 0x3003d677, 0x00000001,
|
slouken@8596
|
390 |
0x000005e8, 0x00000006, 0x00000038, 0x000001dc, 0x000003bc, 0x00000438,
|
slouken@8596
|
391 |
0x00000540, 0x000005b4, 0x396e6f41, 0x0000019c, 0x0000019c, 0xffff0200,
|
slouken@8596
|
392 |
0x0000016c, 0x00000030, 0x00300000, 0x00300000, 0x00300000, 0x00240003,
|
slouken@8596
|
393 |
0x00300000, 0x00000000, 0x00010001, 0x00020002, 0xffff0200, 0x05000051,
|
slouken@8596
|
394 |
0xa00f0000, 0xbd800000, 0xbf000000, 0xbf000000, 0x3f800000, 0x05000051,
|
slouken@8596
|
395 |
0xa00f0001, 0x3f94fdf4, 0x3fcc49ba, 0x00000000, 0x00000000, 0x05000051,
|
slouken@8596
|
396 |
0xa00f0002, 0x3f94fdf4, 0xbec83127, 0xbf5020c5, 0x00000000, 0x05000051,
|
slouken@8596
|
397 |
0xa00f0003, 0x3f94fdf4, 0x400126e9, 0x00000000, 0x00000000, 0x0200001f,
|
slouken@8596
|
398 |
0x80000000, 0xb0030000, 0x0200001f, 0x80000000, 0xb00f0001, 0x0200001f,
|
slouken@8596
|
399 |
0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, 0x0200001f,
|
slouken@8596
|
400 |
0x90000000, 0xa00f0802, 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800,
|
slouken@8596
|
401 |
0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, 0x03000042, 0x800f0002,
|
slouken@8596
|
402 |
0xb0e40000, 0xa0e40802, 0x02000001, 0x80020000, 0x80000001, 0x02000001,
|
slouken@8596
|
403 |
0x80040000, 0x80000002, 0x03000002, 0x80070000, 0x80e40000, 0xa0e40000,
|
slouken@8596
|
404 |
0x03000005, 0x80080000, 0x80000000, 0xa0000001, 0x04000004, 0x80010001,
|
slouken@8596
|
405 |
0x80aa0000, 0xa0550001, 0x80ff0000, 0x03000008, 0x80020001, 0x80e40000,
|
slouken@8596
|
406 |
0xa0e40002, 0x0400005a, 0x80040001, 0x80e40000, 0xa0e40003, 0xa0aa0003,
|
slouken@8596
|
407 |
0x02000001, 0x80080001, 0xa0ff0000, 0x03000005, 0x800f0000, 0x80e40001,
|
slouken@8596
|
408 |
0xb0e40001, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, 0x52444853,
|
slouken@8596
|
409 |
0x000001d8, 0x00000040, 0x00000076, 0x0300005a, 0x00106000, 0x00000000,
|
slouken@8596
|
410 |
0x04001858, 0x00107000, 0x00000000, 0x00005555, 0x04001858, 0x00107000,
|
slouken@8596
|
411 |
0x00000001, 0x00005555, 0x04001858, 0x00107000, 0x00000002, 0x00005555,
|
slouken@8596
|
412 |
0x03001062, 0x00101032, 0x00000001, 0x03001062, 0x001010f2, 0x00000002,
|
slouken@8596
|
413 |
0x03000065, 0x001020f2, 0x00000000, 0x02000068, 0x00000002, 0x09000045,
|
slouken@8596
|
414 |
0x001000f2, 0x00000000, 0x00101046, 0x00000001, 0x00107e46, 0x00000000,
|
slouken@8596
|
415 |
0x00106000, 0x00000000, 0x09000045, 0x001000f2, 0x00000001, 0x00101046,
|
slouken@8596
|
416 |
0x00000001, 0x00107e46, 0x00000001, 0x00106000, 0x00000000, 0x05000036,
|
slouken@8596
|
417 |
0x00100022, 0x00000000, 0x0010000a, 0x00000001, 0x09000045, 0x001000f2,
|
slouken@8596
|
418 |
0x00000001, 0x00101046, 0x00000001, 0x00107e46, 0x00000002, 0x00106000,
|
slouken@8596
|
419 |
0x00000000, 0x05000036, 0x00100042, 0x00000000, 0x0010000a, 0x00000001,
|
slouken@8596
|
420 |
0x0a000000, 0x00100072, 0x00000000, 0x00100246, 0x00000000, 0x00004002,
|
slouken@8596
|
421 |
0xbd800000, 0xbf000000, 0xbf000000, 0x00000000, 0x0a00000f, 0x00100012,
|
slouken@8596
|
422 |
0x00000001, 0x00100086, 0x00000000, 0x00004002, 0x3f94fdf4, 0x3fcc49ba,
|
slouken@8596
|
423 |
0x00000000, 0x00000000, 0x0a000010, 0x00100022, 0x00000001, 0x00100246,
|
slouken@8596
|
424 |
0x00000000, 0x00004002, 0x3f94fdf4, 0xbec83127, 0xbf5020c5, 0x00000000,
|
slouken@8596
|
425 |
0x0a00000f, 0x00100042, 0x00000001, 0x00100046, 0x00000000, 0x00004002,
|
slouken@8596
|
426 |
0x3f94fdf4, 0x400126e9, 0x00000000, 0x00000000, 0x05000036, 0x00100082,
|
slouken@8596
|
427 |
0x00000001, 0x00004001, 0x3f800000, 0x07000038, 0x001020f2, 0x00000000,
|
slouken@8596
|
428 |
0x00100e46, 0x00000001, 0x00101e46, 0x00000002, 0x0100003e, 0x54415453,
|
slouken@8596
|
429 |
0x00000074, 0x0000000c, 0x00000002, 0x00000000, 0x00000003, 0x00000005,
|
slouken@8596
|
430 |
0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8596
|
431 |
0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000,
|
slouken@8596
|
432 |
0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8596
|
433 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8596
|
434 |
0x46454452, 0x00000100, 0x00000000, 0x00000000, 0x00000004, 0x0000001c,
|
slouken@8596
|
435 |
0xffff0400, 0x00000100, 0x000000cb, 0x0000009c, 0x00000003, 0x00000000,
|
slouken@8596
|
436 |
0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000000a7,
|
slouken@8596
|
437 |
0x00000002, 0x00000005, 0x00000004, 0xffffffff, 0x00000000, 0x00000001,
|
slouken@8596
|
438 |
0x0000000d, 0x000000b3, 0x00000002, 0x00000005, 0x00000004, 0xffffffff,
|
slouken@8596
|
439 |
0x00000001, 0x00000001, 0x0000000d, 0x000000bf, 0x00000002, 0x00000005,
|
slouken@8596
|
440 |
0x00000004, 0xffffffff, 0x00000002, 0x00000001, 0x0000000d, 0x53656874,
|
slouken@8596
|
441 |
0x6c706d61, 0x74007265, 0x65546568, 0x72757478, 0x74005965, 0x65546568,
|
slouken@8596
|
442 |
0x72757478, 0x74005565, 0x65546568, 0x72757478, 0x4d005665, 0x6f726369,
|
slouken@8596
|
443 |
0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320,
|
slouken@8596
|
444 |
0x656c6970, 0x2e362072, 0x36392e33, 0x312e3030, 0x34383336, 0xababab00,
|
slouken@8596
|
445 |
0x4e475349, 0x0000006c, 0x00000003, 0x00000008, 0x00000050, 0x00000000,
|
slouken@8596
|
446 |
0x00000001, 0x00000003, 0x00000000, 0x0000000f, 0x0000005c, 0x00000000,
|
slouken@8596
|
447 |
0x00000000, 0x00000003, 0x00000001, 0x00000303, 0x00000065, 0x00000000,
|
slouken@8596
|
448 |
0x00000000, 0x00000003, 0x00000002, 0x00000f0f, 0x505f5653, 0x5449534f,
|
slouken@8596
|
449 |
0x004e4f49, 0x43584554, 0x44524f4f, 0x4c4f4300, 0xab00524f, 0x4e47534f,
|
slouken@8596
|
450 |
0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000,
|
slouken@8582
|
451 |
0x00000003, 0x00000000, 0x0000000f, 0x545f5653, 0x45475241, 0xabab0054
|
slouken@8582
|
452 |
};
|
slouken@8582
|
453 |
#elif defined(D3D11_USE_SHADER_MODEL_4_0_level_9_3)
|
slouken@8595
|
454 |
static const DWORD D3D11_PixelShader_YUV[] = {
|
slouken@8596
|
455 |
0x43425844, 0xe6d969fc, 0x63cac33c, 0xa4926502, 0x5d788135, 0x00000001,
|
slouken@8596
|
456 |
0x000005c0, 0x00000006, 0x00000038, 0x000001b4, 0x00000394, 0x00000410,
|
slouken@8596
|
457 |
0x00000518, 0x0000058c, 0x396e6f41, 0x00000174, 0x00000174, 0xffff0200,
|
slouken@8596
|
458 |
0x00000144, 0x00000030, 0x00300000, 0x00300000, 0x00300000, 0x00240003,
|
slouken@8596
|
459 |
0x00300000, 0x00000000, 0x00010001, 0x00020002, 0xffff0201, 0x05000051,
|
slouken@8596
|
460 |
0xa00f0000, 0xbd800000, 0xbf000000, 0x3f800000, 0x00000000, 0x05000051,
|
slouken@8596
|
461 |
0xa00f0001, 0x3f94fdf4, 0x3fcc49ba, 0x00000000, 0x400126e9, 0x05000051,
|
slouken@8596
|
462 |
0xa00f0002, 0x3f94fdf4, 0xbec83127, 0xbf5020c5, 0x00000000, 0x0200001f,
|
slouken@8596
|
463 |
0x80000000, 0xb0030000, 0x0200001f, 0x80000000, 0xb00f0001, 0x0200001f,
|
slouken@8596
|
464 |
0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, 0x0200001f,
|
slouken@8596
|
465 |
0x90000000, 0xa00f0802, 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40801,
|
slouken@8596
|
466 |
0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40800, 0x02000001, 0x80020001,
|
slouken@8596
|
467 |
0x80000000, 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40802, 0x02000001,
|
slouken@8596
|
468 |
0x80040001, 0x80000000, 0x03000002, 0x80070000, 0x80e40001, 0xa0d40000,
|
slouken@8596
|
469 |
0x0400005a, 0x80010001, 0x80e80000, 0xa0e40001, 0xa0aa0001, 0x03000008,
|
slouken@8596
|
470 |
0x80020001, 0x80e40000, 0xa0e40002, 0x0400005a, 0x80040001, 0x80e40000,
|
slouken@8596
|
471 |
0xa0ec0001, 0xa0aa0001, 0x02000001, 0x80080001, 0xa0aa0000, 0x03000005,
|
slouken@8596
|
472 |
0x800f0000, 0x80e40001, 0xb0e40001, 0x02000001, 0x800f0800, 0x80e40000,
|
slouken@8596
|
473 |
0x0000ffff, 0x52444853, 0x000001d8, 0x00000040, 0x00000076, 0x0300005a,
|
slouken@8596
|
474 |
0x00106000, 0x00000000, 0x04001858, 0x00107000, 0x00000000, 0x00005555,
|
slouken@8596
|
475 |
0x04001858, 0x00107000, 0x00000001, 0x00005555, 0x04001858, 0x00107000,
|
slouken@8596
|
476 |
0x00000002, 0x00005555, 0x03001062, 0x00101032, 0x00000001, 0x03001062,
|
slouken@8596
|
477 |
0x001010f2, 0x00000002, 0x03000065, 0x001020f2, 0x00000000, 0x02000068,
|
slouken@8596
|
478 |
0x00000002, 0x09000045, 0x001000f2, 0x00000000, 0x00101046, 0x00000001,
|
slouken@8596
|
479 |
0x00107e46, 0x00000000, 0x00106000, 0x00000000, 0x09000045, 0x001000f2,
|
slouken@8596
|
480 |
0x00000001, 0x00101046, 0x00000001, 0x00107e46, 0x00000001, 0x00106000,
|
slouken@8596
|
481 |
0x00000000, 0x05000036, 0x00100022, 0x00000000, 0x0010000a, 0x00000001,
|
slouken@8596
|
482 |
0x09000045, 0x001000f2, 0x00000001, 0x00101046, 0x00000001, 0x00107e46,
|
slouken@8596
|
483 |
0x00000002, 0x00106000, 0x00000000, 0x05000036, 0x00100042, 0x00000000,
|
slouken@8596
|
484 |
0x0010000a, 0x00000001, 0x0a000000, 0x00100072, 0x00000000, 0x00100246,
|
slouken@8596
|
485 |
0x00000000, 0x00004002, 0xbd800000, 0xbf000000, 0xbf000000, 0x00000000,
|
slouken@8596
|
486 |
0x0a00000f, 0x00100012, 0x00000001, 0x00100086, 0x00000000, 0x00004002,
|
slouken@8596
|
487 |
0x3f94fdf4, 0x3fcc49ba, 0x00000000, 0x00000000, 0x0a000010, 0x00100022,
|
slouken@8596
|
488 |
0x00000001, 0x00100246, 0x00000000, 0x00004002, 0x3f94fdf4, 0xbec83127,
|
slouken@8596
|
489 |
0xbf5020c5, 0x00000000, 0x0a00000f, 0x00100042, 0x00000001, 0x00100046,
|
slouken@8596
|
490 |
0x00000000, 0x00004002, 0x3f94fdf4, 0x400126e9, 0x00000000, 0x00000000,
|
slouken@8596
|
491 |
0x05000036, 0x00100082, 0x00000001, 0x00004001, 0x3f800000, 0x07000038,
|
slouken@8596
|
492 |
0x001020f2, 0x00000000, 0x00100e46, 0x00000001, 0x00101e46, 0x00000002,
|
slouken@8596
|
493 |
0x0100003e, 0x54415453, 0x00000074, 0x0000000c, 0x00000002, 0x00000000,
|
slouken@8596
|
494 |
0x00000003, 0x00000005, 0x00000000, 0x00000000, 0x00000001, 0x00000000,
|
slouken@8596
|
495 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
|
slouken@8596
|
496 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
|
slouken@8596
|
497 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8596
|
498 |
0x00000000, 0x00000000, 0x46454452, 0x00000100, 0x00000000, 0x00000000,
|
slouken@8596
|
499 |
0x00000004, 0x0000001c, 0xffff0400, 0x00000100, 0x000000cb, 0x0000009c,
|
slouken@8596
|
500 |
0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
|
slouken@8596
|
501 |
0x00000001, 0x000000a7, 0x00000002, 0x00000005, 0x00000004, 0xffffffff,
|
slouken@8596
|
502 |
0x00000000, 0x00000001, 0x0000000d, 0x000000b3, 0x00000002, 0x00000005,
|
slouken@8596
|
503 |
0x00000004, 0xffffffff, 0x00000001, 0x00000001, 0x0000000d, 0x000000bf,
|
slouken@8596
|
504 |
0x00000002, 0x00000005, 0x00000004, 0xffffffff, 0x00000002, 0x00000001,
|
slouken@8596
|
505 |
0x0000000d, 0x53656874, 0x6c706d61, 0x74007265, 0x65546568, 0x72757478,
|
slouken@8596
|
506 |
0x74005965, 0x65546568, 0x72757478, 0x74005565, 0x65546568, 0x72757478,
|
slouken@8596
|
507 |
0x4d005665, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
|
slouken@8596
|
508 |
0x72656461, 0x6d6f4320, 0x656c6970, 0x2e362072, 0x36392e33, 0x312e3030,
|
slouken@8596
|
509 |
0x34383336, 0xababab00, 0x4e475349, 0x0000006c, 0x00000003, 0x00000008,
|
slouken@8596
|
510 |
0x00000050, 0x00000000, 0x00000001, 0x00000003, 0x00000000, 0x0000000f,
|
slouken@8596
|
511 |
0x0000005c, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x00000303,
|
slouken@8596
|
512 |
0x00000065, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000f0f,
|
slouken@8596
|
513 |
0x505f5653, 0x5449534f, 0x004e4f49, 0x43584554, 0x44524f4f, 0x4c4f4300,
|
slouken@8596
|
514 |
0xab00524f, 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020,
|
slouken@8596
|
515 |
0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x0000000f, 0x545f5653,
|
slouken@8595
|
516 |
0x45475241, 0xabab0054
|
slouken@8582
|
517 |
};
|
dludwig@8563
|
518 |
#else
|
slouken@8595
|
519 |
#error "An appropriate 'yuv' pixel shader is not defined."
|
dludwig@8563
|
520 |
#endif
|
dludwig@8563
|
521 |
|
dludwig@8563
|
522 |
/* The sole vertex shader:
|
dludwig@8563
|
523 |
|
dludwig@8563
|
524 |
--- D3D11_VertexShader.hlsl ---
|
slouken@8582
|
525 |
#pragma pack_matrix( row_major )
|
slouken@8582
|
526 |
|
slouken@8582
|
527 |
cbuffer VertexShaderConstants : register(b0)
|
slouken@8582
|
528 |
{
|
slouken@8582
|
529 |
matrix model;
|
slouken@8582
|
530 |
matrix projectionAndView;
|
slouken@8582
|
531 |
};
|
slouken@8582
|
532 |
|
slouken@8582
|
533 |
struct VertexShaderInput
|
slouken@8582
|
534 |
{
|
slouken@8582
|
535 |
float3 pos : POSITION;
|
slouken@8582
|
536 |
float2 tex : TEXCOORD0;
|
slouken@8582
|
537 |
float4 color : COLOR0;
|
slouken@8582
|
538 |
};
|
slouken@8582
|
539 |
|
slouken@8582
|
540 |
struct VertexShaderOutput
|
slouken@8582
|
541 |
{
|
slouken@8582
|
542 |
float4 pos : SV_POSITION;
|
slouken@8582
|
543 |
float2 tex : TEXCOORD0;
|
slouken@8582
|
544 |
float4 color : COLOR0;
|
slouken@8582
|
545 |
};
|
slouken@8582
|
546 |
|
slouken@8582
|
547 |
VertexShaderOutput main(VertexShaderInput input)
|
slouken@8582
|
548 |
{
|
slouken@8582
|
549 |
VertexShaderOutput output;
|
slouken@8582
|
550 |
float4 pos = float4(input.pos, 1.0f);
|
slouken@8582
|
551 |
|
slouken@8582
|
552 |
// Transform the vertex position into projected space.
|
slouken@8582
|
553 |
pos = mul(pos, model);
|
slouken@8582
|
554 |
pos = mul(pos, projectionAndView);
|
slouken@8582
|
555 |
output.pos = pos;
|
slouken@8582
|
556 |
|
slouken@8582
|
557 |
// Pass through texture coordinates and color values without transformation
|
slouken@8582
|
558 |
output.tex = input.tex;
|
slouken@8582
|
559 |
output.color = input.color;
|
slouken@8582
|
560 |
|
slouken@8582
|
561 |
return output;
|
slouken@8582
|
562 |
}
|
dludwig@8563
|
563 |
*/
|
dludwig@8563
|
564 |
#if defined(D3D11_USE_SHADER_MODEL_4_0_level_9_1)
|
dludwig@8563
|
565 |
static const DWORD D3D11_VertexShader[] = {
|
slouken@8582
|
566 |
0x43425844, 0x62dfae5f, 0x3e8bd8df, 0x9ec97127, 0x5044eefb, 0x00000001,
|
slouken@8582
|
567 |
0x00000598, 0x00000006, 0x00000038, 0x0000016c, 0x00000334, 0x000003b0,
|
slouken@8582
|
568 |
0x000004b4, 0x00000524, 0x396e6f41, 0x0000012c, 0x0000012c, 0xfffe0200,
|
slouken@8582
|
569 |
0x000000f8, 0x00000034, 0x00240001, 0x00300000, 0x00300000, 0x00240000,
|
slouken@8582
|
570 |
0x00300001, 0x00000000, 0x00010008, 0x00000000, 0x00000000, 0xfffe0200,
|
slouken@8582
|
571 |
0x0200001f, 0x80000005, 0x900f0000, 0x0200001f, 0x80010005, 0x900f0001,
|
slouken@8582
|
572 |
0x0200001f, 0x80020005, 0x900f0002, 0x03000005, 0x800f0000, 0x90550000,
|
slouken@8582
|
573 |
0xa0e40002, 0x04000004, 0x800f0000, 0x90000000, 0xa0e40001, 0x80e40000,
|
slouken@8582
|
574 |
0x04000004, 0x800f0000, 0x90aa0000, 0xa0e40003, 0x80e40000, 0x03000002,
|
slouken@8582
|
575 |
0x800f0000, 0x80e40000, 0xa0e40004, 0x03000005, 0x800f0001, 0x80550000,
|
slouken@8582
|
576 |
0xa0e40006, 0x04000004, 0x800f0001, 0x80000000, 0xa0e40005, 0x80e40001,
|
slouken@8582
|
577 |
0x04000004, 0x800f0001, 0x80aa0000, 0xa0e40007, 0x80e40001, 0x04000004,
|
slouken@8582
|
578 |
0x800f0000, 0x80ff0000, 0xa0e40008, 0x80e40001, 0x04000004, 0xc0030000,
|
slouken@8582
|
579 |
0x80ff0000, 0xa0e40000, 0x80e40000, 0x02000001, 0xc00c0000, 0x80e40000,
|
slouken@8582
|
580 |
0x02000001, 0xe0030000, 0x90e40001, 0x02000001, 0xe00f0001, 0x90e40002,
|
slouken@8582
|
581 |
0x0000ffff, 0x52444853, 0x000001c0, 0x00010040, 0x00000070, 0x04000059,
|
slouken@8582
|
582 |
0x00208e46, 0x00000000, 0x00000008, 0x0300005f, 0x00101072, 0x00000000,
|
slouken@8582
|
583 |
0x0300005f, 0x00101032, 0x00000001, 0x0300005f, 0x001010f2, 0x00000002,
|
slouken@8582
|
584 |
0x04000067, 0x001020f2, 0x00000000, 0x00000001, 0x03000065, 0x00102032,
|
slouken@8582
|
585 |
0x00000001, 0x03000065, 0x001020f2, 0x00000002, 0x02000068, 0x00000002,
|
slouken@8582
|
586 |
0x08000038, 0x001000f2, 0x00000000, 0x00101556, 0x00000000, 0x00208e46,
|
slouken@8582
|
587 |
0x00000000, 0x00000001, 0x0a000032, 0x001000f2, 0x00000000, 0x00101006,
|
slouken@8582
|
588 |
0x00000000, 0x00208e46, 0x00000000, 0x00000000, 0x00100e46, 0x00000000,
|
slouken@8582
|
589 |
0x0a000032, 0x001000f2, 0x00000000, 0x00101aa6, 0x00000000, 0x00208e46,
|
slouken@8582
|
590 |
0x00000000, 0x00000002, 0x00100e46, 0x00000000, 0x08000000, 0x001000f2,
|
slouken@8582
|
591 |
0x00000000, 0x00100e46, 0x00000000, 0x00208e46, 0x00000000, 0x00000003,
|
slouken@8582
|
592 |
0x08000038, 0x001000f2, 0x00000001, 0x00100556, 0x00000000, 0x00208e46,
|
slouken@8582
|
593 |
0x00000000, 0x00000005, 0x0a000032, 0x001000f2, 0x00000001, 0x00100006,
|
slouken@8582
|
594 |
0x00000000, 0x00208e46, 0x00000000, 0x00000004, 0x00100e46, 0x00000001,
|
slouken@8582
|
595 |
0x0a000032, 0x001000f2, 0x00000001, 0x00100aa6, 0x00000000, 0x00208e46,
|
slouken@8582
|
596 |
0x00000000, 0x00000006, 0x00100e46, 0x00000001, 0x0a000032, 0x001020f2,
|
slouken@8582
|
597 |
0x00000000, 0x00100ff6, 0x00000000, 0x00208e46, 0x00000000, 0x00000007,
|
slouken@8582
|
598 |
0x00100e46, 0x00000001, 0x05000036, 0x00102032, 0x00000001, 0x00101046,
|
slouken@8582
|
599 |
0x00000001, 0x05000036, 0x001020f2, 0x00000002, 0x00101e46, 0x00000002,
|
slouken@8582
|
600 |
0x0100003e, 0x54415453, 0x00000074, 0x0000000b, 0x00000002, 0x00000000,
|
slouken@8582
|
601 |
0x00000006, 0x00000003, 0x00000000, 0x00000000, 0x00000001, 0x00000000,
|
slouken@8582
|
602 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
603 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
|
slouken@8582
|
604 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
605 |
0x00000000, 0x00000000, 0x46454452, 0x000000fc, 0x00000001, 0x00000054,
|
slouken@8582
|
606 |
0x00000001, 0x0000001c, 0xfffe0400, 0x00000100, 0x000000c6, 0x0000003c,
|
slouken@8582
|
607 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
|
slouken@8582
|
608 |
0x00000001, 0x74726556, 0x68537865, 0x72656461, 0x736e6f43, 0x746e6174,
|
slouken@8582
|
609 |
0xabab0073, 0x0000003c, 0x00000002, 0x0000006c, 0x00000080, 0x00000000,
|
slouken@8582
|
610 |
0x00000000, 0x0000009c, 0x00000000, 0x00000040, 0x00000002, 0x000000a4,
|
slouken@8582
|
611 |
0x00000000, 0x000000b4, 0x00000040, 0x00000040, 0x00000002, 0x000000a4,
|
slouken@8582
|
612 |
0x00000000, 0x65646f6d, 0xabab006c, 0x00030002, 0x00040004, 0x00000000,
|
slouken@8582
|
613 |
0x00000000, 0x6a6f7270, 0x69746365, 0x6e416e6f, 0x65695664, 0x694d0077,
|
slouken@8582
|
614 |
0x736f7263, 0x2074666f, 0x20295228, 0x4c534c48, 0x61685320, 0x20726564,
|
slouken@8582
|
615 |
0x706d6f43, 0x72656c69, 0x332e3920, 0x32392e30, 0x312e3030, 0x34383336,
|
slouken@8582
|
616 |
0xababab00, 0x4e475349, 0x00000068, 0x00000003, 0x00000008, 0x00000050,
|
slouken@8582
|
617 |
0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000707, 0x00000059,
|
slouken@8582
|
618 |
0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x00000303, 0x00000062,
|
slouken@8582
|
619 |
0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000f0f, 0x49534f50,
|
slouken@8582
|
620 |
0x4e4f4954, 0x58455400, 0x524f4f43, 0x4f430044, 0x00524f4c, 0x4e47534f,
|
slouken@8582
|
621 |
0x0000006c, 0x00000003, 0x00000008, 0x00000050, 0x00000000, 0x00000001,
|
slouken@8582
|
622 |
0x00000003, 0x00000000, 0x0000000f, 0x0000005c, 0x00000000, 0x00000000,
|
slouken@8582
|
623 |
0x00000003, 0x00000001, 0x00000c03, 0x00000065, 0x00000000, 0x00000000,
|
slouken@8582
|
624 |
0x00000003, 0x00000002, 0x0000000f, 0x505f5653, 0x5449534f, 0x004e4f49,
|
dludwig@8570
|
625 |
0x43584554, 0x44524f4f, 0x4c4f4300, 0xab00524f
|
dludwig@8563
|
626 |
};
|
dludwig@8563
|
627 |
#elif defined(D3D11_USE_SHADER_MODEL_4_0_level_9_3)
|
dludwig@8563
|
628 |
static const DWORD D3D11_VertexShader[] = {
|
slouken@8582
|
629 |
0x43425844, 0x01a24e41, 0x696af551, 0x4b2a87d1, 0x82ea03f6, 0x00000001,
|
slouken@8582
|
630 |
0x00000598, 0x00000006, 0x00000038, 0x0000016c, 0x00000334, 0x000003b0,
|
slouken@8582
|
631 |
0x000004b4, 0x00000524, 0x396e6f41, 0x0000012c, 0x0000012c, 0xfffe0200,
|
slouken@8582
|
632 |
0x000000f8, 0x00000034, 0x00240001, 0x00300000, 0x00300000, 0x00240000,
|
slouken@8582
|
633 |
0x00300001, 0x00000000, 0x00010008, 0x00000000, 0x00000000, 0xfffe0201,
|
slouken@8582
|
634 |
0x0200001f, 0x80000005, 0x900f0000, 0x0200001f, 0x80010005, 0x900f0001,
|
slouken@8582
|
635 |
0x0200001f, 0x80020005, 0x900f0002, 0x03000005, 0x800f0000, 0x90550000,
|
slouken@8582
|
636 |
0xa0e40002, 0x04000004, 0x800f0000, 0x90000000, 0xa0e40001, 0x80e40000,
|
slouken@8582
|
637 |
0x04000004, 0x800f0000, 0x90aa0000, 0xa0e40003, 0x80e40000, 0x03000002,
|
slouken@8582
|
638 |
0x800f0000, 0x80e40000, 0xa0e40004, 0x03000005, 0x800f0001, 0x80550000,
|
slouken@8582
|
639 |
0xa0e40006, 0x04000004, 0x800f0001, 0x80000000, 0xa0e40005, 0x80e40001,
|
slouken@8582
|
640 |
0x04000004, 0x800f0001, 0x80aa0000, 0xa0e40007, 0x80e40001, 0x04000004,
|
slouken@8582
|
641 |
0x800f0000, 0x80ff0000, 0xa0e40008, 0x80e40001, 0x04000004, 0xc0030000,
|
slouken@8582
|
642 |
0x80ff0000, 0xa0e40000, 0x80e40000, 0x02000001, 0xc00c0000, 0x80e40000,
|
slouken@8582
|
643 |
0x02000001, 0xe0030000, 0x90e40001, 0x02000001, 0xe00f0001, 0x90e40002,
|
slouken@8582
|
644 |
0x0000ffff, 0x52444853, 0x000001c0, 0x00010040, 0x00000070, 0x04000059,
|
slouken@8582
|
645 |
0x00208e46, 0x00000000, 0x00000008, 0x0300005f, 0x00101072, 0x00000000,
|
slouken@8582
|
646 |
0x0300005f, 0x00101032, 0x00000001, 0x0300005f, 0x001010f2, 0x00000002,
|
slouken@8582
|
647 |
0x04000067, 0x001020f2, 0x00000000, 0x00000001, 0x03000065, 0x00102032,
|
slouken@8582
|
648 |
0x00000001, 0x03000065, 0x001020f2, 0x00000002, 0x02000068, 0x00000002,
|
slouken@8582
|
649 |
0x08000038, 0x001000f2, 0x00000000, 0x00101556, 0x00000000, 0x00208e46,
|
slouken@8582
|
650 |
0x00000000, 0x00000001, 0x0a000032, 0x001000f2, 0x00000000, 0x00101006,
|
slouken@8582
|
651 |
0x00000000, 0x00208e46, 0x00000000, 0x00000000, 0x00100e46, 0x00000000,
|
slouken@8582
|
652 |
0x0a000032, 0x001000f2, 0x00000000, 0x00101aa6, 0x00000000, 0x00208e46,
|
slouken@8582
|
653 |
0x00000000, 0x00000002, 0x00100e46, 0x00000000, 0x08000000, 0x001000f2,
|
slouken@8582
|
654 |
0x00000000, 0x00100e46, 0x00000000, 0x00208e46, 0x00000000, 0x00000003,
|
slouken@8582
|
655 |
0x08000038, 0x001000f2, 0x00000001, 0x00100556, 0x00000000, 0x00208e46,
|
slouken@8582
|
656 |
0x00000000, 0x00000005, 0x0a000032, 0x001000f2, 0x00000001, 0x00100006,
|
slouken@8582
|
657 |
0x00000000, 0x00208e46, 0x00000000, 0x00000004, 0x00100e46, 0x00000001,
|
slouken@8582
|
658 |
0x0a000032, 0x001000f2, 0x00000001, 0x00100aa6, 0x00000000, 0x00208e46,
|
slouken@8582
|
659 |
0x00000000, 0x00000006, 0x00100e46, 0x00000001, 0x0a000032, 0x001020f2,
|
slouken@8582
|
660 |
0x00000000, 0x00100ff6, 0x00000000, 0x00208e46, 0x00000000, 0x00000007,
|
slouken@8582
|
661 |
0x00100e46, 0x00000001, 0x05000036, 0x00102032, 0x00000001, 0x00101046,
|
slouken@8582
|
662 |
0x00000001, 0x05000036, 0x001020f2, 0x00000002, 0x00101e46, 0x00000002,
|
slouken@8582
|
663 |
0x0100003e, 0x54415453, 0x00000074, 0x0000000b, 0x00000002, 0x00000000,
|
slouken@8582
|
664 |
0x00000006, 0x00000003, 0x00000000, 0x00000000, 0x00000001, 0x00000000,
|
slouken@8582
|
665 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
666 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
|
slouken@8582
|
667 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
slouken@8582
|
668 |
0x00000000, 0x00000000, 0x46454452, 0x000000fc, 0x00000001, 0x00000054,
|
slouken@8582
|
669 |
0x00000001, 0x0000001c, 0xfffe0400, 0x00000100, 0x000000c6, 0x0000003c,
|
slouken@8582
|
670 |
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
|
slouken@8582
|
671 |
0x00000001, 0x74726556, 0x68537865, 0x72656461, 0x736e6f43, 0x746e6174,
|
slouken@8582
|
672 |
0xabab0073, 0x0000003c, 0x00000002, 0x0000006c, 0x00000080, 0x00000000,
|
slouken@8582
|
673 |
0x00000000, 0x0000009c, 0x00000000, 0x00000040, 0x00000002, 0x000000a4,
|
slouken@8582
|
674 |
0x00000000, 0x000000b4, 0x00000040, 0x00000040, 0x00000002, 0x000000a4,
|
slouken@8582
|
675 |
0x00000000, 0x65646f6d, 0xabab006c, 0x00030002, 0x00040004, 0x00000000,
|
slouken@8582
|
676 |
0x00000000, 0x6a6f7270, 0x69746365, 0x6e416e6f, 0x65695664, 0x694d0077,
|
slouken@8582
|
677 |
0x736f7263, 0x2074666f, 0x20295228, 0x4c534c48, 0x61685320, 0x20726564,
|
slouken@8582
|
678 |
0x706d6f43, 0x72656c69, 0x332e3920, 0x32392e30, 0x312e3030, 0x34383336,
|
slouken@8582
|
679 |
0xababab00, 0x4e475349, 0x00000068, 0x00000003, 0x00000008, 0x00000050,
|
slouken@8582
|
680 |
0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000707, 0x00000059,
|
slouken@8582
|
681 |
0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x00000303, 0x00000062,
|
slouken@8582
|
682 |
0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000f0f, 0x49534f50,
|
slouken@8582
|
683 |
0x4e4f4954, 0x58455400, 0x524f4f43, 0x4f430044, 0x00524f4c, 0x4e47534f,
|
slouken@8582
|
684 |
0x0000006c, 0x00000003, 0x00000008, 0x00000050, 0x00000000, 0x00000001,
|
slouken@8582
|
685 |
0x00000003, 0x00000000, 0x0000000f, 0x0000005c, 0x00000000, 0x00000000,
|
slouken@8582
|
686 |
0x00000003, 0x00000001, 0x00000c03, 0x00000065, 0x00000000, 0x00000000,
|
slouken@8582
|
687 |
0x00000003, 0x00000002, 0x0000000f, 0x505f5653, 0x5449534f, 0x004e4f49,
|
slouken@8582
|
688 |
0x43584554, 0x44524f4f, 0x4c4f4300, 0xab00524f
|
dludwig@8563
|
689 |
};
|
dludwig@8563
|
690 |
#else
|
dludwig@8563
|
691 |
#error "An appropriate vertex shader is not defined."
|
dludwig@8563
|
692 |
#endif
|
dludwig@8563
|
693 |
|
slouken@8591
|
694 |
|
dludwig@8410
|
695 |
/* Direct3D 11.1 renderer implementation */
|
dludwig@8400
|
696 |
static SDL_Renderer *D3D11_CreateRenderer(SDL_Window * window, Uint32 flags);
|
dludwig@8415
|
697 |
static void D3D11_WindowEvent(SDL_Renderer * renderer,
|
dludwig@8415
|
698 |
const SDL_WindowEvent *event);
|
dludwig@8416
|
699 |
static int D3D11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
dludwig@8416
|
700 |
static int D3D11_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
dludwig@8459
|
701 |
const SDL_Rect * rect, const void *srcPixels,
|
dludwig@8459
|
702 |
int srcPitch);
|
slouken@8595
|
703 |
static int D3D11_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
|
slouken@8595
|
704 |
const SDL_Rect * rect,
|
slouken@8595
|
705 |
const Uint8 *Yplane, int Ypitch,
|
slouken@8595
|
706 |
const Uint8 *Uplane, int Upitch,
|
slouken@8595
|
707 |
const Uint8 *Vplane, int Vpitch);
|
dludwig@8451
|
708 |
static int D3D11_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
dludwig@8451
|
709 |
const SDL_Rect * rect, void **pixels, int *pitch);
|
dludwig@8451
|
710 |
static void D3D11_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
dludwig@8459
|
711 |
static int D3D11_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture);
|
dludwig@8400
|
712 |
static int D3D11_UpdateViewport(SDL_Renderer * renderer);
|
dludwig@8482
|
713 |
static int D3D11_UpdateClipRect(SDL_Renderer * renderer);
|
dludwig@8416
|
714 |
static int D3D11_RenderClear(SDL_Renderer * renderer);
|
dludwig@8450
|
715 |
static int D3D11_RenderDrawPoints(SDL_Renderer * renderer,
|
dludwig@8450
|
716 |
const SDL_FPoint * points, int count);
|
dludwig@8449
|
717 |
static int D3D11_RenderDrawLines(SDL_Renderer * renderer,
|
dludwig@8449
|
718 |
const SDL_FPoint * points, int count);
|
dludwig@8429
|
719 |
static int D3D11_RenderFillRects(SDL_Renderer * renderer,
|
dludwig@8429
|
720 |
const SDL_FRect * rects, int count);
|
dludwig@8416
|
721 |
static int D3D11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
|
dludwig@8416
|
722 |
const SDL_Rect * srcrect, const SDL_FRect * dstrect);
|
dludwig@8455
|
723 |
static int D3D11_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
|
dludwig@8455
|
724 |
const SDL_Rect * srcrect, const SDL_FRect * dstrect,
|
dludwig@8455
|
725 |
const double angle, const SDL_FPoint * center, const SDL_RendererFlip flip);
|
dludwig@8454
|
726 |
static int D3D11_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
|
dludwig@8454
|
727 |
Uint32 format, void * pixels, int pitch);
|
dludwig@8401
|
728 |
static void D3D11_RenderPresent(SDL_Renderer * renderer);
|
dludwig@8416
|
729 |
static void D3D11_DestroyTexture(SDL_Renderer * renderer,
|
dludwig@8416
|
730 |
SDL_Texture * texture);
|
dludwig@8413
|
731 |
static void D3D11_DestroyRenderer(SDL_Renderer * renderer);
|
dludwig@8400
|
732 |
|
dludwig@8410
|
733 |
/* Direct3D 11.1 Internal Functions */
|
slouken@8591
|
734 |
static HRESULT D3D11_CreateDeviceResources(SDL_Renderer * renderer);
|
slouken@8591
|
735 |
static HRESULT D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer);
|
slouken@8591
|
736 |
static HRESULT D3D11_UpdateForWindowSizeChange(SDL_Renderer * renderer);
|
slouken@8591
|
737 |
static HRESULT D3D11_HandleDeviceLost(SDL_Renderer * renderer);
|
slouken@8591
|
738 |
static void D3D11_ReleaseMainRenderTargetView(SDL_Renderer * renderer);
|
dludwig@8400
|
739 |
|
slouken@8591
|
740 |
SDL_RenderDriver D3D11_RenderDriver = {
|
dludwig@8400
|
741 |
D3D11_CreateRenderer,
|
dludwig@8400
|
742 |
{
|
slouken@8591
|
743 |
"direct3d11",
|
dludwig@8459
|
744 |
(
|
dludwig@8459
|
745 |
SDL_RENDERER_ACCELERATED |
|
dludwig@8459
|
746 |
SDL_RENDERER_PRESENTVSYNC |
|
dludwig@8459
|
747 |
SDL_RENDERER_TARGETTEXTURE
|
slouken@8591
|
748 |
), /* flags. see SDL_RendererFlags */
|
slouken@8595
|
749 |
4, /* num_texture_formats */
|
slouken@8591
|
750 |
{ /* texture_formats */
|
slouken@8595
|
751 |
SDL_PIXELFORMAT_ARGB8888,
|
dludwig@8442
|
752 |
SDL_PIXELFORMAT_RGB888,
|
slouken@8595
|
753 |
SDL_PIXELFORMAT_YV12,
|
slouken@8595
|
754 |
SDL_PIXELFORMAT_IYUV
|
dludwig@8442
|
755 |
},
|
slouken@8591
|
756 |
0, /* max_texture_width: will be filled in later */
|
slouken@8591
|
757 |
0 /* max_texture_height: will be filled in later */
|
dludwig@8442
|
758 |
}
|
dludwig@8442
|
759 |
};
|
dludwig@8442
|
760 |
|
dludwig@8400
|
761 |
|
dludwig@8454
|
762 |
static Uint32
|
dludwig@8454
|
763 |
DXGIFormatToSDLPixelFormat(DXGI_FORMAT dxgiFormat) {
|
dludwig@8454
|
764 |
switch (dxgiFormat) {
|
dludwig@8454
|
765 |
case DXGI_FORMAT_B8G8R8A8_UNORM:
|
dludwig@8454
|
766 |
return SDL_PIXELFORMAT_ARGB8888;
|
dludwig@8454
|
767 |
case DXGI_FORMAT_B8G8R8X8_UNORM:
|
dludwig@8454
|
768 |
return SDL_PIXELFORMAT_RGB888;
|
dludwig@8454
|
769 |
default:
|
dludwig@8454
|
770 |
return SDL_PIXELFORMAT_UNKNOWN;
|
dludwig@8454
|
771 |
}
|
dludwig@8454
|
772 |
}
|
dludwig@8454
|
773 |
|
dludwig@8454
|
774 |
static DXGI_FORMAT
|
dludwig@8454
|
775 |
SDLPixelFormatToDXGIFormat(Uint32 sdlFormat)
|
dludwig@8454
|
776 |
{
|
slouken@8582
|
777 |
switch (sdlFormat) {
|
slouken@8582
|
778 |
case SDL_PIXELFORMAT_ARGB8888:
|
slouken@8582
|
779 |
return DXGI_FORMAT_B8G8R8A8_UNORM;
|
slouken@8582
|
780 |
case SDL_PIXELFORMAT_RGB888:
|
slouken@8582
|
781 |
return DXGI_FORMAT_B8G8R8X8_UNORM;
|
slouken@8595
|
782 |
case SDL_PIXELFORMAT_YV12:
|
slouken@8595
|
783 |
case SDL_PIXELFORMAT_IYUV:
|
slouken@8595
|
784 |
return DXGI_FORMAT_R8_UNORM;
|
slouken@8582
|
785 |
default:
|
slouken@8582
|
786 |
return DXGI_FORMAT_UNKNOWN;
|
slouken@8582
|
787 |
}
|
dludwig@8566
|
788 |
}
|
dludwig@8400
|
789 |
|
slouken@8582
|
790 |
SDL_Renderer *
|
slouken@8582
|
791 |
D3D11_CreateRenderer(SDL_Window * window, Uint32 flags)
|
slouken@8582
|
792 |
{
|
slouken@8582
|
793 |
SDL_Renderer *renderer;
|
slouken@8582
|
794 |
D3D11_RenderData *data;
|
slouken@8582
|
795 |
|
slouken@8582
|
796 |
renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));
|
slouken@8582
|
797 |
if (!renderer) {
|
slouken@8582
|
798 |
SDL_OutOfMemory();
|
slouken@8582
|
799 |
return NULL;
|
slouken@8582
|
800 |
}
|
slouken@8582
|
801 |
|
slouken@8591
|
802 |
data = (D3D11_RenderData *) SDL_calloc(1, sizeof(*data));
|
slouken@8582
|
803 |
if (!data) {
|
slouken@8582
|
804 |
SDL_OutOfMemory();
|
slouken@8582
|
805 |
return NULL;
|
slouken@8582
|
806 |
}
|
slouken@8582
|
807 |
|
slouken@8582
|
808 |
renderer->WindowEvent = D3D11_WindowEvent;
|
slouken@8582
|
809 |
renderer->CreateTexture = D3D11_CreateTexture;
|
slouken@8582
|
810 |
renderer->UpdateTexture = D3D11_UpdateTexture;
|
slouken@8595
|
811 |
renderer->UpdateTextureYUV = D3D11_UpdateTextureYUV;
|
slouken@8582
|
812 |
renderer->LockTexture = D3D11_LockTexture;
|
slouken@8582
|
813 |
renderer->UnlockTexture = D3D11_UnlockTexture;
|
slouken@8582
|
814 |
renderer->SetRenderTarget = D3D11_SetRenderTarget;
|
slouken@8582
|
815 |
renderer->UpdateViewport = D3D11_UpdateViewport;
|
slouken@8582
|
816 |
renderer->UpdateClipRect = D3D11_UpdateClipRect;
|
slouken@8582
|
817 |
renderer->RenderClear = D3D11_RenderClear;
|
slouken@8582
|
818 |
renderer->RenderDrawPoints = D3D11_RenderDrawPoints;
|
slouken@8582
|
819 |
renderer->RenderDrawLines = D3D11_RenderDrawLines;
|
slouken@8582
|
820 |
renderer->RenderFillRects = D3D11_RenderFillRects;
|
slouken@8582
|
821 |
renderer->RenderCopy = D3D11_RenderCopy;
|
slouken@8582
|
822 |
renderer->RenderCopyEx = D3D11_RenderCopyEx;
|
slouken@8582
|
823 |
renderer->RenderReadPixels = D3D11_RenderReadPixels;
|
slouken@8582
|
824 |
renderer->RenderPresent = D3D11_RenderPresent;
|
slouken@8582
|
825 |
renderer->DestroyTexture = D3D11_DestroyTexture;
|
slouken@8582
|
826 |
renderer->DestroyRenderer = D3D11_DestroyRenderer;
|
slouken@8582
|
827 |
renderer->info = D3D11_RenderDriver.info;
|
slouken@8591
|
828 |
renderer->info.flags = (SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
|
slouken@8582
|
829 |
renderer->driverdata = data;
|
slouken@8582
|
830 |
|
slouken@8591
|
831 |
if ((flags & SDL_RENDERER_PRESENTVSYNC)) {
|
slouken@8591
|
832 |
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
|
slouken@8591
|
833 |
}
|
slouken@8591
|
834 |
|
slouken@8591
|
835 |
/* HACK: make sure the SDL_Renderer references the SDL_Window data now, in
|
slouken@8591
|
836 |
* order to give init functions access to the underlying window handle:
|
slouken@8591
|
837 |
*/
|
slouken@8582
|
838 |
renderer->window = window;
|
slouken@8582
|
839 |
|
slouken@8582
|
840 |
/* Initialize Direct3D resources */
|
slouken@8582
|
841 |
if (FAILED(D3D11_CreateDeviceResources(renderer))) {
|
slouken@8582
|
842 |
D3D11_DestroyRenderer(renderer);
|
slouken@8582
|
843 |
return NULL;
|
slouken@8582
|
844 |
}
|
slouken@8582
|
845 |
if (FAILED(D3D11_CreateWindowSizeDependentResources(renderer))) {
|
slouken@8582
|
846 |
D3D11_DestroyRenderer(renderer);
|
slouken@8582
|
847 |
return NULL;
|
slouken@8582
|
848 |
}
|
slouken@8582
|
849 |
|
slouken@8582
|
850 |
return renderer;
|
dludwig@8400
|
851 |
}
|
dludwig@8400
|
852 |
|
dludwig@8413
|
853 |
static void
|
dludwig@8668
|
854 |
D3D11_ReleaseAll(SDL_Renderer * renderer)
|
dludwig@8413
|
855 |
{
|
dludwig@8413
|
856 |
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
dludwig@8668
|
857 |
SDL_Texture *texture = NULL;
|
slouken@8591
|
858 |
|
dludwig@8669
|
859 |
/* Release all textures */
|
dludwig@8669
|
860 |
for (texture = renderer->textures; texture; texture = texture->next) {
|
dludwig@8669
|
861 |
D3D11_DestroyTexture(renderer, texture);
|
dludwig@8669
|
862 |
}
|
dludwig@8669
|
863 |
|
dludwig@8669
|
864 |
/* Release/reset everything else */
|
dludwig@8413
|
865 |
if (data) {
|
slouken@8596
|
866 |
SAFE_RELEASE(data->dxgiFactory);
|
slouken@8596
|
867 |
SAFE_RELEASE(data->dxgiAdapter);
|
slouken@8591
|
868 |
SAFE_RELEASE(data->d3dDevice);
|
slouken@8591
|
869 |
SAFE_RELEASE(data->d3dContext);
|
slouken@8591
|
870 |
SAFE_RELEASE(data->swapChain);
|
slouken@8591
|
871 |
SAFE_RELEASE(data->mainRenderTargetView);
|
slouken@8591
|
872 |
SAFE_RELEASE(data->currentOffscreenRenderTargetView);
|
slouken@8591
|
873 |
SAFE_RELEASE(data->inputLayout);
|
slouken@8591
|
874 |
SAFE_RELEASE(data->vertexBuffer);
|
slouken@8591
|
875 |
SAFE_RELEASE(data->vertexShader);
|
slouken@8595
|
876 |
SAFE_RELEASE(data->colorPixelShader);
|
slouken@8591
|
877 |
SAFE_RELEASE(data->texturePixelShader);
|
slouken@8595
|
878 |
SAFE_RELEASE(data->yuvPixelShader);
|
slouken@8591
|
879 |
SAFE_RELEASE(data->blendModeBlend);
|
slouken@8591
|
880 |
SAFE_RELEASE(data->blendModeAdd);
|
slouken@8591
|
881 |
SAFE_RELEASE(data->blendModeMod);
|
slouken@8591
|
882 |
SAFE_RELEASE(data->nearestPixelSampler);
|
slouken@8591
|
883 |
SAFE_RELEASE(data->linearSampler);
|
slouken@8591
|
884 |
SAFE_RELEASE(data->mainRasterizer);
|
slouken@8591
|
885 |
SAFE_RELEASE(data->clippedRasterizer);
|
slouken@8591
|
886 |
SAFE_RELEASE(data->vertexShaderConstants);
|
slouken@8591
|
887 |
|
dludwig@8668
|
888 |
data->swapEffect = (DXGI_SWAP_EFFECT) 0;
|
dludwig@8668
|
889 |
data->rotation = DXGI_MODE_ROTATION_UNSPECIFIED;
|
dludwig@8668
|
890 |
data->currentRenderTargetView = NULL;
|
dludwig@8668
|
891 |
data->currentRasterizerState = NULL;
|
dludwig@8668
|
892 |
data->currentBlendState = NULL;
|
dludwig@8668
|
893 |
data->currentShader = NULL;
|
dludwig@8668
|
894 |
data->currentShaderResource = NULL;
|
dludwig@8668
|
895 |
data->currentSampler = NULL;
|
dludwig@8668
|
896 |
|
dludwig@8669
|
897 |
/* Unload the D3D libraries. This should be done last, in order
|
dludwig@8669
|
898 |
* to prevent IUnknown::Release() calls from crashing.
|
dludwig@8669
|
899 |
*/
|
dludwig@8669
|
900 |
if (data->hD3D11Mod) {
|
dludwig@8669
|
901 |
SDL_UnloadObject(data->hD3D11Mod);
|
dludwig@8669
|
902 |
data->hD3D11Mod = NULL;
|
dludwig@8669
|
903 |
}
|
dludwig@8669
|
904 |
if (data->hDXGIMod) {
|
dludwig@8669
|
905 |
SDL_UnloadObject(data->hDXGIMod);
|
dludwig@8669
|
906 |
data->hDXGIMod = NULL;
|
dludwig@8669
|
907 |
}
|
dludwig@8668
|
908 |
}
|
dludwig@8668
|
909 |
}
|
dludwig@8668
|
910 |
|
dludwig@8668
|
911 |
static void
|
dludwig@8668
|
912 |
D3D11_DestroyRenderer(SDL_Renderer * renderer)
|
dludwig@8668
|
913 |
{
|
dludwig@8668
|
914 |
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
dludwig@8668
|
915 |
D3D11_ReleaseAll(renderer);
|
dludwig@8668
|
916 |
if (data) {
|
slouken@8591
|
917 |
SDL_free(data);
|
dludwig@8413
|
918 |
}
|
slouken@8591
|
919 |
SDL_free(renderer);
|
dludwig@8413
|
920 |
}
|
dludwig@8413
|
921 |
|
dludwig@8431
|
922 |
static HRESULT
|
dludwig@8431
|
923 |
D3D11_CreateBlendMode(SDL_Renderer * renderer,
|
dludwig@8431
|
924 |
BOOL enableBlending,
|
dludwig@8431
|
925 |
D3D11_BLEND srcBlend,
|
dludwig@8431
|
926 |
D3D11_BLEND destBlend,
|
dludwig@8575
|
927 |
D3D11_BLEND srcBlendAlpha,
|
dludwig@8575
|
928 |
D3D11_BLEND destBlendAlpha,
|
dludwig@8431
|
929 |
ID3D11BlendState ** blendStateOutput)
|
dludwig@8431
|
930 |
{
|
dludwig@8431
|
931 |
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
dludwig@8431
|
932 |
HRESULT result = S_OK;
|
slouken@8582
|
933 |
|
slouken@8582
|
934 |
D3D11_BLEND_DESC blendDesc;
|
slouken@8591
|
935 |
SDL_zero(blendDesc);
|
slouken@8582
|
936 |
blendDesc.AlphaToCoverageEnable = FALSE;
|
slouken@8582
|
937 |
blendDesc.IndependentBlendEnable = FALSE;
|
slouken@8582
|
938 |
blendDesc.RenderTarget[0].BlendEnable = enableBlending;
|
slouken@8582
|
939 |
blendDesc.RenderTarget[0].SrcBlend = srcBlend;
|
slouken@8582
|
940 |
blendDesc.RenderTarget[0].DestBlend = destBlend;
|
slouken@8582
|
941 |
blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
|
slouken@8582
|
942 |
blendDesc.RenderTarget[0].SrcBlendAlpha = srcBlendAlpha;
|
slouken@8582
|
943 |
blendDesc.RenderTarget[0].DestBlendAlpha = destBlendAlpha;
|
slouken@8582
|
944 |
blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
|
slouken@8582
|
945 |
blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
|
slouken@8591
|
946 |
result = ID3D11Device_CreateBlendState(data->d3dDevice, &blendDesc, blendStateOutput);
|
slouken@8582
|
947 |
if (FAILED(result)) {
|
slouken@8582
|
948 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateBlendState", result);
|
slouken@8582
|
949 |
return result;
|
slouken@8582
|
950 |
}
|
slouken@8582
|
951 |
|
slouken@8582
|
952 |
return S_OK;
|
dludwig@8431
|
953 |
}
|
dludwig@8431
|
954 |
|
slouken@8591
|
955 |
/* Create resources that depend on the device. */
|
slouken@8591
|
956 |
static HRESULT
|
slouken@8582
|
957 |
D3D11_CreateDeviceResources(SDL_Renderer * renderer)
|
slouken@8597
|
958 |
{
|
slouken@8596
|
959 |
typedef HRESULT(WINAPI *PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory);
|
slouken@8596
|
960 |
PFN_CREATE_DXGI_FACTORY CreateDXGIFactoryFunc;
|
slouken@8582
|
961 |
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
slouken@8591
|
962 |
PFN_D3D11_CREATE_DEVICE D3D11CreateDeviceFunc;
|
slouken@8596
|
963 |
IDXGIAdapter *d3dAdapter = NULL;
|
slouken@8591
|
964 |
ID3D11Device *d3dDevice = NULL;
|
slouken@8591
|
965 |
ID3D11DeviceContext *d3dContext = NULL;
|
slouken@8596
|
966 |
IDXGIDevice1 *dxgiDevice = NULL;
|
slouken@8591
|
967 |
HRESULT result = S_OK;
|
dludwig@8607
|
968 |
UINT creationFlags;
|
dludwig@8607
|
969 |
const char *hint;
|
dludwig@8607
|
970 |
|
dludwig@8607
|
971 |
/* This array defines the set of DirectX hardware feature levels this app will support.
|
dludwig@8607
|
972 |
* Note the ordering should be preserved.
|
dludwig@8607
|
973 |
* Don't forget to declare your application's minimum required feature level in its
|
dludwig@8607
|
974 |
* description. All applications are assumed to support 9.1 unless otherwise stated.
|
dludwig@8607
|
975 |
*/
|
dludwig@8607
|
976 |
D3D_FEATURE_LEVEL featureLevels[] =
|
dludwig@8607
|
977 |
{
|
dludwig@8607
|
978 |
D3D_FEATURE_LEVEL_11_1,
|
dludwig@8607
|
979 |
D3D_FEATURE_LEVEL_11_0,
|
dludwig@8607
|
980 |
D3D_FEATURE_LEVEL_10_1,
|
dludwig@8607
|
981 |
D3D_FEATURE_LEVEL_10_0,
|
dludwig@8607
|
982 |
D3D_FEATURE_LEVEL_9_3,
|
dludwig@8607
|
983 |
D3D_FEATURE_LEVEL_9_2,
|
dludwig@8607
|
984 |
D3D_FEATURE_LEVEL_9_1
|
dludwig@8607
|
985 |
};
|
dludwig@8607
|
986 |
|
dludwig@8607
|
987 |
/* Declare how the input layout for SDL's vertex shader will be setup: */
|
dludwig@8607
|
988 |
const D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
|
dludwig@8607
|
989 |
{
|
dludwig@8607
|
990 |
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
dludwig@8607
|
991 |
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
dludwig@8607
|
992 |
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
dludwig@8607
|
993 |
};
|
dludwig@8607
|
994 |
|
dludwig@8607
|
995 |
D3D11_BUFFER_DESC constantBufferDesc;
|
dludwig@8607
|
996 |
D3D11_SAMPLER_DESC samplerDesc;
|
dludwig@8607
|
997 |
D3D11_RASTERIZER_DESC rasterDesc;
|
slouken@8582
|
998 |
|
dludwig@8611
|
999 |
#ifdef __WINRT__
|
dludwig@8611
|
1000 |
CreateDXGIFactoryFunc = CreateDXGIFactory1;
|
dludwig@8611
|
1001 |
D3D11CreateDeviceFunc = D3D11CreateDevice;
|
dludwig@8611
|
1002 |
#else
|
slouken@8597
|
1003 |
data->hDXGIMod = SDL_LoadObject("dxgi.dll");
|
slouken@8596
|
1004 |
if (!data->hDXGIMod) {
|
slouken@8596
|
1005 |
result = E_FAIL;
|
slouken@8596
|
1006 |
goto done;
|
slouken@8597
|
1007 |
}
|
slouken@8597
|
1008 |
|
slouken@8597
|
1009 |
CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory");
|
slouken@8596
|
1010 |
if (!CreateDXGIFactoryFunc) {
|
slouken@8596
|
1011 |
result = E_FAIL;
|
slouken@8596
|
1012 |
goto done;
|
slouken@8596
|
1013 |
}
|
slouken@8596
|
1014 |
|
slouken@8591
|
1015 |
data->hD3D11Mod = SDL_LoadObject("d3d11.dll");
|
slouken@8591
|
1016 |
if (!data->hD3D11Mod) {
|
slouken@8591
|
1017 |
result = E_FAIL;
|
slouken@8591
|
1018 |
goto done;
|
slouken@8591
|
1019 |
}
|
slouken@8591
|
1020 |
|
slouken@8591
|
1021 |
D3D11CreateDeviceFunc = (PFN_D3D11_CREATE_DEVICE)SDL_LoadFunction(data->hD3D11Mod, "D3D11CreateDevice");
|
slouken@8591
|
1022 |
if (!D3D11CreateDeviceFunc) {
|
slouken@8591
|
1023 |
result = E_FAIL;
|
slouken@8591
|
1024 |
goto done;
|
slouken@8591
|
1025 |
}
|
dludwig@8611
|
1026 |
#endif /* __WINRT__ */
|
slouken@8597
|
1027 |
|
slouken@8597
|
1028 |
result = CreateDXGIFactoryFunc(&IID_IDXGIFactory2, &data->dxgiFactory);
|
slouken@8596
|
1029 |
if (FAILED(result)) {
|
slouken@8596
|
1030 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", CreateDXGIFactory", result);
|
slouken@8596
|
1031 |
goto done;
|
slouken@8597
|
1032 |
}
|
slouken@8597
|
1033 |
|
slouken@8597
|
1034 |
/* FIXME: Should we use the default adapter? */
|
slouken@8597
|
1035 |
result = IDXGIFactory2_EnumAdapters(data->dxgiFactory, 0, &data->dxgiAdapter);
|
slouken@8596
|
1036 |
if (FAILED(result)) {
|
slouken@8596
|
1037 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", D3D11CreateDevice", result);
|
slouken@8596
|
1038 |
goto done;
|
slouken@8596
|
1039 |
}
|
slouken@8591
|
1040 |
|
slouken@8591
|
1041 |
/* This flag adds support for surfaces with a different color channel ordering
|
slouken@8591
|
1042 |
* than the API default. It is required for compatibility with Direct2D.
|
slouken@8591
|
1043 |
*/
|
dludwig@8607
|
1044 |
creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
|
slouken@8582
|
1045 |
|
slouken@8591
|
1046 |
/* Make sure Direct3D's debugging feature gets used, if the app requests it. */
|
dludwig@8607
|
1047 |
hint = SDL_GetHint(SDL_HINT_RENDER_DIRECT3D11_DEBUG);
|
slouken@8591
|
1048 |
if (hint && SDL_atoi(hint) > 0) {
|
slouken@8591
|
1049 |
creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
|
slouken@8582
|
1050 |
}
|
slouken@8582
|
1051 |
|
slouken@8591
|
1052 |
/* Create the Direct3D 11 API device object and a corresponding context. */
|
slouken@8591
|
1053 |
result = D3D11CreateDeviceFunc(
|
slouken@8596
|
1054 |
data->dxgiAdapter,
|
slouken@8596
|
1055 |
D3D_DRIVER_TYPE_UNKNOWN,
|
slouken@8591
|
1056 |
NULL,
|
slouken@8591
|
1057 |
creationFlags, /* Set set debug and Direct2D compatibility flags. */
|
slouken@8591
|
1058 |
featureLevels, /* List of feature levels this app can support. */
|
slouken@8591
|
1059 |
SDL_arraysize(featureLevels),
|
slouken@8591
|
1060 |
D3D11_SDK_VERSION, /* Always set this to D3D11_SDK_VERSION for Windows Store apps. */
|
slouken@8591
|
1061 |
&d3dDevice, /* Returns the Direct3D device created. */
|
slouken@8591
|
1062 |
&data->featureLevel, /* Returns feature level of device created. */
|
slouken@8591
|
1063 |
&d3dContext /* Returns the device immediate context. */
|
slouken@8582
|
1064 |
);
|
slouken@8582
|
1065 |
if (FAILED(result)) {
|
slouken@8582
|
1066 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", D3D11CreateDevice", result);
|
slouken@8591
|
1067 |
goto done;
|
slouken@8582
|
1068 |
}
|
slouken@8582
|
1069 |
|
slouken@8591
|
1070 |
result = ID3D11Device_QueryInterface(d3dDevice, &IID_ID3D11Device1, &data->d3dDevice);
|
slouken@8582
|
1071 |
if (FAILED(result)) {
|
slouken@8582
|
1072 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device to ID3D11Device1", result);
|
slouken@8591
|
1073 |
goto done;
|
slouken@8582
|
1074 |
}
|
slouken@8582
|
1075 |
|
slouken@8591
|
1076 |
result = ID3D11DeviceContext_QueryInterface(d3dContext, &IID_ID3D11DeviceContext1, &data->d3dContext);
|
slouken@8582
|
1077 |
if (FAILED(result)) {
|
slouken@8582
|
1078 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11DeviceContext to ID3D11DeviceContext1", result);
|
slouken@8591
|
1079 |
goto done;
|
slouken@8582
|
1080 |
}
|
slouken@8582
|
1081 |
|
slouken@8596
|
1082 |
result = ID3D11Device_QueryInterface(d3dDevice, &IID_IDXGIDevice1, &dxgiDevice);
|
slouken@8596
|
1083 |
if (FAILED(result)) {
|
slouken@8596
|
1084 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device to IDXGIDevice1", result);
|
slouken@8596
|
1085 |
goto done;
|
slouken@8596
|
1086 |
}
|
slouken@8596
|
1087 |
|
slouken@8596
|
1088 |
/* Ensure that DXGI does not queue more than one frame at a time. This both reduces latency and
|
slouken@8596
|
1089 |
* ensures that the application will only render after each VSync, minimizing power consumption.
|
slouken@8596
|
1090 |
*/
|
slouken@8596
|
1091 |
result = IDXGIDevice1_SetMaximumFrameLatency(dxgiDevice, 1);
|
slouken@8596
|
1092 |
if (FAILED(result)) {
|
slouken@8596
|
1093 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGIDevice1::SetMaximumFrameLatency", result);
|
slouken@8596
|
1094 |
goto done;
|
slouken@8596
|
1095 |
}
|
slouken@8596
|
1096 |
|
slouken@8591
|
1097 |
/* Make note of the maximum texture size
|
slouken@8591
|
1098 |
* Max texture sizes are documented on MSDN, at:
|
slouken@8591
|
1099 |
* http://msdn.microsoft.com/en-us/library/windows/apps/ff476876.aspx
|
slouken@8591
|
1100 |
*/
|
slouken@8591
|
1101 |
switch (data->featureLevel) {
|
slouken@8582
|
1102 |
case D3D_FEATURE_LEVEL_11_1:
|
slouken@8582
|
1103 |
case D3D_FEATURE_LEVEL_11_0:
|
slouken@8582
|
1104 |
renderer->info.max_texture_width = renderer->info.max_texture_height = 16384;
|
slouken@8582
|
1105 |
break;
|
slouken@8582
|
1106 |
|
slouken@8582
|
1107 |
case D3D_FEATURE_LEVEL_10_1:
|
slouken@8582
|
1108 |
case D3D_FEATURE_LEVEL_10_0:
|
slouken@8582
|
1109 |
renderer->info.max_texture_width = renderer->info.max_texture_height = 8192;
|
slouken@8582
|
1110 |
break;
|
slouken@8582
|
1111 |
|
slouken@8582
|
1112 |
case D3D_FEATURE_LEVEL_9_3:
|
slouken@8582
|
1113 |
renderer->info.max_texture_width = renderer->info.max_texture_height = 4096;
|
slouken@8582
|
1114 |
break;
|
slouken@8582
|
1115 |
|
slouken@8582
|
1116 |
case D3D_FEATURE_LEVEL_9_2:
|
slouken@8582
|
1117 |
case D3D_FEATURE_LEVEL_9_1:
|
slouken@8582
|
1118 |
renderer->info.max_texture_width = renderer->info.max_texture_height = 2048;
|
slouken@8582
|
1119 |
break;
|
slouken@8591
|
1120 |
|
slouken@8591
|
1121 |
default:
|
slouken@8591
|
1122 |
SDL_SetError(__FUNCTION__ ", Unexpected feature level: %d", data->featureLevel);
|
slouken@8591
|
1123 |
result = E_FAIL;
|
slouken@8591
|
1124 |
goto done;
|
slouken@8582
|
1125 |
}
|
slouken@8582
|
1126 |
|
slouken@8591
|
1127 |
/* Load in SDL's one and only vertex shader: */
|
slouken@8591
|
1128 |
result = ID3D11Device_CreateVertexShader(data->d3dDevice,
|
slouken@8582
|
1129 |
D3D11_VertexShader,
|
slouken@8582
|
1130 |
sizeof(D3D11_VertexShader),
|
slouken@8591
|
1131 |
NULL,
|
slouken@8582
|
1132 |
&data->vertexShader
|
slouken@8582
|
1133 |
);
|
slouken@8582
|
1134 |
if (FAILED(result)) {
|
slouken@8582
|
1135 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateVertexShader", result);
|
slouken@8591
|
1136 |
goto done;
|
slouken@8582
|
1137 |
}
|
slouken@8582
|
1138 |
|
slouken@8591
|
1139 |
/* Create an input layout for SDL's vertex shader: */
|
slouken@8591
|
1140 |
result = ID3D11Device_CreateInputLayout(data->d3dDevice,
|
slouken@8582
|
1141 |
vertexDesc,
|
slouken@8582
|
1142 |
ARRAYSIZE(vertexDesc),
|
slouken@8582
|
1143 |
D3D11_VertexShader,
|
slouken@8582
|
1144 |
sizeof(D3D11_VertexShader),
|
slouken@8582
|
1145 |
&data->inputLayout
|
slouken@8582
|
1146 |
);
|
slouken@8582
|
1147 |
if (FAILED(result)) {
|
slouken@8582
|
1148 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateInputLayout", result);
|
slouken@8591
|
1149 |
goto done;
|
slouken@8582
|
1150 |
}
|
slouken@8582
|
1151 |
|
slouken@8591
|
1152 |
/* Load in SDL's pixel shaders */
|
slouken@8591
|
1153 |
result = ID3D11Device_CreatePixelShader(data->d3dDevice,
|
slouken@8595
|
1154 |
D3D11_PixelShader_Colors,
|
slouken@8595
|
1155 |
sizeof(D3D11_PixelShader_Colors),
|
slouken@8595
|
1156 |
NULL,
|
slouken@8595
|
1157 |
&data->colorPixelShader
|
slouken@8595
|
1158 |
);
|
slouken@8595
|
1159 |
if (FAILED(result)) {
|
slouken@8595
|
1160 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreatePixelShader ['color' shader]", result);
|
slouken@8595
|
1161 |
goto done;
|
slouken@8595
|
1162 |
}
|
slouken@8595
|
1163 |
|
slouken@8595
|
1164 |
result = ID3D11Device_CreatePixelShader(data->d3dDevice,
|
slouken@8582
|
1165 |
D3D11_PixelShader_Textures,
|
slouken@8582
|
1166 |
sizeof(D3D11_PixelShader_Textures),
|
slouken@8591
|
1167 |
NULL,
|
slouken@8582
|
1168 |
&data->texturePixelShader
|
slouken@8582
|
1169 |
);
|
slouken@8582
|
1170 |
if (FAILED(result)) {
|
slouken@8582
|
1171 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreatePixelShader ['textures' shader]", result);
|
slouken@8591
|
1172 |
goto done;
|
slouken@8582
|
1173 |
}
|
slouken@8582
|
1174 |
|
slouken@8591
|
1175 |
result = ID3D11Device_CreatePixelShader(data->d3dDevice,
|
slouken@8595
|
1176 |
D3D11_PixelShader_YUV,
|
slouken@8595
|
1177 |
sizeof(D3D11_PixelShader_YUV),
|
slouken@8591
|
1178 |
NULL,
|
slouken@8595
|
1179 |
&data->yuvPixelShader
|
slouken@8582
|
1180 |
);
|
slouken@8582
|
1181 |
if (FAILED(result)) {
|
slouken@8595
|
1182 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreatePixelShader ['yuv' shader]", result);
|
slouken@8591
|
1183 |
goto done;
|
slouken@8582
|
1184 |
}
|
slouken@8582
|
1185 |
|
slouken@8591
|
1186 |
/* Setup space to hold vertex shader constants: */
|
slouken@8591
|
1187 |
SDL_zero(constantBufferDesc);
|
slouken@8591
|
1188 |
constantBufferDesc.ByteWidth = sizeof(VertexShaderConstants);
|
slouken@8591
|
1189 |
constantBufferDesc.Usage = D3D11_USAGE_DEFAULT;
|
slouken@8591
|
1190 |
constantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
|
slouken@8591
|
1191 |
result = ID3D11Device_CreateBuffer(data->d3dDevice,
|
slouken@8596
|
1192 |
&constantBufferDesc,
|
slouken@8596
|
1193 |
NULL,
|
slouken@8582
|
1194 |
&data->vertexShaderConstants
|
slouken@8596
|
1195 |
);
|
slouken@8582
|
1196 |
if (FAILED(result)) {
|
slouken@8582
|
1197 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateBuffer [vertex shader constants]", result);
|
slouken@8591
|
1198 |
goto done;
|
slouken@8582
|
1199 |
}
|
slouken@8582
|
1200 |
|
slouken@8591
|
1201 |
/* Create samplers to use when drawing textures: */
|
slouken@8591
|
1202 |
SDL_zero(samplerDesc);
|
slouken@8591
|
1203 |
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
|
slouken@8582
|
1204 |
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
|
slouken@8582
|
1205 |
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
|
slouken@8582
|
1206 |
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
|
slouken@8582
|
1207 |
samplerDesc.MipLODBias = 0.0f;
|
slouken@8582
|
1208 |
samplerDesc.MaxAnisotropy = 1;
|
slouken@8582
|
1209 |
samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
|
slouken@8582
|
1210 |
samplerDesc.MinLOD = 0.0f;
|
slouken@8582
|
1211 |
samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
|
slouken@8591
|
1212 |
result = ID3D11Device_CreateSamplerState(data->d3dDevice,
|
slouken@8582
|
1213 |
&samplerDesc,
|
slouken@8582
|
1214 |
&data->nearestPixelSampler
|
slouken@8582
|
1215 |
);
|
slouken@8582
|
1216 |
if (FAILED(result)) {
|
slouken@8582
|
1217 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateSamplerState [nearest-pixel filter]", result);
|
slouken@8591
|
1218 |
goto done;
|
slouken@8582
|
1219 |
}
|
slouken@8582
|
1220 |
|
slouken@8591
|
1221 |
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
slouken@8591
|
1222 |
result = ID3D11Device_CreateSamplerState(data->d3dDevice,
|
slouken@8582
|
1223 |
&samplerDesc,
|
slouken@8582
|
1224 |
&data->linearSampler
|
slouken@8582
|
1225 |
);
|
slouken@8582
|
1226 |
if (FAILED(result)) {
|
slouken@8582
|
1227 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateSamplerState [linear filter]", result);
|
slouken@8591
|
1228 |
goto done;
|
slouken@8582
|
1229 |
}
|
slouken@8582
|
1230 |
|
slouken@8591
|
1231 |
/* Setup Direct3D rasterizer states */
|
slouken@8591
|
1232 |
SDL_zero(rasterDesc);
|
slouken@8596
|
1233 |
rasterDesc.AntialiasedLineEnable = FALSE;
|
slouken@8596
|
1234 |
rasterDesc.CullMode = D3D11_CULL_NONE;
|
slouken@8596
|
1235 |
rasterDesc.DepthBias = 0;
|
slouken@8596
|
1236 |
rasterDesc.DepthBiasClamp = 0.0f;
|
slouken@8596
|
1237 |
rasterDesc.DepthClipEnable = TRUE;
|
slouken@8596
|
1238 |
rasterDesc.FillMode = D3D11_FILL_SOLID;
|
slouken@8596
|
1239 |
rasterDesc.FrontCounterClockwise = FALSE;
|
slouken@8591
|
1240 |
rasterDesc.MultisampleEnable = FALSE;
|
slouken@8591
|
1241 |
rasterDesc.ScissorEnable = FALSE;
|
slouken@8596
|
1242 |
rasterDesc.SlopeScaledDepthBias = 0.0f;
|
slouken@8591
|
1243 |
result = ID3D11Device_CreateRasterizerState(data->d3dDevice, &rasterDesc, &data->mainRasterizer);
|
slouken@8596
|
1244 |
if (FAILED(result)) {
|
slouken@8582
|
1245 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateRasterizerState [main rasterizer]", result);
|
slouken@8591
|
1246 |
goto done;
|
slouken@8582
|
1247 |
}
|
slouken@8582
|
1248 |
|
slouken@8591
|
1249 |
rasterDesc.ScissorEnable = TRUE;
|
slouken@8591
|
1250 |
result = ID3D11Device_CreateRasterizerState(data->d3dDevice, &rasterDesc, &data->clippedRasterizer);
|
slouken@8596
|
1251 |
if (FAILED(result)) {
|
slouken@8582
|
1252 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateRasterizerState [clipped rasterizer]", result);
|
slouken@8591
|
1253 |
goto done;
|
slouken@8582
|
1254 |
}
|
slouken@8582
|
1255 |
|
slouken@8591
|
1256 |
/* Create blending states: */
|
slouken@8582
|
1257 |
result = D3D11_CreateBlendMode(
|
slouken@8582
|
1258 |
renderer,
|
slouken@8582
|
1259 |
TRUE,
|
slouken@8582
|
1260 |
D3D11_BLEND_SRC_ALPHA, /* srcBlend */
|
slouken@8582
|
1261 |
D3D11_BLEND_INV_SRC_ALPHA, /* destBlend */
|
slouken@8582
|
1262 |
D3D11_BLEND_ONE, /* srcBlendAlpha */
|
slouken@8582
|
1263 |
D3D11_BLEND_INV_SRC_ALPHA, /* destBlendAlpha */
|
slouken@8582
|
1264 |
&data->blendModeBlend);
|
slouken@8582
|
1265 |
if (FAILED(result)) {
|
slouken@8591
|
1266 |
/* D3D11_CreateBlendMode will set the SDL error, if it fails */
|
slouken@8591
|
1267 |
goto done;
|
slouken@8582
|
1268 |
}
|
slouken@8582
|
1269 |
|
slouken@8582
|
1270 |
result = D3D11_CreateBlendMode(
|
slouken@8582
|
1271 |
renderer,
|
slouken@8582
|
1272 |
TRUE,
|
slouken@8582
|
1273 |
D3D11_BLEND_SRC_ALPHA, /* srcBlend */
|
slouken@8582
|
1274 |
D3D11_BLEND_ONE, /* destBlend */
|
slouken@8582
|
1275 |
D3D11_BLEND_ZERO, /* srcBlendAlpha */
|
slouken@8582
|
1276 |
D3D11_BLEND_ONE, /* destBlendAlpha */
|
slouken@8582
|
1277 |
&data->blendModeAdd);
|
slouken@8582
|
1278 |
if (FAILED(result)) {
|
slouken@8591
|
1279 |
/* D3D11_CreateBlendMode will set the SDL error, if it fails */
|
slouken@8591
|
1280 |
goto done;
|
slouken@8582
|
1281 |
}
|
slouken@8582
|
1282 |
|
slouken@8582
|
1283 |
result = D3D11_CreateBlendMode(
|
slouken@8582
|
1284 |
renderer,
|
slouken@8582
|
1285 |
TRUE,
|
slouken@8582
|
1286 |
D3D11_BLEND_ZERO, /* srcBlend */
|
slouken@8582
|
1287 |
D3D11_BLEND_SRC_COLOR, /* destBlend */
|
slouken@8582
|
1288 |
D3D11_BLEND_ZERO, /* srcBlendAlpha */
|
slouken@8582
|
1289 |
D3D11_BLEND_ONE, /* destBlendAlpha */
|
slouken@8582
|
1290 |
&data->blendModeMod);
|
slouken@8582
|
1291 |
if (FAILED(result)) {
|
slouken@8591
|
1292 |
/* D3D11_CreateBlendMode will set the SDL error, if it fails */
|
slouken@8591
|
1293 |
goto done;
|
slouken@8582
|
1294 |
}
|
slouken@8582
|
1295 |
|
slouken@8592
|
1296 |
/* Setup render state that doesn't change */
|
slouken@8591
|
1297 |
ID3D11DeviceContext_IASetInputLayout(data->d3dContext, data->inputLayout);
|
slouken@8591
|
1298 |
ID3D11DeviceContext_VSSetShader(data->d3dContext, data->vertexShader, NULL, 0);
|
slouken@8591
|
1299 |
ID3D11DeviceContext_VSSetConstantBuffers(data->d3dContext, 0, 1, &data->vertexShaderConstants);
|
slouken@8591
|
1300 |
|
slouken@8591
|
1301 |
done:
|
slouken@8591
|
1302 |
SAFE_RELEASE(d3dDevice);
|
slouken@8591
|
1303 |
SAFE_RELEASE(d3dContext);
|
slouken@8596
|
1304 |
SAFE_RELEASE(dxgiDevice);
|
slouken@8591
|
1305 |
return result;
|
dludwig@8410
|
1306 |
}
|
dludwig@8410
|
1307 |
|
dludwig@8608
|
1308 |
#ifdef __WIN32__
|
slouken@8591
|
1309 |
|
slouken@8591
|
1310 |
static DXGI_MODE_ROTATION
|
slouken@8591
|
1311 |
D3D11_GetCurrentRotation()
|
dludwig@8567
|
1312 |
{
|
slouken@8591
|
1313 |
/* FIXME */
|
slouken@8591
|
1314 |
return DXGI_MODE_ROTATION_IDENTITY;
|
slouken@8591
|
1315 |
}
|
slouken@8591
|
1316 |
|
dludwig@8608
|
1317 |
#endif /* __WIN32__ */
|
slouken@8591
|
1318 |
|
slouken@8591
|
1319 |
static BOOL
|
slouken@8591
|
1320 |
D3D11_IsDisplayRotated90Degrees(DXGI_MODE_ROTATION rotation)
|
slouken@8591
|
1321 |
{
|
slouken@8591
|
1322 |
switch (rotation) {
|
dludwig@8567
|
1323 |
case DXGI_MODE_ROTATION_ROTATE90:
|
dludwig@8567
|
1324 |
case DXGI_MODE_ROTATION_ROTATE270:
|
slouken@8591
|
1325 |
return TRUE;
|
dludwig@8567
|
1326 |
default:
|
slouken@8591
|
1327 |
return FALSE;
|
dludwig@8567
|
1328 |
}
|
dludwig@8567
|
1329 |
}
|
dludwig@8567
|
1330 |
|
dludwig@8569
|
1331 |
static int
|
dludwig@8569
|
1332 |
D3D11_GetViewportAlignedD3DRect(SDL_Renderer * renderer, const SDL_Rect * sdlRect, D3D11_RECT * outRect)
|
dludwig@8569
|
1333 |
{
|
dludwig@8569
|
1334 |
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
slouken@8591
|
1335 |
switch (data->rotation) {
|
dludwig@8569
|
1336 |
case DXGI_MODE_ROTATION_IDENTITY:
|
dludwig@8569
|
1337 |
outRect->left = sdlRect->x;
|
dludwig@8569
|
1338 |
outRect->right = sdlRect->x + sdlRect->w;
|
dludwig@8569
|
1339 |
outRect->top = sdlRect->y;
|
dludwig@8569
|
1340 |
outRect->bottom = sdlRect->y + sdlRect->h;
|
dludwig@8569
|
1341 |
break;
|
dludwig@8569
|
1342 |
case DXGI_MODE_ROTATION_ROTATE270:
|
slouken@8582
|
1343 |
outRect->left = sdlRect->y;
|
slouken@8582
|
1344 |
outRect->right = sdlRect->y + sdlRect->h;
|
slouken@8582
|
1345 |
outRect->top = renderer->viewport.w - sdlRect->x - sdlRect->w;
|
dludwig@8569
|
1346 |
outRect->bottom = renderer->viewport.w - sdlRect->x;
|
dludwig@8569
|
1347 |
break;
|
dludwig@8569
|
1348 |
case DXGI_MODE_ROTATION_ROTATE180:
|
dludwig@8569
|
1349 |
outRect->left = renderer->viewport.w - sdlRect->x - sdlRect->w;
|
dludwig@8569
|
1350 |
outRect->right = renderer->viewport.w - sdlRect->x;
|
dludwig@8569
|
1351 |
outRect->top = renderer->viewport.h - sdlRect->y - sdlRect->h;
|
dludwig@8569
|
1352 |
outRect->bottom = renderer->viewport.h - sdlRect->y;
|
dludwig@8569
|
1353 |
break;
|
dludwig@8569
|
1354 |
case DXGI_MODE_ROTATION_ROTATE90:
|
dludwig@8569
|
1355 |
outRect->left = renderer->viewport.h - sdlRect->y - sdlRect->h;
|
dludwig@8569
|
1356 |
outRect->right = renderer->viewport.h - sdlRect->y;
|
slouken@8582
|
1357 |
outRect->top = sdlRect->x;
|
dludwig@8569
|
1358 |
outRect->bottom = sdlRect->x + sdlRect->h;
|
dludwig@8569
|
1359 |
break;
|
dludwig@8569
|
1360 |
default:
|
slouken@8591
|
1361 |
return SDL_SetError("The physical display is in an unknown or unsupported rotation");
|
dludwig@8569
|
1362 |
}
|
dludwig@8569
|
1363 |
return 0;
|
dludwig@8569
|
1364 |
}
|
dludwig@8569
|
1365 |
|
slouken@8591
|
1366 |
static HRESULT
|
slouken@8591
|
1367 |
D3D11_CreateSwapChain(SDL_Renderer * renderer, int w, int h)
|
slouken@8591
|
1368 |
{
|
slouken@8591
|
1369 |
D3D11_RenderData *data = (D3D11_RenderData *)renderer->driverdata;
|
slouken@8591
|
1370 |
#ifdef __WINRT__
|
slouken@8591
|
1371 |
IUnknown *coreWindow = D3D11_GetCoreWindowFromSDLRenderer(renderer);
|
slouken@8591
|
1372 |
const BOOL usingXAML = (coreWindow == NULL);
|
slouken@8591
|
1373 |
#else
|
slouken@8591
|
1374 |
IUnknown *coreWindow = NULL;
|
slouken@8591
|
1375 |
const BOOL usingXAML = FALSE;
|
slouken@8591
|
1376 |
#endif
|
slouken@8591
|
1377 |
HRESULT result = S_OK;
|
dludwig@8569
|
1378 |
|
slouken@8591
|
1379 |
/* Create a swap chain using the same adapter as the existing Direct3D device. */
|
slouken@8591
|
1380 |
DXGI_SWAP_CHAIN_DESC1 swapChainDesc;
|
slouken@8591
|
1381 |
SDL_zero(swapChainDesc);
|
slouken@8591
|
1382 |
swapChainDesc.Width = w;
|
slouken@8591
|
1383 |
swapChainDesc.Height = h;
|
slouken@8591
|
1384 |
swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; /* This is the most common swap chain format. */
|
slouken@8591
|
1385 |
swapChainDesc.Stereo = FALSE;
|
slouken@8591
|
1386 |
swapChainDesc.SampleDesc.Count = 1; /* Don't use multi-sampling. */
|
slouken@8591
|
1387 |
swapChainDesc.SampleDesc.Quality = 0;
|
slouken@8591
|
1388 |
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
slouken@8591
|
1389 |
swapChainDesc.BufferCount = 2; /* Use double-buffering to minimize latency. */
|
slouken@8591
|
1390 |
#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
slouken@8591
|
1391 |
swapChainDesc.Scaling = DXGI_SCALING_STRETCH; /* On phone, only stretch and aspect-ratio stretch scaling are allowed. */
|
slouken@8591
|
1392 |
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; /* On phone, no swap effects are supported. */
|
slouken@8591
|
1393 |
#else
|
slouken@8591
|
1394 |
if (usingXAML) {
|
slouken@8591
|
1395 |
swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
|
slouken@8591
|
1396 |
} else {
|
slouken@8591
|
1397 |
swapChainDesc.Scaling = DXGI_SCALING_NONE;
|
slouken@8591
|
1398 |
}
|
slouken@8591
|
1399 |
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; /* All Windows Store apps must use this SwapEffect. */
|
slouken@8591
|
1400 |
#endif
|
slouken@8591
|
1401 |
swapChainDesc.Flags = 0;
|
slouken@8582
|
1402 |
|
slouken@8582
|
1403 |
if (coreWindow) {
|
slouken@8596
|
1404 |
result = IDXGIFactory2_CreateSwapChainForCoreWindow(data->dxgiFactory,
|
slouken@8591
|
1405 |
(IUnknown *)data->d3dDevice,
|
slouken@8591
|
1406 |
coreWindow,
|
slouken@8591
|
1407 |
&swapChainDesc,
|
slouken@8591
|
1408 |
NULL, /* Allow on all displays. */
|
slouken@8591
|
1409 |
&data->swapChain
|
slouken@8591
|
1410 |
);
|
slouken@8582
|
1411 |
if (FAILED(result)) {
|
slouken@8591
|
1412 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGIFactory2::CreateSwapChainForCoreWindow", result);
|
slouken@8591
|
1413 |
goto done;
|
slouken@8582
|
1414 |
}
|
slouken@8591
|
1415 |
} else if (usingXAML) {
|
slouken@8596
|
1416 |
result = IDXGIFactory2_CreateSwapChainForComposition(data->dxgiFactory,
|
slouken@8591
|
1417 |
(IUnknown *)data->d3dDevice,
|
slouken@8591
|
1418 |
&swapChainDesc,
|
slouken@8591
|
1419 |
NULL,
|
slouken@8591
|
1420 |
&data->swapChain);
|
slouken@8591
|
1421 |
if (FAILED(result)) {
|
slouken@8591
|
1422 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGIFactory2::CreateSwapChainForComposition", result);
|
slouken@8591
|
1423 |
goto done;
|
dludwig@8505
|
1424 |
}
|
dludwig@8505
|
1425 |
|
slouken@8591
|
1426 |
#if WINAPI_FAMILY == WINAPI_FAMILY_APP
|
dludwig@8608
|
1427 |
result = ISwapChainBackgroundPanelNative_SetSwapChain(WINRT_GlobalSwapChainBackgroundPanelNative, (IDXGISwapChain *) data->swapChain);
|
slouken@8591
|
1428 |
if (FAILED(result)) {
|
slouken@8591
|
1429 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ISwapChainBackgroundPanelNative::SetSwapChain", result);
|
slouken@8596
|
1430 |
goto done;
|
slouken@8591
|
1431 |
}
|
slouken@8591
|
1432 |
#else
|
slouken@8591
|
1433 |
SDL_SetError(__FUNCTION__ ", XAML support is not yet available for Windows Phone");
|
slouken@8591
|
1434 |
result = E_FAIL;
|
slouken@8591
|
1435 |
goto done;
|
slouken@8591
|
1436 |
#endif
|
slouken@8591
|
1437 |
} else {
|
dludwig@8608
|
1438 |
#ifdef __WIN32__
|
slouken@8591
|
1439 |
SDL_SysWMinfo windowinfo;
|
slouken@8591
|
1440 |
SDL_VERSION(&windowinfo.version);
|
slouken@8591
|
1441 |
SDL_GetWindowWMInfo(renderer->window, &windowinfo);
|
slouken@8591
|
1442 |
|
slouken@8596
|
1443 |
result = IDXGIFactory2_CreateSwapChainForHwnd(data->dxgiFactory,
|
slouken@8591
|
1444 |
(IUnknown *)data->d3dDevice,
|
slouken@8591
|
1445 |
windowinfo.info.win.window,
|
slouken@8591
|
1446 |
&swapChainDesc,
|
slouken@8591
|
1447 |
NULL,
|
slouken@8591
|
1448 |
NULL, /* Allow on all displays. */
|
slouken@8591
|
1449 |
&data->swapChain
|
slouken@8591
|
1450 |
);
|
slouken@8591
|
1451 |
if (FAILED(result)) {
|
slouken@8591
|
1452 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGIFactory2::CreateSwapChainForHwnd", result);
|
slouken@8591
|
1453 |
goto done;
|
slouken@8591
|
1454 |
}
|
slouken@8672
|
1455 |
|
slouken@8672
|
1456 |
IDXGIFactory_MakeWindowAssociation(data->dxgiFactory, windowinfo.info.win.window, DXGI_MWA_NO_WINDOW_CHANGES);
|
dludwig@8608
|
1457 |
#else
|
dludwig@8608
|
1458 |
SDL_SetError(__FUNCTION__", Unable to find something to attach a swap chain to");
|
dludwig@8608
|
1459 |
goto done;
|
dludwig@8608
|
1460 |
#endif /* ifdef __WIN32__ / else */
|
slouken@8591
|
1461 |
}
|
slouken@8591
|
1462 |
data->swapEffect = swapChainDesc.SwapEffect;
|
slouken@8591
|
1463 |
|
slouken@8591
|
1464 |
done:
|
slouken@8591
|
1465 |
SAFE_RELEASE(coreWindow);
|
slouken@8591
|
1466 |
return result;
|
slouken@8591
|
1467 |
}
|
slouken@8591
|
1468 |
|
slouken@8582
|
1469 |
|
slouken@8591
|
1470 |
/* Initialize all resources that change when the window's size changes. */
|
slouken@8591
|
1471 |
static HRESULT
|
slouken@8591
|
1472 |
D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
|
slouken@8591
|
1473 |
{
|
slouken@8591
|
1474 |
D3D11_RenderData *data = (D3D11_RenderData *)renderer->driverdata;
|
slouken@8591
|
1475 |
ID3D11Texture2D *backBuffer = NULL;
|
slouken@8591
|
1476 |
HRESULT result = S_OK;
|
slouken@8591
|
1477 |
int w, h;
|
slouken@8582
|
1478 |
|
slouken@8591
|
1479 |
/* Release the previous render target view */
|
slouken@8591
|
1480 |
D3D11_ReleaseMainRenderTargetView(renderer);
|
slouken@8591
|
1481 |
|
dludwig@8620
|
1482 |
/* The width and height of the swap chain must be based on the display's
|
dludwig@8620
|
1483 |
* non-rotated size.
|
slouken@8591
|
1484 |
*/
|
slouken@8591
|
1485 |
SDL_GetWindowSize(renderer->window, &w, &h);
|
slouken@8591
|
1486 |
data->rotation = D3D11_GetCurrentRotation();
|
dludwig@8620
|
1487 |
if (D3D11_IsDisplayRotated90Degrees(data->rotation)) {
|
slouken@8591
|
1488 |
int tmp = w;
|
slouken@8591
|
1489 |
w = h;
|
slouken@8591
|
1490 |
h = tmp;
|
slouken@8591
|
1491 |
}
|
slouken@8582
|
1492 |
|
slouken@8591
|
1493 |
if (data->swapChain) {
|
dludwig@8620
|
1494 |
/* IDXGISwapChain::ResizeBuffers is not available on Windows Phone 8. */
|
dludwig@8620
|
1495 |
#if !defined(__WINRT__) || (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP)
|
slouken@8591
|
1496 |
/* If the swap chain already exists, resize it. */
|
slouken@8591
|
1497 |
result = IDXGISwapChain_ResizeBuffers(data->swapChain,
|
slouken@8591
|
1498 |
0,
|
slouken@8591
|
1499 |
w, h,
|
slouken@8591
|
1500 |
DXGI_FORMAT_UNKNOWN,
|
slouken@8582
|
1501 |
0
|
slouken@8582
|
1502 |
);
|
dludwig@8668
|
1503 |
if (result == DXGI_ERROR_DEVICE_REMOVED) {
|
dludwig@8668
|
1504 |
/* If the device was removed for any reason, a new device and swap chain will need to be created. */
|
dludwig@8668
|
1505 |
D3D11_HandleDeviceLost(renderer);
|
dludwig@8668
|
1506 |
|
dludwig@8668
|
1507 |
/* Everything is set up now. Do not continue execution of this method. HandleDeviceLost will reenter this method
|
dludwig@8668
|
1508 |
* and correctly set up the new device.
|
dludwig@8668
|
1509 |
*/
|
dludwig@8668
|
1510 |
goto done;
|
dludwig@8668
|
1511 |
} else if (FAILED(result)) {
|
slouken@8591
|
1512 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGISwapChain::ResizeBuffers", result);
|
slouken@8591
|
1513 |
goto done;
|
slouken@8582
|
1514 |
}
|
dludwig@8620
|
1515 |
#endif
|
slouken@8591
|
1516 |
} else {
|
slouken@8591
|
1517 |
result = D3D11_CreateSwapChain(renderer, w, h);
|
slouken@8582
|
1518 |
if (FAILED(result)) {
|
slouken@8591
|
1519 |
goto done;
|
slouken@8582
|
1520 |
}
|
slouken@8582
|
1521 |
}
|
slouken@8582
|
1522 |
|
slouken@8582
|
1523 |
#if WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP
|
slouken@8591
|
1524 |
/* Set the proper rotation for the swap chain, and generate the
|
slouken@8591
|
1525 |
* 3D matrix transformation for rendering to the rotated swap chain.
|
slouken@8591
|
1526 |
*
|
slouken@8591
|
1527 |
* To note, the call for this, IDXGISwapChain1::SetRotation, is not necessary
|
slouken@8591
|
1528 |
* on Windows Phone, nor is it supported there. It's only needed in Windows 8/RT.
|
slouken@8591
|
1529 |
*/
|
slouken@8592
|
1530 |
if (data->swapEffect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) {
|
slouken@8591
|
1531 |
result = IDXGISwapChain1_SetRotation(data->swapChain, data->rotation);
|
slouken@8591
|
1532 |
if (FAILED(result)) {
|
slouken@8591
|
1533 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGISwapChain1::SetRotation", result);
|
slouken@8591
|
1534 |
goto done;
|
slouken@8591
|
1535 |
}
|
slouken@8582
|
1536 |
}
|
slouken@8582
|
1537 |
#endif
|
slouken@8582
|
1538 |
|
slouken@8591
|
1539 |
result = IDXGISwapChain_GetBuffer(data->swapChain,
|
slouken@8582
|
1540 |
0,
|
slouken@8591
|
1541 |
&IID_ID3D11Texture2D,
|
slouken@8582
|
1542 |
&backBuffer
|
slouken@8582
|
1543 |
);
|
slouken@8582
|
1544 |
if (FAILED(result)) {
|
slouken@8591
|
1545 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGISwapChain::GetBuffer [back-buffer]", result);
|
slouken@8591
|
1546 |
goto done;
|
slouken@8582
|
1547 |
}
|
slouken@8582
|
1548 |
|
slouken@8591
|
1549 |
/* Create a render target view of the swap chain back buffer. */
|
slouken@8591
|
1550 |
result = ID3D11Device_CreateRenderTargetView(data->d3dDevice,
|
slouken@8591
|
1551 |
(ID3D11Resource *)backBuffer,
|
slouken@8591
|
1552 |
NULL,
|
slouken@8582
|
1553 |
&data->mainRenderTargetView
|
slouken@8582
|
1554 |
);
|
slouken@8582
|
1555 |
if (FAILED(result)) {
|
slouken@8591
|
1556 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device::CreateRenderTargetView", result);
|
slouken@8591
|
1557 |
goto done;
|
slouken@8582
|
1558 |
}
|
slouken@8582
|
1559 |
|
slouken@8582
|
1560 |
if (D3D11_UpdateViewport(renderer) != 0) {
|
slouken@8591
|
1561 |
/* D3D11_UpdateViewport will set the SDL error if it fails. */
|
slouken@8591
|
1562 |
result = E_FAIL;
|
slouken@8591
|
1563 |
goto done;
|
slouken@8582
|
1564 |
}
|
slouken@8582
|
1565 |
|
slouken@8591
|
1566 |
done:
|
slouken@8591
|
1567 |
SAFE_RELEASE(backBuffer);
|
slouken@8591
|
1568 |
return result;
|
dludwig@8412
|
1569 |
}
|
dludwig@8412
|
1570 |
|
slouken@8591
|
1571 |
/* This method is called when the window's size changes. */
|
slouken@8591
|
1572 |
static HRESULT
|
slouken@8582
|
1573 |
D3D11_UpdateForWindowSizeChange(SDL_Renderer * renderer)
|
slouken@8582
|
1574 |
{
|
slouken@8591
|
1575 |
D3D11_RenderData *data = (D3D11_RenderData *)renderer->driverdata;
|
slouken@8591
|
1576 |
return D3D11_CreateWindowSizeDependentResources(renderer);
|
dludwig@8414
|
1577 |
}
|
dludwig@8414
|
1578 |
|
dludwig@8414
|
1579 |
HRESULT
|
dludwig@8414
|
1580 |
D3D11_HandleDeviceLost(SDL_Renderer * renderer)
|
dludwig@8414
|
1581 |
{
|
dludwig@8414
|
1582 |
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
dludwig@8414
|
1583 |
HRESULT result = S_OK;
|
dludwig@8414
|
1584 |
|
dludwig@8668
|
1585 |
D3D11_ReleaseAll(renderer);
|
slouken@8582
|
1586 |
|
slouken@8582
|
1587 |
result = D3D11_CreateDeviceResources(renderer);
|
slouken@8582
|
1588 |
if (FAILED(result)) {
|
slouken@8582
|
1589 |
/* D3D11_CreateDeviceResources will set the SDL error */
|
slouken@8582
|
1590 |
return result;
|
slouken@8582
|
1591 |
}
|
slouken@8582
|
1592 |
|
slouken@8582
|
1593 |
result = D3D11_UpdateForWindowSizeChange(renderer);
|
slouken@8582
|
1594 |
if (FAILED(result)) {
|
slouken@8582
|
1595 |
/* D3D11_UpdateForWindowSizeChange will set the SDL error */
|
slouken@8582
|
1596 |
return result;
|
slouken@8582
|
1597 |
}
|
dludwig@8414
|
1598 |
|
dludwig@8668
|
1599 |
/* Let the application know that the device has been reset */
|
dludwig@8668
|
1600 |
{
|
dludwig@8668
|
1601 |
SDL_Event event;
|
slouken@8674
|
1602 |
event.type = SDL_RENDER_DEVICE_RESET;
|
dludwig@8668
|
1603 |
SDL_PushEvent(&event);
|
dludwig@8668
|
1604 |
}
|
dludwig@8668
|
1605 |
|
dludwig@8414
|
1606 |
return S_OK;
|
dludwig@8414
|
1607 |
}
|
dludwig@8414
|
1608 |
|
dludwig@8679
|
1609 |
void
|
dludwig@8679
|
1610 |
D3D11_Trim(SDL_Renderer * renderer)
|
dludwig@8679
|
1611 |
{
|
dludwig@8679
|
1612 |
#ifdef __WINRT__
|
dludwig@8679
|
1613 |
#if NTDDI_VERSION > NTDDI_WIN8
|
dludwig@8679
|
1614 |
D3D11_RenderData *data = (D3D11_RenderData *)renderer->driverdata;
|
dludwig@8679
|
1615 |
HRESULT result = S_OK;
|
dludwig@8679
|
1616 |
IDXGIDevice3 *dxgiDevice = NULL;
|
dludwig@8679
|
1617 |
|
dludwig@8679
|
1618 |
result = ID3D11Device_QueryInterface(data->d3dDevice, &IID_IDXGIDevice3, &dxgiDevice);
|
dludwig@8679
|
1619 |
if (FAILED(result)) {
|
dludwig@8679
|
1620 |
//WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device to IDXGIDevice3", result);
|
dludwig@8679
|
1621 |
return;
|
dludwig@8679
|
1622 |
}
|
dludwig@8679
|
1623 |
|
dludwig@8679
|
1624 |
IDXGIDevice3_Trim(dxgiDevice);
|
dludwig@8679
|
1625 |
SAFE_RELEASE(dxgiDevice);
|
dludwig@8679
|
1626 |
#endif
|
dludwig@8679
|
1627 |
#endif
|
dludwig@8679
|
1628 |
}
|
dludwig@8679
|
1629 |
|
dludwig@8415
|
1630 |
static void
|
dludwig@8415
|
1631 |
D3D11_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
|
dludwig@8415
|
1632 |
{
|
slouken@8582
|
1633 |
if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) {
|
slouken@8582
|
1634 |
D3D11_UpdateForWindowSizeChange(renderer);
|
slouken@8582
|
1635 |
}
|
slouken@8582
|
1636 |
}
|
slouken@8582
|
1637 |
|
slouken@8582
|
1638 |
static D3D11_FILTER
|
slouken@8582
|
1639 |
GetScaleQuality(void)
|
slouken@8582
|
1640 |
{
|
slouken@8582
|
1641 |
const char *hint = SDL_GetHint(SDL_HINT_RENDER_SCALE_QUALITY);
|
slouken@8582
|
1642 |
if (!hint || *hint == '0' || SDL_strcasecmp(hint, "nearest") == 0) {
|
slouken@8591
|
1643 |
return D3D11_FILTER_MIN_MAG_MIP_POINT;
|
slouken@8582
|
1644 |
} else /* if (*hint == '1' || SDL_strcasecmp(hint, "linear") == 0) */ {
|
slouken@8591
|
1645 |
return D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
dludwig@8415
|
1646 |
}
|
dludwig@8415
|
1647 |
}
|
dludwig@8415
|
1648 |
|
slouken@8582
|
1649 |
static int
|
slouken@8582
|
1650 |
D3D11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
slouken@8582
|
1651 |
{
|
slouken@8582
|
1652 |
D3D11_RenderData *rendererData = (D3D11_RenderData *) renderer->driverdata;
|
slouken@8582
|
1653 |
D3D11_TextureData *textureData;
|
slouken@8582
|
1654 |
HRESULT result;
|
slouken@8582
|
1655 |
DXGI_FORMAT textureFormat = SDLPixelFormatToDXGIFormat(texture->format);
|
dludwig@8607
|
1656 |
D3D11_TEXTURE2D_DESC textureDesc;
|
dludwig@8607
|
1657 |
D3D11_SHADER_RESOURCE_VIEW_DESC resourceViewDesc;
|
dludwig@8607
|
1658 |
|
slouken@8582
|
1659 |
if (textureFormat == SDL_PIXELFORMAT_UNKNOWN) {
|
slouken@8582
|
1660 |
return SDL_SetError("%s, An unsupported SDL pixel format (0x%x) was specified",
|
slouken@8582
|
1661 |
__FUNCTION__, texture->format);
|
slouken@8582
|
1662 |
}
|
slouken@8582
|
1663 |
|
slouken@8591
|
1664 |
textureData = (D3D11_TextureData*) SDL_calloc(1, sizeof(*textureData));
|
slouken@8582
|
1665 |
if (!textureData) {
|
slouken@8582
|
1666 |
SDL_OutOfMemory();
|
slouken@8582
|
1667 |
return -1;
|
slouken@8582
|
1668 |
}
|
slouken@8582
|
1669 |
textureData->scaleMode = GetScaleQuality();
|
slouken@8582
|
1670 |
|
slouken@8582
|
1671 |
texture->driverdata = textureData;
|
slouken@8582
|
1672 |
|
slouken@8591
|
1673 |
SDL_zero(textureDesc);
|
slouken@8582
|
1674 |
textureDesc.Width = texture->w;
|
slouken@8582
|
1675 |
textureDesc.Height = texture->h;
|
slouken@8582
|
1676 |
textureDesc.MipLevels = 1;
|
slouken@8582
|
1677 |
textureDesc.ArraySize = 1;
|
slouken@8582
|
1678 |
textureDesc.Format = textureFormat;
|
slouken@8582
|
1679 |
textureDesc.SampleDesc.Count = 1;
|
slouken@8582
|
1680 |
textureDesc.SampleDesc.Quality = 0;
|
slouken@8582
|
1681 |
textureDesc.MiscFlags = 0;
|
slouken@8582
|
1682 |
|
slouken@8582
|
1683 |
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
slouken@8582
|
1684 |
textureDesc.Usage = D3D11_USAGE_DYNAMIC;
|
slouken@8582
|
1685 |
textureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
slouken@8582
|
1686 |
} else {
|
slouken@8582
|
1687 |
textureDesc.Usage = D3D11_USAGE_DEFAULT;
|
slouken@8582
|
1688 |
textureDesc.CPUAccessFlags = 0;
|
slouken@8582
|
1689 |
}
|
slouken@8582
|
1690 |
|
slouken@8582
|
1691 |
if (texture->access == SDL_TEXTUREACCESS_TARGET) {
|
slouken@8582
|
1692 |
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
|
slouken@8582
|
1693 |
} else {
|
slouken@8582
|
1694 |
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
slouken@8582
|
1695 |
}
|
dludwig@8540
|
1696 |
|
slouken@8591
|
1697 |
result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
|
slouken@8582
|
1698 |
&textureDesc,
|
slouken@8591
|
1699 |
NULL,
|
slouken@8582
|
1700 |
&textureData->mainTexture
|
slouken@8582
|
1701 |
);
|
slouken@8582
|
1702 |
if (FAILED(result)) {
|
slouken@8582
|
1703 |
D3D11_DestroyTexture(renderer, texture);
|
slouken@8582
|
1704 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateTexture2D", result);
|
slouken@8582
|
1705 |
return -1;
|
slouken@8582
|
1706 |
}
|
slouken@8582
|
1707 |
|
slouken@8595
|
1708 |
if (texture->format == SDL_PIXELFORMAT_YV12 ||
|
slouken@8595
|
1709 |
texture->format == SDL_PIXELFORMAT_IYUV) {
|
slouken@8595
|
1710 |
textureData->yuv = SDL_TRUE;
|
slouken@8582
|
1711 |
|
slouken@8595
|
1712 |
textureDesc.Width /= 2;
|
slouken@8595
|
1713 |
textureDesc.Height /= 2;
|
slouken@8595
|
1714 |
|
slouken@8595
|
1715 |
result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
|
slouken@8595
|
1716 |
&textureDesc,
|
slouken@8595
|
1717 |
NULL,
|
slouken@8595
|
1718 |
&textureData->mainTextureU
|
slouken@8595
|
1719 |
);
|
slouken@8582
|
1720 |
if (FAILED(result)) {
|
slouken@8582
|
1721 |
D3D11_DestroyTexture(renderer, texture);
|
slouken@8595
|
1722 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateTexture2D", result);
|
slouken@8595
|
1723 |
return -1;
|
slouken@8595
|
1724 |
}
|
slouken@8595
|
1725 |
|
slouken@8595
|
1726 |
result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
|
slouken@8595
|
1727 |
&textureDesc,
|
slouken@8595
|
1728 |
NULL,
|
slouken@8595
|
1729 |
&textureData->mainTextureV
|
slouken@8595
|
1730 |
);
|
slouken@8595
|
1731 |
if (FAILED(result)) {
|
slouken@8595
|
1732 |
D3D11_DestroyTexture(renderer, texture);
|
slouken@8595
|
1733 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateTexture2D", result);
|
slouken@8582
|
1734 |
return -1;
|
slouken@8582
|
1735 |
}
|
slouken@8582
|
1736 |
}
|
slouken@8582
|
1737 |
|
slouken@8582
|
1738 |
resourceViewDesc.Format = textureDesc.Format;
|
slouken@8582
|
1739 |
resourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
|
slouken@8582
|
1740 |
resourceViewDesc.Texture2D.MostDetailedMip = 0;
|
slouken@8582
|
1741 |
resourceViewDesc.Texture2D.MipLevels = textureDesc.MipLevels;
|
slouken@8591
|
1742 |
result = ID3D11Device_CreateShaderResourceView(rendererData->d3dDevice,
|
slouken@8591
|
1743 |
(ID3D11Resource *)textureData->mainTexture,
|
slouken@8582
|
1744 |
&resourceViewDesc,
|
slouken@8582
|
1745 |
&textureData->mainTextureResourceView
|
slouken@8582
|
1746 |
);
|
slouken@8582
|
1747 |
if (FAILED(result)) {
|
slouken@8582
|
1748 |
D3D11_DestroyTexture(renderer, texture);
|
slouken@8582
|
1749 |
WIN_SetErrorFromHRESULT(__FUNCTION__ "ID3D11Device1::CreateShaderResourceView", result);
|
slouken@8582
|
1750 |
return -1;
|
slouken@8582
|
1751 |
}
|
slouken@8582
|
1752 |
|
slouken@8595
|
1753 |
if (textureData->yuv) {
|
slouken@8595
|
1754 |
result = ID3D11Device_CreateShaderResourceView(rendererData->d3dDevice,
|
slouken@8595
|
1755 |
(ID3D11Resource *)textureData->mainTextureU,
|
slouken@8595
|
1756 |
&resourceViewDesc,
|
slouken@8595
|
1757 |
&textureData->mainTextureResourceViewU
|
slouken@8595
|
1758 |
);
|
slouken@8595
|
1759 |
if (FAILED(result)) {
|
slouken@8595
|
1760 |
D3D11_DestroyTexture(renderer, texture);
|
slouken@8595
|
1761 |
WIN_SetErrorFromHRESULT(__FUNCTION__ "ID3D11Device1::CreateShaderResourceView", result);
|
slouken@8595
|
1762 |
return -1;
|
slouken@8595
|
1763 |
}
|
slouken@8595
|
1764 |
result = ID3D11Device_CreateShaderResourceView(rendererData->d3dDevice,
|
slouken@8595
|
1765 |
(ID3D11Resource *)textureData->mainTextureV,
|
slouken@8595
|
1766 |
&resourceViewDesc,
|
slouken@8595
|
1767 |
&textureData->mainTextureResourceViewV
|
slouken@8595
|
1768 |
);
|
slouken@8595
|
1769 |
if (FAILED(result)) {
|
slouken@8595
|
1770 |
D3D11_DestroyTexture(renderer, texture);
|
slouken@8595
|
1771 |
WIN_SetErrorFromHRESULT(__FUNCTION__ "ID3D11Device1::CreateShaderResourceView", result);
|
slouken@8595
|
1772 |
return -1;
|
slouken@8595
|
1773 |
}
|
slouken@8595
|
1774 |
}
|
slouken@8595
|
1775 |
|
slouken@8595
|
1776 |
if (texture->access & SDL_TEXTUREACCESS_TARGET) {
|
slouken@8595
|
1777 |
D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
|
slouken@8595
|
1778 |
renderTargetViewDesc.Format = textureDesc.Format;
|
slouken@8595
|
1779 |
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
|
slouken@8595
|
1780 |
renderTargetViewDesc.Texture2D.MipSlice = 0;
|
slouken@8595
|
1781 |
|
slouken@8595
|
1782 |
result = ID3D11Device_CreateRenderTargetView(rendererData->d3dDevice,
|
slouken@8595
|
1783 |
(ID3D11Resource *)textureData->mainTexture,
|
slouken@8595
|
1784 |
&renderTargetViewDesc,
|
slouken@8595
|
1785 |
&textureData->mainTextureRenderTargetView);
|
slouken@8595
|
1786 |
if (FAILED(result)) {
|
slouken@8595
|
1787 |
D3D11_DestroyTexture(renderer, texture);
|
slouken@8595
|
1788 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateRenderTargetView", result);
|
slouken@8595
|
1789 |
return -1;
|
slouken@8595
|
1790 |
}
|
slouken@8595
|
1791 |
}
|
slouken@8595
|
1792 |
|
slouken@8582
|
1793 |
return 0;
|
dludwig@8416
|
1794 |
}
|
dludwig@8416
|
1795 |
|
dludwig@8416
|
1796 |
static void
|
dludwig@8416
|
1797 |
D3D11_DestroyTexture(SDL_Renderer * renderer,
|
dludwig@8416
|
1798 |
SDL_Texture * texture)
|
dludwig@8416
|
1799 |
{
|
slouken@8591
|
1800 |
D3D11_TextureData *data = (D3D11_TextureData *)texture->driverdata;
|
slouken@8591
|
1801 |
|
slouken@8591
|
1802 |
if (!data) {
|
slouken@8591
|
1803 |
return;
|
slouken@8591
|
1804 |
}
|
dludwig@8416
|
1805 |
|
slouken@8591
|
1806 |
SAFE_RELEASE(data->mainTexture);
|
slouken@8591
|
1807 |
SAFE_RELEASE(data->mainTextureResourceView);
|
slouken@8591
|
1808 |
SAFE_RELEASE(data->mainTextureRenderTargetView);
|
slouken@8591
|
1809 |
SAFE_RELEASE(data->stagingTexture);
|
slouken@8595
|
1810 |
SAFE_RELEASE(data->mainTextureU);
|
slouken@8595
|
1811 |
SAFE_RELEASE(data->mainTextureResourceViewU);
|
slouken@8595
|
1812 |
SAFE_RELEASE(data->mainTextureV);
|
slouken@8595
|
1813 |
SAFE_RELEASE(data->mainTextureResourceViewV);
|
slouken@8595
|
1814 |
SDL_free(data->pixels);
|
slouken@8591
|
1815 |
SDL_free(data);
|
slouken@8591
|
1816 |
texture->driverdata = NULL;
|
dludwig@8416
|
1817 |
}
|
dludwig@8416
|
1818 |
|
dludwig@8416
|
1819 |
static int
|
slouken@8595
|
1820 |
D3D11_UpdateTextureInternal(D3D11_RenderData *rendererData, ID3D11Texture2D *texture, Uint32 format, int x, int y, int w, int h, const void *pixels, int pitch)
|
slouken@8595
|
1821 |
{
|
slouken@8595
|
1822 |
ID3D11Texture2D *stagingTexture;
|
slouken@8595
|
1823 |
const Uint8 *src;
|
slouken@8595
|
1824 |
Uint8 *dst;
|
slouken@8595
|
1825 |
int row;
|
slouken@8595
|
1826 |
UINT length;
|
slouken@8595
|
1827 |
HRESULT result;
|
dludwig@8607
|
1828 |
D3D11_TEXTURE2D_DESC stagingTextureDesc;
|
dludwig@8607
|
1829 |
D3D11_MAPPED_SUBRESOURCE textureMemory;
|
slouken@8595
|
1830 |
|
slouken@8595
|
1831 |
/* Create a 'staging' texture, which will be used to write to a portion of the main texture. */
|
slouken@8595
|
1832 |
ID3D11Texture2D_GetDesc(texture, &stagingTextureDesc);
|
slouken@8595
|
1833 |
stagingTextureDesc.Width = w;
|
slouken@8595
|
1834 |
stagingTextureDesc.Height = h;
|
slouken@8595
|
1835 |
stagingTextureDesc.BindFlags = 0;
|
slouken@8595
|
1836 |
stagingTextureDesc.MiscFlags = 0;
|
slouken@8595
|
1837 |
stagingTextureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
slouken@8595
|
1838 |
stagingTextureDesc.Usage = D3D11_USAGE_STAGING;
|
slouken@8595
|
1839 |
result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
|
slouken@8595
|
1840 |
&stagingTextureDesc,
|
slouken@8595
|
1841 |
NULL,
|
slouken@8595
|
1842 |
&stagingTexture);
|
slouken@8595
|
1843 |
if (FAILED(result)) {
|
slouken@8595
|
1844 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateTexture2D [create staging texture]", result);
|
slouken@8595
|
1845 |
return -1;
|
slouken@8595
|
1846 |
}
|
slouken@8595
|
1847 |
|
slouken@8595
|
1848 |
/* Get a write-only pointer to data in the staging texture: */
|
slouken@8595
|
1849 |
result = ID3D11DeviceContext_Map(rendererData->d3dContext,
|
slouken@8595
|
1850 |
(ID3D11Resource *)stagingTexture,
|
slouken@8595
|
1851 |
0,
|
slouken@8595
|
1852 |
D3D11_MAP_WRITE,
|
slouken@8595
|
1853 |
0,
|
slouken@8595
|
1854 |
&textureMemory
|
slouken@8595
|
1855 |
);
|
slouken@8595
|
1856 |
if (FAILED(result)) {
|
slouken@8595
|
1857 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11DeviceContext1::Map [map staging texture]", result);
|
slouken@8595
|
1858 |
SAFE_RELEASE(stagingTexture);
|
slouken@8595
|
1859 |
return -1;
|
slouken@8595
|
1860 |
}
|
slouken@8595
|
1861 |
|
slouken@8595
|
1862 |
src = (const Uint8 *)pixels;
|
slouken@8595
|
1863 |
dst = textureMemory.pData;
|
slouken@8595
|
1864 |
length = w * SDL_BYTESPERPIXEL(format);
|
slouken@8595
|
1865 |
if (length == pitch && length == textureMemory.RowPitch) {
|
slouken@8595
|
1866 |
SDL_memcpy(dst, src, length*h);
|
slouken@8595
|
1867 |
} else {
|
slouken@8595
|
1868 |
if (length > (UINT)pitch) {
|
slouken@8595
|
1869 |
length = pitch;
|
slouken@8595
|
1870 |
}
|
slouken@8595
|
1871 |
if (length > textureMemory.RowPitch) {
|
slouken@8595
|
1872 |
length = textureMemory.RowPitch;
|
slouken@8595
|
1873 |
}
|
slouken@8595
|
1874 |
for (row = 0; row < h; ++row) {
|
slouken@8595
|
1875 |
SDL_memcpy(dst, src, length);
|
slouken@8595
|
1876 |
src += pitch;
|
slouken@8595
|
1877 |
dst += textureMemory.RowPitch;
|
slouken@8595
|
1878 |
}
|
slouken@8595
|
1879 |
}
|
slouken@8595
|
1880 |
|
slouken@8595
|
1881 |
/* Commit the pixel buffer's changes back to the staging texture: */
|
slouken@8595
|
1882 |
ID3D11DeviceContext_Unmap(rendererData->d3dContext,
|
slouken@8595
|
1883 |
(ID3D11Resource *)stagingTexture,
|
slouken@8595
|
1884 |
0);
|
slouken@8595
|
1885 |
|
slouken@8595
|
1886 |
/* Copy the staging texture's contents back to the texture: */
|
slouken@8595
|
1887 |
ID3D11DeviceContext_CopySubresourceRegion(rendererData->d3dContext,
|
slouken@8595
|
1888 |
(ID3D11Resource *)texture,
|
slouken@8595
|
1889 |
0,
|
slouken@8595
|
1890 |
x,
|
slouken@8595
|
1891 |
y,
|
slouken@8595
|
1892 |
0,
|
slouken@8595
|
1893 |
(ID3D11Resource *)stagingTexture,
|
slouken@8595
|
1894 |
0,
|
slouken@8595
|
1895 |
NULL);
|
slouken@8595
|
1896 |
|
slouken@8595
|
1897 |
SAFE_RELEASE(stagingTexture);
|
slouken@8595
|
1898 |
|
slouken@8595
|
1899 |
return 0;
|
slouken@8595
|
1900 |
}
|
slouken@8595
|
1901 |
|
slouken@8595
|
1902 |
static int
|
dludwig@8416
|
1903 |
D3D11_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
dludwig@8459
|
1904 |
const SDL_Rect * rect, const void * srcPixels,
|
dludwig@8459
|
1905 |
int srcPitch)
|
dludwig@8416
|
1906 |
{
|
slouken@8595
|
1907 |
D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->driverdata;
|
slouken@8595
|
1908 |
D3D11_TextureData *textureData = (D3D11_TextureData *)texture->driverdata;
|
slouken@8595
|
1909 |
|
slouken@8595
|
1910 |
if (!textureData) {
|
slouken@8595
|
1911 |
SDL_SetError("Texture is not currently available");
|
slouken@8595
|
1912 |
return -1;
|
slouken@8595
|
1913 |
}
|
slouken@8595
|
1914 |
|
slouken@8595
|
1915 |
if (D3D11_UpdateTextureInternal(rendererData, textureData->mainTexture, texture->format, rect->x, rect->y, rect->w, rect->h, srcPixels, srcPitch) < 0) {
|
slouken@8595
|
1916 |
return -1;
|
slouken@8582
|
1917 |
}
|
slouken@8582
|
1918 |
|
slouken@8595
|
1919 |
if (textureData->yuv) {
|
slouken@8595
|
1920 |
/* Skip to the correct offset into the next texture */
|
slouken@8595
|
1921 |
srcPixels = (const void*)((const Uint8*)srcPixels + rect->h * srcPitch);
|
slouken@8595
|
1922 |
|
slouken@8595
|
1923 |
if (D3D11_UpdateTextureInternal(rendererData, texture->format == SDL_PIXELFORMAT_YV12 ? textureData->mainTextureV : textureData->mainTextureU, texture->format, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, srcPixels, srcPitch / 2) < 0) {
|
slouken@8595
|
1924 |
return -1;
|
slouken@8595
|
1925 |
}
|
slouken@8595
|
1926 |
|
slouken@8595
|
1927 |
/* Skip to the correct offset into the next texture */
|
slouken@8595
|
1928 |
srcPixels = (const void*)((const Uint8*)srcPixels + (rect->h * srcPitch) / 4);
|
slouken@8595
|
1929 |
if (D3D11_UpdateTextureInternal(rendererData, texture->format == SDL_PIXELFORMAT_YV12 ? textureData->mainTextureU : textureData->mainTextureV, texture->format, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, srcPixels, srcPitch / 2) < 0) {
|
slouken@8595
|
1930 |
return -1;
|
slouken@8595
|
1931 |
}
|
slouken@8595
|
1932 |
}
|
slouken@8595
|
1933 |
return 0;
|
slouken@8595
|
1934 |
}
|
slouken@8595
|
1935 |
|
slouken@8595
|
1936 |
static int
|
slouken@8595
|
1937 |
D3D11_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
|
slouken@8595
|
1938 |
const SDL_Rect * rect,
|
slouken@8595
|
1939 |
const Uint8 *Yplane, int Ypitch,
|
slouken@8595
|
1940 |
const Uint8 *Uplane, int Upitch,
|
slouken@8595
|
1941 |
const Uint8 *Vplane, int Vpitch)
|
slouken@8595
|
1942 |
{
|
slouken@8595
|
1943 |
D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->driverdata;
|
slouken@8595
|
1944 |
D3D11_TextureData *textureData = (D3D11_TextureData *)texture->driverdata;
|
slouken@8595
|
1945 |
|
slouken@8595
|
1946 |
if (!textureData) {
|
slouken@8595
|
1947 |
SDL_SetError("Texture is not currently available");
|
slouken@8595
|
1948 |
return -1;
|
slouken@8582
|
1949 |
}
|
slouken@8582
|
1950 |
|
slouken@8595
|
1951 |
if (D3D11_UpdateTextureInternal(rendererData, textureData->mainTexture, texture->format, rect->x, rect->y, rect->w, rect->h, Yplane, Ypitch) < 0) {
|
slouken@8595
|
1952 |
return -1;
|
slouken@8595
|
1953 |
}
|
slouken@8595
|
1954 |
if (D3D11_UpdateTextureInternal(rendererData, textureData->mainTextureU, texture->format, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, Uplane, Upitch) < 0) {
|
slouken@8595
|
1955 |
return -1;
|
slouken@8595
|
1956 |
}
|
slouken@8595
|
1957 |
if (D3D11_UpdateTextureInternal(rendererData, textureData->mainTextureV, texture->format, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, Vplane, Vpitch) < 0) {
|
slouken@8595
|
1958 |
return -1;
|
slouken@8595
|
1959 |
}
|
dludwig@8416
|
1960 |
return 0;
|
dludwig@8416
|
1961 |
}
|
dludwig@8416
|
1962 |
|
dludwig@8400
|
1963 |
static int
|
dludwig@8451
|
1964 |
D3D11_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
dludwig@8451
|
1965 |
const SDL_Rect * rect, void **pixels, int *pitch)
|
dludwig@8451
|
1966 |
{
|
dludwig@8451
|
1967 |
D3D11_RenderData *rendererData = (D3D11_RenderData *) renderer->driverdata;
|
slouken@8582
|
1968 |
D3D11_TextureData *textureData = (D3D11_TextureData *) texture->driverdata;
|
slouken@8582
|
1969 |
HRESULT result = S_OK;
|
dludwig@8607
|
1970 |
D3D11_TEXTURE2D_DESC stagingTextureDesc;
|
dludwig@8607
|
1971 |
D3D11_MAPPED_SUBRESOURCE textureMemory;
|
slouken@8582
|
1972 |
|
slouken@8595
|
1973 |
if (!textureData) {
|
slouken@8595
|
1974 |
SDL_SetError("Texture is not currently available");
|
slouken@8595
|
1975 |
return -1;
|
slouken@8595
|
1976 |
}
|
slouken@8595
|
1977 |
|
slouken@8595
|
1978 |
if (textureData->yuv) {
|
slouken@8595
|
1979 |
/* It's more efficient to upload directly... */
|
slouken@8595
|
1980 |
if (!textureData->pixels) {
|
slouken@8595
|
1981 |
textureData->pitch = texture->w;
|
slouken@8595
|
1982 |
textureData->pixels = (Uint8 *)SDL_malloc((texture->h * textureData->pitch * 3) / 2);
|
slouken@8595
|
1983 |
if (!textureData->pixels) {
|
slouken@8595
|
1984 |
return SDL_OutOfMemory();
|
slouken@8595
|
1985 |
}
|
slouken@8595
|
1986 |
}
|
slouken@8595
|
1987 |
textureData->locked_rect = *rect;
|
slouken@8595
|
1988 |
*pixels =
|
slouken@8595
|
1989 |
(void *)((Uint8 *)textureData->pixels + rect->y * textureData->pitch +
|
slouken@8595
|
1990 |
rect->x * SDL_BYTESPERPIXEL(texture->format));
|
slouken@8595
|
1991 |
*pitch = textureData->pitch;
|
slouken@8595
|
1992 |
return 0;
|
slouken@8595
|
1993 |
}
|
slouken@8595
|
1994 |
|
dludwig@8451
|
1995 |
if (textureData->stagingTexture) {
|
dludwig@8556
|
1996 |
return SDL_SetError("texture is already locked");
|
dludwig@8451
|
1997 |
}
|
dludwig@8451
|
1998 |
|
slouken@8591
|
1999 |
/* Create a 'staging' texture, which will be used to write to a portion
|
slouken@8591
|
2000 |
* of the main texture. This is necessary, as Direct3D 11.1 does not
|
slouken@8591
|
2001 |
* have the ability to write a CPU-bound pixel buffer to a rectangular
|
slouken@8591
|
2002 |
* subrect of a texture. Direct3D 11.1 can, however, write a pixel
|
slouken@8591
|
2003 |
* buffer to an entire texture, hence the use of a staging texture.
|
slouken@8591
|
2004 |
*
|
slouken@8591
|
2005 |
* TODO, WinRT: consider avoiding the use of a staging texture in D3D11_LockTexture if/when the entire texture is being updated
|
slouken@8591
|
2006 |
*/
|
slouken@8591
|
2007 |
ID3D11Texture2D_GetDesc(textureData->mainTexture, &stagingTextureDesc);
|
dludwig@8451
|
2008 |
stagingTextureDesc.Width = rect->w;
|
dludwig@8451
|
2009 |
stagingTextureDesc.Height = rect->h;
|
dludwig@8451
|
2010 |
stagingTextureDesc.BindFlags = 0;
|
dludwig@8451
|
2011 |
stagingTextureDesc.MiscFlags = 0;
|
dludwig@8451
|
2012 |
stagingTextureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
dludwig@8451
|
2013 |
stagingTextureDesc.Usage = D3D11_USAGE_STAGING;
|
slouken@8591
|
2014 |
result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
|
dludwig@8451
|
2015 |
&stagingTextureDesc,
|
dludwig@8451
|
2016 |
NULL,
|
dludwig@8451
|
2017 |
&textureData->stagingTexture);
|
dludwig@8451
|
2018 |
if (FAILED(result)) {
|
dludwig@8553
|
2019 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateTexture2D [create staging texture]", result);
|
dludwig@8451
|
2020 |
return -1;
|
dludwig@8451
|
2021 |
}
|
dludwig@8451
|
2022 |
|
slouken@8591
|
2023 |
/* Get a write-only pointer to data in the staging texture: */
|
slouken@8591
|
2024 |
result = ID3D11DeviceContext_Map(rendererData->d3dContext,
|
slouken@8591
|
2025 |
(ID3D11Resource *)textureData->stagingTexture,
|
slouken@8591
|
2026 |
0,
|
slouken@8582
|
2027 |
D3D11_MAP_WRITE,
|
slouken@8582
|
2028 |
0,
|
slouken@8582
|
2029 |
&textureMemory
|
slouken@8582
|
2030 |
);
|
slouken@8582
|
2031 |
if (FAILED(result)) {
|
slouken@8582
|
2032 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11DeviceContext1::Map [map staging texture]", result);
|
slouken@8591
|
2033 |
SAFE_RELEASE(textureData->stagingTexture);
|
slouken@8582
|
2034 |
return -1;
|
dludwig@8451
|
2035 |
}
|
dludwig@8451
|
2036 |
|
slouken@8591
|
2037 |
/* Make note of where the staging texture will be written to
|
slouken@8591
|
2038 |
* (on a call to SDL_UnlockTexture):
|
slouken@8591
|
2039 |
*/
|
slouken@8591
|
2040 |
textureData->lockedTexturePositionX = rect->x;
|
slouken@8591
|
2041 |
textureData->lockedTexturePositionY = rect->y;
|
dludwig@8451
|
2042 |
|
slouken@8591
|
2043 |
/* Make sure the caller has information on the texture's pixel buffer,
|
slouken@8591
|
2044 |
* then return:
|
slouken@8591
|
2045 |
*/
|
dludwig@8451
|
2046 |
*pixels = textureMemory.pData;
|
dludwig@8451
|
2047 |
*pitch = textureMemory.RowPitch;
|
dludwig@8451
|
2048 |
return 0;
|
dludwig@8451
|
2049 |
}
|
dludwig@8451
|
2050 |
|
dludwig@8451
|
2051 |
static void
|
dludwig@8451
|
2052 |
D3D11_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
dludwig@8451
|
2053 |
{
|
dludwig@8451
|
2054 |
D3D11_RenderData *rendererData = (D3D11_RenderData *) renderer->driverdata;
|
dludwig@8451
|
2055 |
D3D11_TextureData *textureData = (D3D11_TextureData *) texture->driverdata;
|
slouken@8595
|
2056 |
|
slouken@8595
|
2057 |
if (!textureData) {
|
slouken@8595
|
2058 |
return;
|
slouken@8595
|
2059 |
}
|
slouken@8595
|
2060 |
|
slouken@8595
|
2061 |
if (textureData->yuv) {
|
slouken@8595
|
2062 |
const SDL_Rect *rect = &textureData->locked_rect;
|
slouken@8595
|
2063 |
void *pixels =
|
slouken@8595
|
2064 |
(void *) ((Uint8 *) textureData->pixels + rect->y * textureData->pitch +
|
slouken@8595
|
2065 |
rect->x * SDL_BYTESPERPIXEL(texture->format));
|
slouken@8595
|
2066 |
D3D11_UpdateTexture(renderer, texture, rect, pixels, textureData->pitch);
|
slouken@8595
|
2067 |
return;
|
slouken@8595
|
2068 |
}
|
dludwig@8451
|
2069 |
|
slouken@8591
|
2070 |
/* Commit the pixel buffer's changes back to the staging texture: */
|
slouken@8591
|
2071 |
ID3D11DeviceContext_Unmap(rendererData->d3dContext,
|
slouken@8591
|
2072 |
(ID3D11Resource *)textureData->stagingTexture,
|
dludwig@8451
|
2073 |
0);
|
dludwig@8451
|
2074 |
|
slouken@8591
|
2075 |
/* Copy the staging texture's contents back to the main texture: */
|
slouken@8591
|
2076 |
ID3D11DeviceContext_CopySubresourceRegion(rendererData->d3dContext,
|
slouken@8591
|
2077 |
(ID3D11Resource *)textureData->mainTexture,
|
dludwig@8451
|
2078 |
0,
|
slouken@8591
|
2079 |
textureData->lockedTexturePositionX,
|
slouken@8591
|
2080 |
textureData->lockedTexturePositionY,
|
slouken@8591
|
2081 |
0,
|
slouken@8591
|
2082 |
(ID3D11Resource *)textureData->stagingTexture,
|
slouken@8591
|
2083 |
0,
|
dludwig@8451
|
2084 |
NULL);
|
dludwig@8451
|
2085 |
|
slouken@8591
|
2086 |
SAFE_RELEASE(textureData->stagingTexture);
|
dludwig@8451
|
2087 |
}
|
dludwig@8451
|
2088 |
|
dludwig@8451
|
2089 |
static int
|
slouken@8582
|
2090 |
D3D11_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)
|
slouken@8582
|
2091 |
{
|
slouken@8582
|
2092 |
D3D11_RenderData *rendererData = (D3D11_RenderData *) renderer->driverdata;
|
dludwig@8607
|
2093 |
D3D11_TextureData *textureData = NULL;
|
slouken@8582
|
2094 |
|
slouken@8582
|
2095 |
if (texture == NULL) {
|
slouken@8591
|
2096 |
rendererData->currentOffscreenRenderTargetView = NULL;
|
slouken@8582
|
2097 |
return 0;
|
slouken@8582
|
2098 |
}
|
slouken@8582
|
2099 |
|
dludwig@8607
|
2100 |
textureData = (D3D11_TextureData *) texture->driverdata;
|
slouken@8582
|
2101 |
|
slouken@8582
|
2102 |
if (!textureData->mainTextureRenderTargetView) {
|
slouken@8582
|
2103 |
return SDL_SetError("specified texture is not a render target");
|
slouken@8582
|
2104 |
}
|
slouken@8582
|
2105 |
|
slouken@8582
|
2106 |
rendererData->currentOffscreenRenderTargetView = textureData->mainTextureRenderTargetView;
|
slouken@8582
|
2107 |
|
slouken@8582
|
2108 |
return 0;
|
dludwig@8548
|
2109 |
}
|
dludwig@8459
|
2110 |
|
slouken@8591
|
2111 |
static void
|
slouken@8591
|
2112 |
D3D11_SetModelMatrix(SDL_Renderer *renderer, const Float4X4 *matrix)
|
slouken@8591
|
2113 |
{
|
slouken@8591
|
2114 |
D3D11_RenderData *data = (D3D11_RenderData *)renderer->driverdata;
|
slouken@8591
|
2115 |
|
slouken@8591
|
2116 |
if (matrix) {
|
slouken@8591
|
2117 |
data->vertexShaderConstantsData.model = *matrix;
|
slouken@8591
|
2118 |
} else {
|
slouken@8591
|
2119 |
data->vertexShaderConstantsData.model = MatrixIdentity();
|
slouken@8591
|
2120 |
}
|
slouken@8591
|
2121 |
|
slouken@8591
|
2122 |
ID3D11DeviceContext_UpdateSubresource(data->d3dContext,
|
slouken@8591
|
2123 |
(ID3D11Resource *)data->vertexShaderConstants,
|
slouken@8591
|
2124 |
0,
|
slouken@8591
|
2125 |
NULL,
|
slouken@8591
|
2126 |
&data->vertexShaderConstantsData,
|
slouken@8591
|
2127 |
0,
|
slouken@8591
|
2128 |
0
|
slouken@8591
|
2129 |
);
|
slouken@8591
|
2130 |
}
|
slouken@8591
|
2131 |
|
dludwig@8459
|
2132 |
static int
|
dludwig@8400
|
2133 |
D3D11_UpdateViewport(SDL_Renderer * renderer)
|
dludwig@8400
|
2134 |
{
|
dludwig@8432
|
2135 |
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
dludwig@8607
|
2136 |
Float4X4 projection;
|
dludwig@8607
|
2137 |
Float4X4 view;
|
dludwig@8607
|
2138 |
SDL_FRect orientationAlignedViewport;
|
dludwig@8607
|
2139 |
BOOL swapDimensions;
|
dludwig@8607
|
2140 |
D3D11_VIEWPORT viewport;
|
dludwig@8432
|
2141 |
|
dludwig@8432
|
2142 |
if (renderer->viewport.w == 0 || renderer->viewport.h == 0) {
|
slouken@8591
|
2143 |
/* If the viewport is empty, assume that it is because
|
slouken@8591
|
2144 |
* SDL_CreateRenderer is calling it, and will call it again later
|
slouken@8591
|
2145 |
* with a non-empty viewport.
|
slouken@8591
|
2146 |
*/
|
dludwig@8432
|
2147 |
return 0;
|
dludwig@8432
|
2148 |
}
|
dludwig@8432
|
2149 |
|
slouken@8591
|
2150 |
/* Make sure the SDL viewport gets rotated to that of the physical display's rotation.
|
slouken@8591
|
2151 |
* Keep in mind here that the Y-axis will be been inverted (from Direct3D's
|
slouken@8591
|
2152 |
* default coordinate system) so rotations will be done in the opposite
|
slouken@8591
|
2153 |
* direction of the DXGI_MODE_ROTATION enumeration.
|
slouken@8591
|
2154 |
*/
|
slouken@8592
|
2155 |
switch (data->rotation) {
|
slouken@8582
|
2156 |
case DXGI_MODE_ROTATION_IDENTITY:
|
slouken@8591
|
2157 |
projection = MatrixIdentity();
|
slouken@8582
|
2158 |
break;
|
slouken@8582
|
2159 |
case DXGI_MODE_ROTATION_ROTATE270:
|
slouken@8591
|
2160 |
projection = MatrixRotationZ(SDL_static_cast(float, M_PI * 0.5f));
|
slouken@8582
|
2161 |
break;
|
slouken@8582
|
2162 |
case DXGI_MODE_ROTATION_ROTATE180:
|
slouken@8591
|
2163 |
projection = MatrixRotationZ(SDL_static_cast(float, M_PI));
|
slouken@8582
|
2164 |
break;
|
slouken@8582
|
2165 |
case DXGI_MODE_ROTATION_ROTATE90:
|
slouken@8591
|
2166 |
projection = MatrixRotationZ(SDL_static_cast(float, -M_PI * 0.5f));
|
slouken@8582
|
2167 |
break;
|
slouken@8582
|
2168 |
default:
|
slouken@8582
|
2169 |
return SDL_SetError("An unknown DisplayOrientation is being used");
|
dludwig@8432
|
2170 |
}
|
dludwig@8432
|
2171 |
|
slouken@8591
|
2172 |
/* Update the view matrix */
|
slouken@8591
|
2173 |
view.m[0][0] = 2.0f / renderer->viewport.w;
|
slouken@8591
|
2174 |
view.m[0][1] = 0.0f;
|
slouken@8591
|
2175 |
view.m[0][2] = 0.0f;
|
slouken@8591
|
2176 |
view.m[0][3] = 0.0f;
|
slouken@8591
|
2177 |
view.m[1][0] = 0.0f;
|
slouken@8591
|
2178 |
view.m[1][1] = -2.0f / renderer->viewport.h;
|
slouken@8591
|
2179 |
view.m[1][2] = 0.0f;
|
slouken@8591
|
2180 |
view.m[1][3] = 0.0f;
|
slouken@8591
|
2181 |
view.m[2][0] = 0.0f;
|
slouken@8591
|
2182 |
view.m[2][1] = 0.0f;
|
slouken@8591
|
2183 |
view.m[2][2] = 1.0f;
|
slouken@8591
|
2184 |
view.m[2][3] = 0.0f;
|
slouken@8591
|
2185 |
view.m[3][0] = -1.0f;
|
slouken@8591
|
2186 |
view.m[3][1] = 1.0f;
|
slouken@8591
|
2187 |
view.m[3][2] = 0.0f;
|
slouken@8591
|
2188 |
view.m[3][3] = 1.0f;
|
dludwig@8570
|
2189 |
|
slouken@8591
|
2190 |
/* Combine the projection + view matrix together now, as both only get
|
slouken@8591
|
2191 |
* set here (as of this writing, on Dec 26, 2013). When done, store it
|
slouken@8591
|
2192 |
* for eventual transfer to the GPU.
|
slouken@8591
|
2193 |
*/
|
slouken@8591
|
2194 |
data->vertexShaderConstantsData.projectionAndView = MatrixMultiply(
|
dludwig@8570
|
2195 |
view,
|
slouken@8591
|
2196 |
projection);
|
dludwig@8433
|
2197 |
|
slouken@8591
|
2198 |
/* Reset the model matrix */
|
slouken@8591
|
2199 |
D3D11_SetModelMatrix(renderer, NULL);
|
dludwig@8456
|
2200 |
|
slouken@8591
|
2201 |
/* Update the Direct3D viewport, which seems to be aligned to the
|
slouken@8591
|
2202 |
* swap buffer's coordinate space, which is always in either
|
slouken@8591
|
2203 |
* a landscape mode, for all Windows 8/RT devices, or a portrait mode,
|
slouken@8591
|
2204 |
* for Windows Phone devices.
|
slouken@8591
|
2205 |
*/
|
dludwig@8607
|
2206 |
swapDimensions = D3D11_IsDisplayRotated90Degrees(data->rotation);
|
slouken@8582
|
2207 |
if (swapDimensions) {
|
slouken@8582
|
2208 |
orientationAlignedViewport.x = (float) renderer->viewport.y;
|
slouken@8582
|
2209 |
orientationAlignedViewport.y = (float) renderer->viewport.x;
|
slouken@8582
|
2210 |
orientationAlignedViewport.w = (float) renderer->viewport.h;
|
slouken@8582
|
2211 |
orientationAlignedViewport.h = (float) renderer->viewport.w;
|
slouken@8582
|
2212 |
} else {
|
slouken@8582
|
2213 |
orientationAlignedViewport.x = (float) renderer->viewport.x;
|
slouken@8582
|
2214 |
orientationAlignedViewport.y = (float) renderer->viewport.y;
|
slouken@8582
|
2215 |
orientationAlignedViewport.w = (float) renderer->viewport.w;
|
slouken@8582
|
2216 |
orientationAlignedViewport.h = (float) renderer->viewport.h;
|
slouken@8582
|
2217 |
}
|
slouken@8591
|
2218 |
/* TODO, WinRT: get custom viewports working with non-Landscape modes (Portrait, PortraitFlipped, and LandscapeFlipped) */
|
slouken@8582
|
2219 |
|
slouken@8582
|
2220 |
viewport.TopLeftX = orientationAlignedViewport.x;
|
slouken@8582
|
2221 |
viewport.TopLeftY = orientationAlignedViewport.y;
|
slouken@8582
|
2222 |
viewport.Width = orientationAlignedViewport.w;
|
slouken@8582
|
2223 |
viewport.Height = orientationAlignedViewport.h;
|
slouken@8582
|
2224 |
viewport.MinDepth = 0.0f;
|
slouken@8582
|
2225 |
viewport.MaxDepth = 1.0f;
|
slouken@8591
|
2226 |
ID3D11DeviceContext_RSSetViewports(data->d3dContext, 1, &viewport);
|
dludwig@8433
|
2227 |
|
dludwig@8400
|
2228 |
return 0;
|
dludwig@8400
|
2229 |
}
|
dludwig@8400
|
2230 |
|
dludwig@8482
|
2231 |
static int
|
dludwig@8482
|
2232 |
D3D11_UpdateClipRect(SDL_Renderer * renderer)
|
dludwig@8482
|
2233 |
{
|
dludwig@8569
|
2234 |
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
dludwig@8569
|
2235 |
const SDL_Rect *rect = &renderer->clip_rect;
|
dludwig@8569
|
2236 |
|
dludwig@8569
|
2237 |
if (SDL_RectEmpty(rect)) {
|
slouken@8591
|
2238 |
ID3D11DeviceContext_RSSetScissorRects(data->d3dContext, 0, NULL);
|
dludwig@8569
|
2239 |
} else {
|
dludwig@8569
|
2240 |
D3D11_RECT scissorRect;
|
dludwig@8569
|
2241 |
if (D3D11_GetViewportAlignedD3DRect(renderer, rect, &scissorRect) != 0) {
|
dludwig@8569
|
2242 |
/* D3D11_GetViewportAlignedD3DRect will have set the SDL error */
|
dludwig@8569
|
2243 |
return -1;
|
dludwig@8569
|
2244 |
}
|
slouken@8591
|
2245 |
ID3D11DeviceContext_RSSetScissorRects(data->d3dContext, 1, &scissorRect);
|
dludwig@8569
|
2246 |
}
|
dludwig@8569
|
2247 |
|
dludwig@8482
|
2248 |
return 0;
|
dludwig@8482
|
2249 |
}
|
dludwig@8482
|
2250 |
|
slouken@8591
|
2251 |
static void
|
slouken@8591
|
2252 |
D3D11_ReleaseMainRenderTargetView(SDL_Renderer * renderer)
|
slouken@8591
|
2253 |
{
|
slouken@8591
|
2254 |
D3D11_RenderData *data = (D3D11_RenderData *)renderer->driverdata;
|
slouken@8591
|
2255 |
ID3D11DeviceContext_OMSetRenderTargets(data->d3dContext, 0, NULL, NULL);
|
slouken@8591
|
2256 |
SAFE_RELEASE(data->mainRenderTargetView);
|
slouken@8591
|
2257 |
}
|
slouken@8591
|
2258 |
|
slouken@8591
|
2259 |
static ID3D11RenderTargetView *
|
slouken@8582
|
2260 |
D3D11_GetCurrentRenderTargetView(SDL_Renderer * renderer)
|
slouken@8582
|
2261 |
{
|
slouken@8582
|
2262 |
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
slouken@8582
|
2263 |
if (data->currentOffscreenRenderTargetView) {
|
slouken@8582
|
2264 |
return data->currentOffscreenRenderTargetView;
|
slouken@8582
|
2265 |
} else {
|
slouken@8582
|
2266 |
return data->mainRenderTargetView;
|
slouken@8582
|
2267 |
}
|
dludwig@8459
|
2268 |
}
|
dludwig@8459
|
2269 |
|
slouken@8582
|
2270 |
static int
|
slouken@8582
|
2271 |
D3D11_RenderClear(SDL_Renderer * renderer)
|
slouken@8582
|
2272 |
{
|
slouken@8582
|
2273 |
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
slouken@8582
|
2274 |
const float colorRGBA[] = {
|
slouken@8582
|
2275 |
(renderer->r / 255.0f),
|
slouken@8582
|
2276 |
(renderer->g / 255.0f),
|
slouken@8582
|
2277 |
(renderer->b / 255.0f),
|
slouken@8582
|
2278 |
(renderer->a / 255.0f)
|
slouken@8582
|
2279 |
};
|
slouken@8591
|
2280 |
ID3D11DeviceContext_ClearRenderTargetView(data->d3dContext,
|
slouken@8591
|
2281 |
D3D11_GetCurrentRenderTargetView(renderer),
|
slouken@8582
|
2282 |
colorRGBA
|
slouken@8582
|
2283 |
);
|
slouken@8582
|
2284 |
return 0;
|
dludwig@8416
|
2285 |
}
|
dludwig@8416
|
2286 |
|
dludwig@8429
|
2287 |
static int
|
dludwig@8429
|
2288 |
D3D11_UpdateVertexBuffer(SDL_Renderer *renderer,
|
dludwig@8550
|
2289 |
const void * vertexData, size_t dataSizeInBytes)
|
dludwig@8416
|
2290 |
{
|
dludwig@8416
|
2291 |
D3D11_RenderData *rendererData = (D3D11_RenderData *) renderer->driverdata;
|
slouken@8591
|
2292 |
D3D11_BUFFER_DESC vertexBufferDesc;
|
dludwig@8425
|
2293 |
HRESULT result = S_OK;
|
dludwig@8607
|
2294 |
D3D11_SUBRESOURCE_DATA vertexBufferData;
|
dludwig@8607
|
2295 |
const UINT stride = sizeof(VertexPositionColor);
|
dludwig@8607
|
2296 |
const UINT offset = 0;
|
dludwig@8449
|
2297 |
|
dludwig@8449
|
2298 |
if (rendererData->vertexBuffer) {
|
slouken@8591
|
2299 |
ID3D11Buffer_GetDesc(rendererData->vertexBuffer, &vertexBufferDesc);
|
dludwig@8449
|
2300 |
} else {
|
slouken@8591
|
2301 |
SDL_zero(vertexBufferDesc);
|
dludwig@8449
|
2302 |
}
|
dludwig@8449
|
2303 |
|
slouken@8591
|
2304 |
if (rendererData->vertexBuffer && vertexBufferDesc.ByteWidth >= dataSizeInBytes) {
|
slouken@8582
|
2305 |
D3D11_MAPPED_SUBRESOURCE mappedResource;
|
slouken@8591
|
2306 |
result = ID3D11DeviceContext_Map(rendererData->d3dContext,
|
slouken@8591
|
2307 |
(ID3D11Resource *)rendererData->vertexBuffer,
|
slouken@8591
|
2308 |
0,
|
slouken@8591
|
2309 |
D3D11_MAP_WRITE_DISCARD,
|
slouken@8591
|
2310 |
0,
|
slouken@8591
|
2311 |
&mappedResource
|
slouken@8591
|
2312 |
);
|
slouken@8582
|
2313 |
if (FAILED(result)) {
|
slouken@8582
|
2314 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11DeviceContext1::Map [vertex buffer]", result);
|
slouken@8582
|
2315 |
return -1;
|
slouken@8582
|
2316 |
}
|
slouken@8591
|
2317 |
SDL_memcpy(mappedResource.pData, vertexData, dataSizeInBytes);
|
slouken@8591
|
2318 |
ID3D11DeviceContext_Unmap(rendererData->d3dContext, (ID3D11Resource *)rendererData->vertexBuffer, 0);
|
slouken@8582
|
2319 |
} else {
|
slouken@8591
|
2320 |
SAFE_RELEASE(rendererData->vertexBuffer);
|
slouken@8591
|
2321 |
|
slouken@8582
|
2322 |
vertexBufferDesc.ByteWidth = dataSizeInBytes;
|
slouken@8582
|
2323 |
vertexBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
|
slouken@8582
|
2324 |
vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
|
slouken@8582
|
2325 |
vertexBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
slouken@8582
|
2326 |
|
slouken@8591
|
2327 |
SDL_zero(vertexBufferData);
|
slouken@8582
|
2328 |
vertexBufferData.pSysMem = vertexData;
|
slouken@8582
|
2329 |
vertexBufferData.SysMemPitch = 0;
|
slouken@8582
|
2330 |
vertexBufferData.SysMemSlicePitch = 0;
|
slouken@8582
|
2331 |
|
slouken@8591
|
2332 |
result = ID3D11Device_CreateBuffer(rendererData->d3dDevice,
|
slouken@8582
|
2333 |
&vertexBufferDesc,
|
slouken@8582
|
2334 |
&vertexBufferData,
|
slouken@8582
|
2335 |
&rendererData->vertexBuffer
|
slouken@8582
|
2336 |
);
|
slouken@8582
|
2337 |
if (FAILED(result)) {
|
slouken@8582
|
2338 |
WIN_SetErrorFromHRESULT(__FUNCTION__ ", ID3D11Device1::CreateBuffer [vertex buffer]", result);
|
slouken@8582
|
2339 |
return -1;
|
slouken@8582
|
2340 |
}
|
slouken@8591
|
2341 |
|
slouken@8591
|
2342 |
ID3D11DeviceContext_IASetVertexBuffers(rendererData->d3dContext,
|
slouken@8591
|
2343 |
0,
|
slouken@8591
|
2344 |
1,
|
slouken@8591
|
2345 |
&rendererData->vertexBuffer,
|
slouken@8591
|
2346 |
&stride,
|
slouken@8591
|
2347 |
&offset
|
slouken@8591
|
2348 |
);
|
slouken@8582
|
2349 |
}
|
slouken@8582
|
2350 |
|
dludwig@8429
|
2351 |
return 0;
|
dludwig@8429
|
2352 |
}
|
dludwig@8429
|
2353 |
|
dludwig@8429
|
2354 |
static void
|
dludwig@8429
|
2355 |
D3D11_RenderStartDrawOp(SDL_Renderer * renderer)
|
dludwig@8429
|
2356 |
{
|
slouken@8591
|
2357 |
D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->driverdata;
|
dludwig@8607
|
2358 |
ID3D11RasterizerState *rasterizerState;
|
slouken@8591
|
2359 |
ID3D11RenderTargetView *renderTargetView = D3D11_GetCurrentRenderTargetView(renderer);
|
slouken@8591
|
2360 |
if (renderTargetView != rendererData->currentRenderTargetView) {
|
slouken@8591
|
2361 |
ID3D11DeviceContext_OMSetRenderTargets(rendererData->d3dContext,
|
slouken@8591
|
2362 |
1,
|
slouken@8591
|
2363 |
&renderTargetView,
|
slouken@8591
|
2364 |
NULL
|
slouken@8591
|
2365 |
);
|
slouken@8591
|
2366 |
rendererData->currentRenderTargetView = renderTargetView;
|
slouken@8591
|
2367 |
}
|
dludwig@8429
|
2368 |
|
slouken@8591
|
2369 |
if (SDL_RectEmpty(&renderer->clip_rect)) {
|
slouken@8591
|
2370 |
rasterizerState = rendererData->mainRasterizer;
|
slouken@8591
|
2371 |
} else {
|
slouken@8591
|
2372 |
rasterizerState = rendererData->clippedRasterizer;
|
slouken@8591
|
2373 |
}
|
slouken@8591
|
2374 |
if (rasterizerState != rendererData->currentRasterizerState) {
|
slouken@8591
|
2375 |
ID3D11DeviceContext_RSSetState(rendererData->d3dContext, rasterizerState);
|
slouken@8591
|
2376 |
rendererData->currentRasterizerState = rasterizerState;
|
slouken@8591
|
2377 |
}
|
slouken@8582
|
2378 |
}
|
slouken@8582
|
2379 |
|
slouken@8582
|
2380 |
static void
|
slouken@8582
|
2381 |
D3D11_RenderSetBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
|
slouken@8582
|
2382 |
{
|
slouken@8591
|
2383 |
D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->driverdata;
|
dludwig@8608
|
2384 |
ID3D11BlendState *blendState = NULL;
|
slouken@8582
|
2385 |
switch (blendMode) {
|
slouken@8591
|
2386 |
case SDL_BLENDMODE_BLEND:
|
slouken@8591
|
2387 |
blendState = rendererData->blendModeBlend;
|
slouken@8591
|
2388 |
break;
|
slouken@8591
|
2389 |
case SDL_BLENDMODE_ADD:
|
slouken@8591
|
2390 |
blendState = rendererData->blendModeAdd;
|
slouken@8591
|
2391 |
break;
|
slouken@8591
|
2392 |
case SDL_BLENDMODE_MOD:
|
slouken@8591
|
2393 |
blendState = rendererData->blendModeMod;
|
slouken@8591
|
2394 |
break;
|
slouken@8591
|
2395 |
case SDL_BLENDMODE_NONE:
|
slouken@8591
|
2396 |
blendState = NULL;
|
slouken@8591
|
2397 |
break;
|
slouken@8591
|
2398 |
}
|
slouken@8591
|
2399 |
if (blendState != rendererData->currentBlendState) {
|
slouken@8591
|
2400 |
ID3D11DeviceContext_OMSetBlendState(rendererData->d3dContext, blendState, 0, 0xFFFFFFFF);
|
slouken@8591
|
2401 |
rendererData->currentBlendState = blendState;
|
slouken@8582
|
2402 |
}
|
slouken@8582
|
2403 |
}
|
dludwig@8429
|
2404 |
|
dludwig@8429
|
2405 |
static void
|
dludwig@8429
|
2406 |
D3D11_SetPixelShader(SDL_Renderer * renderer,
|
dludwig@8429
|
2407 |
ID3D11PixelShader * shader,
|
slouken@8595
|
2408 |
int numShaderResources,
|
slouken@8595
|
2409 |
ID3D11ShaderResourceView ** shaderResources,
|
dludwig@8429
|
2410 |
ID3D11SamplerState * sampler)
|
dludwig@8429
|
2411 |
{
|
slouken@8582
|
2412 |
D3D11_RenderData *rendererData = (D3D11_RenderData *) renderer->driverdata;
|
slouken@8595
|
2413 |
ID3D11ShaderResourceView *shaderResource;
|
slouken@8591
|
2414 |
if (shader != rendererData->currentShader) {
|
slouken@8591
|
2415 |
ID3D11DeviceContext_PSSetShader(rendererData->d3dContext, shader, NULL, 0);
|
slouken@8591
|
2416 |
rendererData->currentShader = shader;
|
slouken@8591
|
2417 |
}
|
slouken@8595
|
2418 |
if (numShaderResources > 0) {
|
slouken@8595
|
2419 |
shaderResource = shaderResources[0];
|
slouken@8595
|
2420 |
} else {
|
slouken@8595
|
2421 |
shaderResource = NULL;
|
slouken@8595
|
2422 |
}
|
slouken@8591
|
2423 |
if (shaderResource != rendererData->currentShaderResource) {
|
slouken@8595
|
2424 |
ID3D11DeviceContext_PSSetShaderResources(rendererData->d3dContext, 0, numShaderResources, shaderResources);
|
slouken@8591
|
2425 |
rendererData->currentShaderResource = shaderResource;
|
slouken@8591
|
2426 |
}
|
slouken@8591
|
2427 |
if (sampler != rendererData->currentSampler) {
|
slouken@8591
|
2428 |
ID3D11DeviceContext_PSSetSamplers(rendererData->d3dContext, 0, 1, &sampler);
|
slouken@8591
|
2429 |
rendererData->currentSampler = sampler;
|
slouken@8591
|
2430 |
}
|
dludwig@8429
|
2431 |
}
|
dludwig@8429
|
2432 |
|
dludwig@8429
|
2433 |
static void
|
dludwig@8429
|
2434 |
D3D11_RenderFinishDrawOp(SDL_Renderer * renderer,
|
dludwig@8449
|
2435 |
D3D11_PRIMITIVE_TOPOLOGY primitiveTopology,
|
dludwig@8449
|
2436 |
UINT vertexCount)
|
dludwig@8429
|
2437 |
{
|
dludwig@8429
|
2438 |
D3D11_RenderData *rendererData = (D3D11_RenderData *) renderer->driverdata;
|
slouken@8582
|
2439 |
|
slouken@8591
|
2440 |
ID3D11DeviceContext_IASetPrimitiveTopology(rendererData->d3dContext, primitiveTopology);
|
slouken@8591
|
2441 |
ID3D11DeviceContext_Draw(rendererData->d3dContext, vertexCount, 0);
|
dludwig@8449
|
2442 |
}
|
dludwig@8449
|
2443 |
|
dludwig@8449
|
2444 |
static int
|
dludwig@8450
|
2445 |
D3D11_RenderDrawPoints(SDL_Renderer * renderer,
|
dludwig@8450
|
2446 |
const SDL_FPoint * points, int count)
|
dludwig@8450
|
2447 |
{
|
dludwig@8450
|
2448 |
D3D11_RenderData *rendererData = (D3D11_RenderData *) renderer->driverdata;
|
|