mirror of
https://gitlab.winehq.org/wine/wine.git
synced 2024-11-21 17:09:06 -07:00
wined3d: Use the FFP HLSL pipeline for pretransformed draws as well.
This commit is contained in:
parent
1fe2f01aac
commit
8b8ca1acc5
4 changed files with 27 additions and 5 deletions
|
@ -161,8 +161,8 @@ void wined3d_stream_info_from_declaration(struct wined3d_stream_info *stream_inf
|
|||
const struct wined3d_state *state, const struct wined3d_d3d_info *d3d_info)
|
||||
{
|
||||
/* We need to deal with frequency data! */
|
||||
BOOL use_vshader = use_vs(state) || (d3d_info->ffp_hlsl && state->shader[WINED3D_SHADER_TYPE_VERTEX]);
|
||||
struct wined3d_vertex_declaration *declaration = state->vertex_declaration;
|
||||
BOOL use_vshader = use_vs(state);
|
||||
unsigned int i;
|
||||
|
||||
stream_info->use_map = 0;
|
||||
|
|
|
@ -10425,10 +10425,10 @@ static void set_glsl_shader_program(const struct wined3d_context_gl *context_gl,
|
|||
vs_id = ctx_data->glsl_program->vs.id;
|
||||
vs_list = &ctx_data->glsl_program->vs.shader_entry;
|
||||
|
||||
if (use_vs(state))
|
||||
if (use_vs(state) || d3d_info->ffp_hlsl)
|
||||
vshader = state->shader[WINED3D_SHADER_TYPE_VERTEX];
|
||||
}
|
||||
else if (use_vs(state))
|
||||
else if (use_vs(state) || d3d_info->ffp_hlsl)
|
||||
{
|
||||
struct vs_compile_args vs_compile_args;
|
||||
|
||||
|
|
|
@ -2701,10 +2701,28 @@ void find_vs_compile_args(const struct wined3d_state *state, const struct wined3
|
|||
&& state->transforms[WINED3D_TS_PROJECTION]._24 == 0.0f
|
||||
&& state->transforms[WINED3D_TS_PROJECTION]._34 == 0.0f
|
||||
&& state->transforms[WINED3D_TS_PROJECTION]._44 == 1.0f)
|
||||
args->fog_src = VS_FOG_Z;
|
||||
{
|
||||
/* Fog source is vertex output Z.
|
||||
*
|
||||
* However, if drawing RHW (which means we are using an HLSL
|
||||
* replacement shader, since we got here), and depth testing is
|
||||
* disabled, primitives are not supposed to be clipped by the
|
||||
* viewport. We handle this in the vertex shader by essentially
|
||||
* flushing output Z to zero.
|
||||
*
|
||||
* Fog needs to still read from the original Z, however. In this
|
||||
* case we read from oFog, which contains the original Z. */
|
||||
|
||||
if (state->vertex_declaration->position_transformed)
|
||||
args->fog_src = VS_FOG_COORD;
|
||||
else
|
||||
args->fog_src = VS_FOG_Z;
|
||||
}
|
||||
else
|
||||
{
|
||||
args->fog_src = VS_FOG_W;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
args->fog_src = VS_FOG_COORD;
|
||||
|
|
|
@ -1575,6 +1575,9 @@ void CDECL wined3d_stateblock_set_vertex_declaration(struct wined3d_stateblock *
|
|||
|| declaration->normal != prev->normal || declaration->point_size != prev->point_size)
|
||||
stateblock->changed.ffp_vs_settings = 1;
|
||||
}
|
||||
|
||||
if (declaration->position_transformed != prev->position_transformed)
|
||||
stateblock->changed.ffp_vs_settings = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -3814,7 +3817,8 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
|
|||
* FFP pipeline cares about. The rest should eventually be removed from
|
||||
* those structs and left only in vs_compile_args / ps_compile_args. */
|
||||
|
||||
if (changed->ffp_vs_settings && !state->vs)
|
||||
if (changed->ffp_vs_settings
|
||||
&& (!state->vs || !state->vertex_declaration || state->vertex_declaration->position_transformed))
|
||||
{
|
||||
if (device->adapter->d3d_info.ffp_hlsl)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue