d3d10: Store shaders directly in d3d10_effect_object.
This commit is contained in:
parent
42db7e4c1d
commit
2a83e1a581
|
@ -49,6 +49,9 @@ void d3d10_rb_free(void *ptr) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
enum d3d10_effect_object_type
|
enum d3d10_effect_object_type
|
||||||
{
|
{
|
||||||
|
D3D10_EOT_RASTERIZER_STATE = 0x0,
|
||||||
|
D3D10_EOT_DEPTH_STENCIL_STATE = 0x1,
|
||||||
|
D3D10_EOT_BLEND_STATE = 0x2,
|
||||||
D3D10_EOT_VERTEXSHADER = 0x6,
|
D3D10_EOT_VERTEXSHADER = 0x6,
|
||||||
D3D10_EOT_PIXELSHADER = 0x7,
|
D3D10_EOT_PIXELSHADER = 0x7,
|
||||||
D3D10_EOT_GEOMETRYSHADER = 0x8,
|
D3D10_EOT_GEOMETRYSHADER = 0x8,
|
||||||
|
@ -71,6 +74,12 @@ struct d3d10_effect_object
|
||||||
enum d3d10_effect_object_type type;
|
enum d3d10_effect_object_type type;
|
||||||
DWORD index;
|
DWORD index;
|
||||||
void *data;
|
void *data;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
ID3D10VertexShader *vs;
|
||||||
|
ID3D10PixelShader *ps;
|
||||||
|
ID3D10GeometryShader *gs;
|
||||||
|
} object;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct d3d10_effect_shader_signature
|
struct d3d10_effect_shader_signature
|
||||||
|
|
|
@ -1243,19 +1243,16 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
|
||||||
case D3D10_EOT_VERTEXSHADER:
|
case D3D10_EOT_VERTEXSHADER:
|
||||||
TRACE("Vertex shader\n");
|
TRACE("Vertex shader\n");
|
||||||
o->data = &anonymous_vs;
|
o->data = &anonymous_vs;
|
||||||
hr = S_OK;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D10_EOT_PIXELSHADER:
|
case D3D10_EOT_PIXELSHADER:
|
||||||
TRACE("Pixel shader\n");
|
TRACE("Pixel shader\n");
|
||||||
o->data = &anonymous_ps;
|
o->data = &anonymous_ps;
|
||||||
hr = S_OK;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D10_EOT_GEOMETRYSHADER:
|
case D3D10_EOT_GEOMETRYSHADER:
|
||||||
TRACE("Geometry shader\n");
|
TRACE("Geometry shader\n");
|
||||||
o->data = &anonymous_gs;
|
o->data = &anonymous_gs;
|
||||||
hr = S_OK;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D10_EOT_STENCIL_REF:
|
case D3D10_EOT_STENCIL_REF:
|
||||||
|
@ -1264,8 +1261,6 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
|
||||||
ERR("Failed to read stencil ref.\n");
|
ERR("Failed to read stencil ref.\n");
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = S_OK;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D10_EOT_SAMPLE_MASK:
|
case D3D10_EOT_SAMPLE_MASK:
|
||||||
|
@ -1274,8 +1269,6 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
|
||||||
FIXME("Failed to read sample mask.\n");
|
FIXME("Failed to read sample mask.\n");
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = S_OK;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D10_EOT_BLEND_FACTOR:
|
case D3D10_EOT_BLEND_FACTOR:
|
||||||
|
@ -1284,14 +1277,11 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
|
||||||
FIXME("Failed to read blend factor.\n");
|
FIXME("Failed to read blend factor.\n");
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = S_OK;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
FIXME("Unhandled object type %#x\n", o->type);
|
FIXME("Unhandled object type %#x\n", o->type);
|
||||||
hr = E_FAIL;
|
return E_FAIL;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1300,7 +1290,6 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
|
||||||
TRACE("Variable name %s.\n", debugstr_a(data + offset));
|
TRACE("Variable name %s.\n", debugstr_a(data + offset));
|
||||||
|
|
||||||
o->data = e->lpVtbl->GetVariableByName(e, data + offset);
|
o->data = e->lpVtbl->GetVariableByName(e, data + offset);
|
||||||
hr = S_OK;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D10_EOO_PARSED_OBJECT_INDEX:
|
case D3D10_EOO_PARSED_OBJECT_INDEX:
|
||||||
|
@ -1311,7 +1300,6 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
|
||||||
TRACE("Variable name %s[%u].\n", debugstr_a(data + offset), o->index);
|
TRACE("Variable name %s[%u].\n", debugstr_a(data + offset), o->index);
|
||||||
|
|
||||||
o->data = e->lpVtbl->GetVariableByName(e, data + offset);
|
o->data = e->lpVtbl->GetVariableByName(e, data + offset);
|
||||||
hr = S_OK;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D10_EOO_ANONYMOUS_SHADER:
|
case D3D10_EOO_ANONYMOUS_SHADER:
|
||||||
|
@ -1339,34 +1327,66 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
|
||||||
switch (o->type)
|
switch (o->type)
|
||||||
{
|
{
|
||||||
case D3D10_EOT_VERTEXSHADER:
|
case D3D10_EOT_VERTEXSHADER:
|
||||||
TRACE("Vertex shader\n");
|
|
||||||
hr = parse_shader(o->data, data_ptr);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case D3D10_EOT_PIXELSHADER:
|
case D3D10_EOT_PIXELSHADER:
|
||||||
TRACE("Pixel shader\n");
|
|
||||||
hr = parse_shader(o->data, data_ptr);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case D3D10_EOT_GEOMETRYSHADER:
|
case D3D10_EOT_GEOMETRYSHADER:
|
||||||
TRACE("Geometry shader\n");
|
if (FAILED(hr = parse_shader(o->data, data_ptr)))
|
||||||
hr = parse_shader(o->data, data_ptr);
|
return hr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
FIXME("Unhandled object type %#x\n", o->type);
|
FIXME("Unhandled object type %#x\n", o->type);
|
||||||
hr = E_FAIL;
|
return E_FAIL;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
hr = E_FAIL;
|
|
||||||
FIXME("Unhandled operation %#x.\n", operation);
|
FIXME("Unhandled operation %#x.\n", operation);
|
||||||
break;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return hr;
|
switch (o->type)
|
||||||
|
{
|
||||||
|
case D3D10_EOT_VERTEXSHADER:
|
||||||
|
{
|
||||||
|
ID3D10EffectVariable *variable = o->data;
|
||||||
|
ID3D10EffectShaderVariable *sv = variable->lpVtbl->AsShader(variable);
|
||||||
|
if (FAILED(hr = sv->lpVtbl->GetVertexShader(sv, o->index, &o->object.vs)))
|
||||||
|
return hr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case D3D10_EOT_PIXELSHADER:
|
||||||
|
{
|
||||||
|
ID3D10EffectVariable *variable = o->data;
|
||||||
|
ID3D10EffectShaderVariable *sv = variable->lpVtbl->AsShader(variable);
|
||||||
|
if (FAILED(hr = sv->lpVtbl->GetPixelShader(sv, o->index, &o->object.ps)))
|
||||||
|
return hr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case D3D10_EOT_GEOMETRYSHADER:
|
||||||
|
{
|
||||||
|
ID3D10EffectVariable *variable = o->data;
|
||||||
|
ID3D10EffectShaderVariable *sv = variable->lpVtbl->AsShader(variable);
|
||||||
|
if (FAILED(hr = sv->lpVtbl->GetGeometryShader(sv, o->index, &o->object.gs)))
|
||||||
|
return hr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case D3D10_EOT_RASTERIZER_STATE:
|
||||||
|
case D3D10_EOT_DEPTH_STENCIL_STATE:
|
||||||
|
case D3D10_EOT_BLEND_STATE:
|
||||||
|
case D3D10_EOT_STENCIL_REF:
|
||||||
|
case D3D10_EOT_BLEND_FACTOR:
|
||||||
|
case D3D10_EOT_SAMPLE_MASK:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FIXME("Unhandled object type %#x.\n", o->type);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT parse_fx10_pass(struct d3d10_effect_pass *p, const char **ptr, const char *data)
|
static HRESULT parse_fx10_pass(struct d3d10_effect_pass *p, const char **ptr, const char *data)
|
||||||
|
@ -2093,22 +2113,21 @@ HRESULT d3d10_effect_parse(struct d3d10_effect *This, const void *data, SIZE_T d
|
||||||
static HRESULT d3d10_effect_object_apply(struct d3d10_effect_object *o)
|
static HRESULT d3d10_effect_object_apply(struct d3d10_effect_object *o)
|
||||||
{
|
{
|
||||||
ID3D10Device *device = o->pass->technique->effect->device;
|
ID3D10Device *device = o->pass->technique->effect->device;
|
||||||
struct d3d10_effect_variable *v = (struct d3d10_effect_variable*) o->data;
|
|
||||||
|
|
||||||
TRACE("effect object %p, type %#x.\n", o, o->type);
|
TRACE("effect object %p, type %#x.\n", o, o->type);
|
||||||
|
|
||||||
switch(o->type)
|
switch(o->type)
|
||||||
{
|
{
|
||||||
case D3D10_EOT_VERTEXSHADER:
|
case D3D10_EOT_VERTEXSHADER:
|
||||||
ID3D10Device_VSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.vs);
|
ID3D10Device_VSSetShader(device, o->object.vs);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
case D3D10_EOT_PIXELSHADER:
|
case D3D10_EOT_PIXELSHADER:
|
||||||
ID3D10Device_PSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.ps);
|
ID3D10Device_PSSetShader(device, o->object.ps);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
case D3D10_EOT_GEOMETRYSHADER:
|
case D3D10_EOT_GEOMETRYSHADER:
|
||||||
ID3D10Device_GSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.gs);
|
ID3D10Device_GSSetShader(device, o->object.gs);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -2198,6 +2217,30 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void d3d10_effect_object_destroy(struct d3d10_effect_object *o)
|
||||||
|
{
|
||||||
|
switch (o->type)
|
||||||
|
{
|
||||||
|
case D3D10_EOT_VERTEXSHADER:
|
||||||
|
if (o->object.vs)
|
||||||
|
ID3D10VertexShader_Release(o->object.vs);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3D10_EOT_PIXELSHADER:
|
||||||
|
if (o->object.ps)
|
||||||
|
ID3D10PixelShader_Release(o->object.ps);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3D10_EOT_GEOMETRYSHADER:
|
||||||
|
if (o->object.gs)
|
||||||
|
ID3D10GeometryShader_Release(o->object.gs);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void d3d10_effect_pass_destroy(struct d3d10_effect_pass *p)
|
static void d3d10_effect_pass_destroy(struct d3d10_effect_pass *p)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -2205,7 +2248,15 @@ static void d3d10_effect_pass_destroy(struct d3d10_effect_pass *p)
|
||||||
TRACE("pass %p\n", p);
|
TRACE("pass %p\n", p);
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, p->name);
|
HeapFree(GetProcessHeap(), 0, p->name);
|
||||||
HeapFree(GetProcessHeap(), 0, p->objects);
|
|
||||||
|
if (p->objects)
|
||||||
|
{
|
||||||
|
for (i = 0; i < p->object_count; ++i)
|
||||||
|
{
|
||||||
|
d3d10_effect_object_destroy(&p->objects[i]);
|
||||||
|
}
|
||||||
|
HeapFree(GetProcessHeap(), 0, p->objects);
|
||||||
|
}
|
||||||
|
|
||||||
if (p->annotations)
|
if (p->annotations)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue