mirror of
https://github.com/libretro/RetroArch
synced 2025-03-02 19:13:34 +00:00
(D3D11) save spirv-cross's hlsl output when shader compilation fails.
This commit is contained in:
parent
5e09af9c77
commit
f907f2ea7d
@ -156,27 +156,28 @@ d3d11_get_closest_match(D3D11Device device, DXGI_FORMAT desired_format, UINT des
|
||||
}
|
||||
|
||||
bool d3d11_init_shader(
|
||||
D3D11Device device,
|
||||
const void* src,
|
||||
size_t size,
|
||||
LPCSTR vs_entry,
|
||||
LPCSTR ps_entry,
|
||||
LPCSTR gs_entry,
|
||||
D3D11_INPUT_ELEMENT_DESC* input_element_descs,
|
||||
UINT num_elements,
|
||||
d3d11_shader_t* out)
|
||||
D3D11Device device,
|
||||
const char* src,
|
||||
size_t size,
|
||||
const void* src_name,
|
||||
LPCSTR vs_entry,
|
||||
LPCSTR ps_entry,
|
||||
LPCSTR gs_entry,
|
||||
const D3D11_INPUT_ELEMENT_DESC* input_element_descs,
|
||||
UINT num_elements,
|
||||
d3d11_shader_t* out)
|
||||
{
|
||||
D3DBlob vs_code;
|
||||
D3DBlob ps_code;
|
||||
D3DBlob gs_code;
|
||||
|
||||
if (size < 0) /* LPCWSTR filename */
|
||||
if (!src) /* LPCWSTR filename */
|
||||
{
|
||||
if (vs_entry && !d3d_compile_from_file(src, vs_entry, "vs_5_0", &vs_code))
|
||||
if (vs_entry && !d3d_compile_from_file(src_name, vs_entry, "vs_5_0", &vs_code))
|
||||
return false;
|
||||
if (ps_entry && !d3d_compile_from_file(src, ps_entry, "ps_5_0", &ps_code))
|
||||
if (ps_entry && !d3d_compile_from_file(src_name, ps_entry, "ps_5_0", &ps_code))
|
||||
return false;
|
||||
if (gs_entry && !d3d_compile_from_file(src, gs_entry, "gs_5_0", &gs_code))
|
||||
if (gs_entry && !d3d_compile_from_file(src_name, gs_entry, "gs_5_0", &gs_code))
|
||||
return false;
|
||||
}
|
||||
else /* char array */
|
||||
@ -184,11 +185,11 @@ bool d3d11_init_shader(
|
||||
if (!size)
|
||||
size = strlen(src);
|
||||
|
||||
if (vs_entry && !d3d_compile(src, size, vs_entry, "vs_5_0", &vs_code))
|
||||
if (vs_entry && !d3d_compile(src, size, src_name, vs_entry, "vs_5_0", &vs_code))
|
||||
return false;
|
||||
if (ps_entry && !d3d_compile(src, size, ps_entry, "ps_5_0", &ps_code))
|
||||
if (ps_entry && !d3d_compile(src, size, src_name, ps_entry, "ps_5_0", &ps_code))
|
||||
return false;
|
||||
if (gs_entry && !d3d_compile(src, size, gs_entry, "gs_5_0", &gs_code))
|
||||
if (gs_entry && !d3d_compile(src, size, src_name, gs_entry, "gs_5_0", &gs_code))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1912,12 +1912,12 @@ static INLINE HRESULT D3D11CreateDepthStencilView(
|
||||
return device->lpVtbl->CreateDepthStencilView(device, resource, desc, depth_stencil_view);
|
||||
}
|
||||
static INLINE HRESULT D3D11CreateInputLayout(
|
||||
D3D11Device device,
|
||||
D3D11_INPUT_ELEMENT_DESC* input_element_descs,
|
||||
UINT num_elements,
|
||||
void* shader_bytecode_with_input_signature,
|
||||
SIZE_T bytecode_length,
|
||||
D3D11InputLayout* input_layout)
|
||||
D3D11Device device,
|
||||
const D3D11_INPUT_ELEMENT_DESC* input_element_descs,
|
||||
UINT num_elements,
|
||||
void* shader_bytecode_with_input_signature,
|
||||
SIZE_T bytecode_length,
|
||||
D3D11InputLayout* input_layout)
|
||||
{
|
||||
return device->lpVtbl->CreateInputLayout(
|
||||
device, input_element_descs, num_elements, shader_bytecode_with_input_signature,
|
||||
@ -2597,15 +2597,16 @@ d3d11_get_closest_match_texture2D(D3D11Device device, DXGI_FORMAT desired_format
|
||||
}
|
||||
|
||||
bool d3d11_init_shader(
|
||||
D3D11Device device,
|
||||
const void* src,
|
||||
size_t size,
|
||||
LPCSTR vs_entry,
|
||||
LPCSTR ps_entry,
|
||||
LPCSTR gs_entry,
|
||||
D3D11_INPUT_ELEMENT_DESC* input_element_descs,
|
||||
UINT num_elements,
|
||||
d3d11_shader_t* out);
|
||||
D3D11Device device,
|
||||
const char* src,
|
||||
size_t size,
|
||||
const void* src_name,
|
||||
LPCSTR vs_entry,
|
||||
LPCSTR ps_entry,
|
||||
LPCSTR gs_entry,
|
||||
const D3D11_INPUT_ELEMENT_DESC* input_element_descs,
|
||||
UINT num_elements,
|
||||
d3d11_shader_t* out);
|
||||
|
||||
static INLINE void d3d11_release_shader(d3d11_shader_t* shader)
|
||||
{
|
||||
|
@ -435,10 +435,10 @@ bool d3d12_init_pipeline(d3d12_video_t* d3d12)
|
||||
},
|
||||
};
|
||||
|
||||
if (!d3d_compile(stock, sizeof(stock), "VSMain", "vs_5_0", &vs_code))
|
||||
if (!d3d_compile(stock, sizeof(stock), NULL, "VSMain", "vs_5_0", &vs_code))
|
||||
return false;
|
||||
|
||||
if (!d3d_compile(stock, sizeof(stock), "PSMain", "ps_5_0", &ps_code))
|
||||
if (!d3d_compile(stock, sizeof(stock), NULL, "PSMain", "ps_5_0", &ps_code))
|
||||
return false;
|
||||
|
||||
{
|
||||
|
@ -123,7 +123,7 @@ HRESULT WINAPI
|
||||
}
|
||||
#endif
|
||||
|
||||
bool d3d_compile(const char* src, size_t size, LPCSTR entrypoint, LPCSTR target, D3DBlob* out)
|
||||
bool d3d_compile(const char* src, size_t size, LPCSTR src_name, LPCSTR entrypoint, LPCSTR target, D3DBlob* out)
|
||||
{
|
||||
D3DBlob error_msg;
|
||||
UINT compileflags = 0;
|
||||
@ -133,7 +133,7 @@ bool d3d_compile(const char* src, size_t size, LPCSTR entrypoint, LPCSTR target,
|
||||
#endif
|
||||
|
||||
if (FAILED(D3DCompile(
|
||||
src, size, NULL, NULL, NULL, entrypoint, target, compileflags, 0, out, &error_msg)))
|
||||
src, size, src_name, NULL, NULL, entrypoint, target, compileflags, 0, out, &error_msg)))
|
||||
{
|
||||
if (error_msg)
|
||||
{
|
||||
|
@ -55,5 +55,5 @@ D3DUnregisterDestructionCallback(D3DDestructionNotifier destruction_notifier, UI
|
||||
#endif
|
||||
/* end of auto-generated */
|
||||
|
||||
bool d3d_compile(const char* src, size_t size, LPCSTR entrypoint, LPCSTR target, D3DBlob* out);
|
||||
bool d3d_compile(const char* src, size_t size, LPCSTR src_name, LPCSTR entrypoint, LPCSTR target, D3DBlob* out);
|
||||
bool d3d_compile_from_file(LPCWSTR filename, LPCSTR entrypoint, LPCSTR target, D3DBlob* out);
|
||||
|
@ -236,8 +236,8 @@ d3d10_gfx_init(const video_info_t* video, const input_driver_t** input, void** i
|
||||
D3D10_INPUT_PER_VERTEX_DATA, 0 },
|
||||
};
|
||||
|
||||
d3d_compile(stock, sizeof(stock), "VSMain", "vs_4_0", &vs_code);
|
||||
d3d_compile(stock, sizeof(stock), "PSMain", "ps_4_0", &ps_code);
|
||||
d3d_compile(stock, sizeof(stock), NULL, "VSMain", "vs_4_0", &vs_code);
|
||||
d3d_compile(stock, sizeof(stock), NULL, "PSMain", "ps_4_0", &ps_code);
|
||||
|
||||
D3D10CreateVertexShader(
|
||||
d3d10->device, D3DGetBufferPointer(vs_code), D3DGetBufferSize(vs_code), &d3d10->vs);
|
||||
|
@ -208,20 +208,49 @@ static bool d3d11_gfx_set_shader(void* data, enum rarch_shader_type type, const
|
||||
D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
||||
};
|
||||
|
||||
if (!d3d11_init_shader(
|
||||
d3d11->device, d3d11->shader_preset->pass[i].source.string.vertex, 0, "main",
|
||||
NULL, NULL, desc, countof(desc), &d3d11->pass[i].shader))
|
||||
goto error;
|
||||
const char* vs_src = d3d11->shader_preset->pass[i].source.string.vertex;
|
||||
const char* ps_src = d3d11->shader_preset->pass[i].source.string.fragment;
|
||||
const char* vs_ext = ".vs.hlsl";
|
||||
const char* ps_ext = ".ps.hlsl";
|
||||
int base_len = strlen(d3d11->shader_preset->pass[i].source.path) - strlen(".slang");
|
||||
char* vs_filename = (char*)malloc(base_len + strlen(vs_ext) + 1);
|
||||
char* ps_filename = (char*)malloc(base_len + strlen(ps_ext) + 1);
|
||||
|
||||
strncpy(vs_filename, d3d11->shader_preset->pass[i].source.path, base_len);
|
||||
strncpy(ps_filename, d3d11->shader_preset->pass[i].source.path, base_len);
|
||||
strncpy(vs_filename + base_len, vs_ext, strlen(vs_ext) + 1);
|
||||
strncpy(ps_filename + base_len, ps_ext, strlen(ps_ext) + 1);
|
||||
|
||||
d3d11_init_shader(
|
||||
d3d11->device, vs_src, 0, vs_filename, "main", NULL, NULL, desc, countof(desc),
|
||||
&d3d11->pass[i].shader);
|
||||
|
||||
d3d11_init_shader(
|
||||
d3d11->device, ps_src, 0, ps_filename, NULL, "main", NULL, NULL, 0,
|
||||
&d3d11->pass[i].shader);
|
||||
|
||||
if (!d3d11->pass[i].shader.vs || !d3d11->pass[i].shader.ps)
|
||||
{
|
||||
FILE* fp = fopen(vs_filename, "w");
|
||||
fwrite(vs_src, 1, strlen(vs_src), fp);
|
||||
fclose(fp);
|
||||
|
||||
fp = fopen(ps_filename, "w");
|
||||
fwrite(ps_src, 1, strlen(ps_src), fp);
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
free(vs_filename);
|
||||
free(ps_filename);
|
||||
|
||||
free(d3d11->shader_preset->pass[i].source.string.vertex);
|
||||
d3d11->shader_preset->pass[i].source.string.vertex = NULL;
|
||||
|
||||
if (!d3d11_init_shader(
|
||||
d3d11->device, d3d11->shader_preset->pass[i].source.string.fragment, 0, NULL,
|
||||
"main", NULL, NULL, 0, &d3d11->pass[i].shader))
|
||||
goto error;
|
||||
|
||||
free(d3d11->shader_preset->pass[i].source.string.fragment);
|
||||
|
||||
d3d11->shader_preset->pass[i].source.string.vertex = NULL;
|
||||
d3d11->shader_preset->pass[i].source.string.fragment = NULL;
|
||||
|
||||
if (!d3d11->pass[i].shader.vs || !d3d11->pass[i].shader.ps)
|
||||
goto error;
|
||||
}
|
||||
|
||||
for (int j = 0; j < SLANG_CBUFFER_MAX; j++)
|
||||
@ -496,7 +525,7 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i
|
||||
;
|
||||
|
||||
if (!d3d11_init_shader(
|
||||
d3d11->device, shader, sizeof(shader), "VSMain", "PSMain", NULL, desc,
|
||||
d3d11->device, shader, sizeof(shader), NULL, "VSMain", "PSMain", NULL, desc,
|
||||
countof(desc), &d3d11->shaders[VIDEO_SHADER_STOCK_BLEND]))
|
||||
goto error;
|
||||
}
|
||||
@ -524,11 +553,11 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i
|
||||
;
|
||||
|
||||
if (!d3d11_init_shader(
|
||||
d3d11->device, shader, sizeof(shader), "VSMain", "PSMain", "GSMain", desc,
|
||||
d3d11->device, shader, sizeof(shader), NULL, "VSMain", "PSMain", "GSMain", desc,
|
||||
countof(desc), &d3d11->sprites.shader))
|
||||
goto error;
|
||||
if (!d3d11_init_shader(
|
||||
d3d11->device, shader, sizeof(shader), "VSMain", "PSMainA8", "GSMain", desc,
|
||||
d3d11->device, shader, sizeof(shader), NULL, "VSMain", "PSMainA8", "GSMain", desc,
|
||||
countof(desc), &d3d11->sprites.shader_font))
|
||||
goto error;
|
||||
}
|
||||
@ -546,13 +575,13 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i
|
||||
;
|
||||
|
||||
if (!d3d11_init_shader(
|
||||
d3d11->device, ribbon, sizeof(ribbon), "VSMain", "PSMain", NULL, desc,
|
||||
d3d11->device, ribbon, sizeof(ribbon), NULL, "VSMain", "PSMain", NULL, desc,
|
||||
countof(desc), &d3d11->shaders[VIDEO_SHADER_MENU]))
|
||||
goto error;
|
||||
|
||||
if (!d3d11_init_shader(
|
||||
d3d11->device, ribbon_simple, sizeof(ribbon_simple), "VSMain", "PSMain", NULL, desc,
|
||||
countof(desc), &d3d11->shaders[VIDEO_SHADER_MENU_2]))
|
||||
d3d11->device, ribbon_simple, sizeof(ribbon_simple), NULL, "VSMain", "PSMain", NULL,
|
||||
desc, countof(desc), &d3d11->shaders[VIDEO_SHADER_MENU_2]))
|
||||
goto error;
|
||||
}
|
||||
|
||||
@ -578,21 +607,21 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i
|
||||
;
|
||||
|
||||
if (!d3d11_init_shader(
|
||||
d3d11->device, simple_snow, sizeof(simple_snow), "VSMain", "PSMain", NULL, desc,
|
||||
countof(desc), &d3d11->shaders[VIDEO_SHADER_MENU_3]))
|
||||
d3d11->device, simple_snow, sizeof(simple_snow), NULL, "VSMain", "PSMain", NULL,
|
||||
desc, countof(desc), &d3d11->shaders[VIDEO_SHADER_MENU_3]))
|
||||
goto error;
|
||||
if (!d3d11_init_shader(
|
||||
d3d11->device, snow, sizeof(snow), "VSMain", "PSMain", NULL, desc, countof(desc),
|
||||
&d3d11->shaders[VIDEO_SHADER_MENU_4]))
|
||||
d3d11->device, snow, sizeof(snow), NULL, "VSMain", "PSMain", NULL, desc,
|
||||
countof(desc), &d3d11->shaders[VIDEO_SHADER_MENU_4]))
|
||||
goto error;
|
||||
|
||||
if (!d3d11_init_shader(
|
||||
d3d11->device, bokeh, sizeof(bokeh), "VSMain", "PSMain", NULL, desc, countof(desc),
|
||||
&d3d11->shaders[VIDEO_SHADER_MENU_5]))
|
||||
d3d11->device, bokeh, sizeof(bokeh), NULL, "VSMain", "PSMain", NULL, desc,
|
||||
countof(desc), &d3d11->shaders[VIDEO_SHADER_MENU_5]))
|
||||
goto error;
|
||||
|
||||
if (!d3d11_init_shader(
|
||||
d3d11->device, snowflake, sizeof(snowflake), "VSMain", "PSMain", NULL, desc,
|
||||
d3d11->device, snowflake, sizeof(snowflake), NULL, "VSMain", "PSMain", NULL, desc,
|
||||
countof(desc), &d3d11->shaders[VIDEO_SHADER_MENU_6]))
|
||||
goto error;
|
||||
}
|
||||
@ -850,7 +879,7 @@ static bool d3d11_gfx_frame(
|
||||
D3D11MapBuffer(d3d11->ctx, buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res);
|
||||
while (uniform->size)
|
||||
{
|
||||
if(uniform->data)
|
||||
if (uniform->data)
|
||||
memcpy((uint8_t*)res.pData + uniform->offset, uniform->data, uniform->size);
|
||||
uniform++;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user