Connor McAdams : d3d10: Get resources used by effect shaders.
Alexandre Julliard
julliard at winehq.org
Tue Mar 24 15:28:17 CDT 2020
Module: wine
Branch: master
Commit: f8086a3e7ec5e68afaa94519e2a9fda2f00d4b26
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f8086a3e7ec5e68afaa94519e2a9fda2f00d4b26
Author: Connor McAdams <conmanx360 at gmail.com>
Date: Tue Mar 24 14:07:41 2020 +0100
d3d10: Get resources used by effect shaders.
Signed-off-by: Connor McAdams <conmanx360 at gmail.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/d3d10/d3d10_private.h | 12 +++++++
dlls/d3d10/effect.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 96 insertions(+)
diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index e02ea376bb..21d7f964e8 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -81,6 +81,15 @@ struct d3d10_effect_object
} object;
};
+struct d3d10_effect_shader_resource
+{
+ D3D10_SHADER_INPUT_TYPE in_type;
+ unsigned int bind_point;
+ unsigned int bind_count;
+
+ struct d3d10_effect_variable *variable;
+};
+
struct d3d10_effect_shader_signature
{
char *signature;
@@ -99,6 +108,9 @@ struct d3d10_effect_shader_variable
ID3D10PixelShader *ps;
ID3D10GeometryShader *gs;
} shader;
+
+ unsigned int resource_count;
+ struct d3d10_effect_shader_resource *resources;
};
struct d3d10_effect_state_object_variable
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 8cc2d11feb..2360e5a025 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -656,6 +656,84 @@ static HRESULT shader_chunk_handler(const char *data, DWORD data_size, DWORD tag
return S_OK;
}
+static HRESULT get_fx10_shader_resources(struct d3d10_effect_variable *v, const void *data, size_t data_size)
+{
+ struct d3d10_effect_shader_variable *sv = &v->u.shader;
+ struct d3d10_effect_shader_resource *sr;
+ D3D10_SHADER_INPUT_BIND_DESC bind_desc;
+ ID3D10ShaderReflection *reflection;
+ struct d3d10_effect_variable *var;
+ D3D10_SHADER_DESC desc;
+ unsigned int i, y;
+ HRESULT hr;
+
+ if (FAILED(hr = D3D10ReflectShader(data, data_size, &reflection)))
+ return hr;
+
+ reflection->lpVtbl->GetDesc(reflection, &desc);
+ sv->resource_count = desc.BoundResources;
+
+ if (!(sv->resources = heap_calloc(sv->resource_count, sizeof(*sv->resources))))
+ {
+ ERR("Failed to allocate shader resource binding information memory.\n");
+ reflection->lpVtbl->Release(reflection);
+ return E_OUTOFMEMORY;
+ }
+
+ for (i = 0; i < desc.BoundResources; ++i)
+ {
+ reflection->lpVtbl->GetResourceBindingDesc(reflection, i, &bind_desc);
+ sr = &sv->resources[i];
+
+ sr->in_type = bind_desc.Type;
+ sr->bind_point = bind_desc.BindPoint;
+ sr->bind_count = bind_desc.BindCount;
+
+ switch (bind_desc.Type)
+ {
+ case D3D10_SIT_CBUFFER:
+ case D3D10_SIT_TBUFFER:
+ for (y = 0; y < v->effect->local_buffer_count; ++y)
+ {
+ var = &v->effect->local_buffers[y];
+
+ if (!strcmp(bind_desc.Name, var->name))
+ {
+ sr->variable = var;
+ break;
+ }
+ }
+ break;
+
+ case D3D10_SIT_SAMPLER:
+ case D3D10_SIT_TEXTURE:
+ for (y = 0; y < v->effect->local_variable_count; ++y)
+ {
+ var = &v->effect->local_variables[y];
+
+ if (!strcmp(bind_desc.Name, var->name))
+ {
+ sr->variable = var;
+ break;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if (!sr->variable)
+ {
+ WARN("Failed to find shader resource.\n");
+ reflection->lpVtbl->Release(reflection);
+ return E_FAIL;
+ }
+ }
+
+ return S_OK;
+}
+
static HRESULT parse_fx10_shader(const char *data, size_t data_size, DWORD offset, struct d3d10_effect_variable *v)
{
ID3D10Device *device = v->effect->device;
@@ -691,6 +769,9 @@ static HRESULT parse_fx10_shader(const char *data, size_t data_size, DWORD offse
/* We got a shader VertexShader vs = NULL, so it is fine to skip this. */
if (!dxbc_size) return S_OK;
+ if (FAILED(hr = get_fx10_shader_resources(v, ptr, dxbc_size)))
+ return hr;
+
switch (v->type->basetype)
{
case D3D10_SVT_VERTEXSHADER:
@@ -2623,6 +2704,9 @@ static void d3d10_effect_shader_variable_destroy(struct d3d10_effect_shader_vari
FIXME("Unhandled shader type %s.\n", debug_d3d10_shader_variable_type(type));
break;
}
+
+ if (s->resource_count)
+ heap_free(s->resources);
}
static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
More information about the wine-cvs
mailing list