diff options
author | Axel Davy <[email protected]> | 2019-01-20 21:43:19 +0100 |
---|---|---|
committer | Axel Davy <[email protected]> | 2019-04-30 19:18:51 +0200 |
commit | 6f3da226e67051d92825554bdc6eb7caa8bd9365 (patch) | |
tree | 8085b7098880714992872f6a8b73a8da3ae2a5b4 /src/gallium/state_trackers | |
parent | d57d1436d3e57748770803cdb148609825cb5a3e (diff) |
st/nine: Make swvp_on imply IS_VS
swvp cannot happen with ps, thus it makes
sense to force it to false with ps.
Signed-off-by: Axel Davy <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/nine/nine_shader.c | 14 | ||||
-rw-r--r-- | src/gallium/state_trackers/nine/pixelshader9.c | 2 |
2 files changed, 10 insertions, 6 deletions
diff --git a/src/gallium/state_trackers/nine/nine_shader.c b/src/gallium/state_trackers/nine/nine_shader.c index 09f14a415f3..9ec6c874a28 100644 --- a/src/gallium/state_trackers/nine/nine_shader.c +++ b/src/gallium/state_trackers/nine/nine_shader.c @@ -558,7 +558,7 @@ static struct ureg_src nine_float_constant_src(struct shader_translator *tx, int * doesn't need to be elsewhere, because all the instructions * accessing the constants directly are VS1, and swvp * is VS >= 2 */ - if (IS_VS && tx->info->swvp_on && idx >= 4096) { + if (tx->info->swvp_on && idx >= 4096) { /* TODO: swvp rel is broken if many constants are used */ src = ureg_src_register(TGSI_FILE_CONSTANT, idx - 4096); src = ureg_src_dimension(src, 1); @@ -577,7 +577,7 @@ static struct ureg_src nine_integer_constant_src(struct shader_translator *tx, i { struct ureg_src src; - if (IS_VS && tx->info->swvp_on) { + if (tx->info->swvp_on) { src = ureg_src_register(TGSI_FILE_CONSTANT, idx); src = ureg_src_dimension(src, 2); } else { @@ -600,7 +600,7 @@ static struct ureg_src nine_boolean_constant_src(struct shader_translator *tx, i char r = idx / 4; char s = idx & 3; - if (IS_VS && tx->info->swvp_on) { + if (tx->info->swvp_on) { src = ureg_src_register(TGSI_FILE_CONSTANT, r); src = ureg_src_dimension(src, 3); } else { @@ -3655,6 +3655,8 @@ nine_translate_shader(struct NineDevice9 *device, struct nine_shader_info *info, return E_OUTOFMEMORY; tx_ctor(tx, info); + assert(IS_VS || !info->swvp_on); + if (((tx->version.major << 16) | tx->version.minor) > 0x00030000) { hr = D3DERR_INVALIDCALL; DBG("Unsupported shader version: %u.%u !\n", @@ -3702,7 +3704,7 @@ nine_translate_shader(struct NineDevice9 *device, struct nine_shader_info *info, tx->num_constb_allowed = NINE_MAX_CONST_B; } - if (IS_VS && tx->version.major >= 2 && info->swvp_on) { + if (info->swvp_on && tx->version.major >= 2) { tx->num_constf_allowed = 8192; tx->num_consti_allowed = 2048; tx->num_constb_allowed = 2048; @@ -3854,14 +3856,14 @@ nine_translate_shader(struct NineDevice9 *device, struct nine_shader_info *info, /* r500 */ if (info->const_float_slots > device->max_vs_const_f && (info->const_int_slots || info->const_bool_slots) && - (!IS_VS || !info->swvp_on)) + !info->swvp_on) ERR("Overlapping constant slots. The shader is likely to be buggy\n"); if (tx->indirect_const_access) /* vs only */ info->const_float_slots = device->max_vs_const_f; - if (!IS_VS || !info->swvp_on) { + if (!info->swvp_on) { unsigned s, slot_max; unsigned max_const_f = IS_VS ? device->max_vs_const_f : device->max_ps_const_f; diff --git a/src/gallium/state_trackers/nine/pixelshader9.c b/src/gallium/state_trackers/nine/pixelshader9.c index 127d56161bf..f4b28e8d039 100644 --- a/src/gallium/state_trackers/nine/pixelshader9.c +++ b/src/gallium/state_trackers/nine/pixelshader9.c @@ -64,6 +64,7 @@ NinePixelShader9_ctor( struct NinePixelShader9 *This, info.add_constants_defs.int_const_added = NULL; info.add_constants_defs.bool_const_added = NULL; info.process_vertices = false; + info.swvp_on = false; pipe = nine_context_get_pipe_acquire(device); hr = nine_translate_shader(device, &info, pipe); @@ -199,6 +200,7 @@ NinePixelShader9_GetVariant( struct NinePixelShader9 *This ) info.add_constants_defs.int_const_added = &This->int_slots_used; info.add_constants_defs.bool_const_added = &This->bool_slots_used; info.process_vertices = false; + info.swvp_on = false; hr = nine_translate_shader(This->base.device, &info, pipe); if (FAILED(hr)) |