diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 65925e46390..47078cd6e64 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -5134,7 +5134,9 @@ iris_store_fs_state(const struct intel_device_info *devinfo, ps.MaximumNumberofThreadsPerPSD = devinfo->max_threads_per_psd - (GFX_VER == 8 ? 2 : 1); +#if GFX_VER < 20 ps.PushConstantEnable = prog_data->ubo_ranges[0].length > 0; +#endif /* From the documentation for this packet: * "If the PS kernel does not need the Position XY Offsets to @@ -7167,15 +7169,19 @@ iris_upload_dirty_render_state(struct iris_context *ice, brw_wm_prog_data_dispatch_grf_start_reg(wm_prog_data, ps, 0); ps.DispatchGRFStartRegisterForConstantSetupData1 = brw_wm_prog_data_dispatch_grf_start_reg(wm_prog_data, ps, 1); +#if GFX_VER < 20 ps.DispatchGRFStartRegisterForConstantSetupData2 = brw_wm_prog_data_dispatch_grf_start_reg(wm_prog_data, ps, 2); +#endif ps.KernelStartPointer0 = KSP(shader) + brw_wm_prog_data_prog_offset(wm_prog_data, ps, 0); ps.KernelStartPointer1 = KSP(shader) + brw_wm_prog_data_prog_offset(wm_prog_data, ps, 1); +#if GFX_VER < 20 ps.KernelStartPointer2 = KSP(shader) + brw_wm_prog_data_prog_offset(wm_prog_data, ps, 2); +#endif #if GFX_VERx10 >= 125 ps.ScratchSpaceBuffer = scratch_addr >> 4; diff --git a/src/intel/blorp/blorp_genX_exec.h b/src/intel/blorp/blorp_genX_exec.h index c04707ffad0..98cc5387f78 100644 --- a/src/intel/blorp/blorp_genX_exec.h +++ b/src/intel/blorp/blorp_genX_exec.h @@ -947,15 +947,19 @@ blorp_emit_ps_config(struct blorp_batch *batch, brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 0); ps.DispatchGRFStartRegisterForConstantSetupData1 = brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 1); +#if GFX_VER < 20 ps.DispatchGRFStartRegisterForConstantSetupData2 = brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 2); +#endif ps.KernelStartPointer0 = params->wm_prog_kernel + brw_wm_prog_data_prog_offset(prog_data, ps, 0); ps.KernelStartPointer1 = params->wm_prog_kernel + brw_wm_prog_data_prog_offset(prog_data, ps, 1); +#if GFX_VER < 20 ps.KernelStartPointer2 = params->wm_prog_kernel + brw_wm_prog_data_prog_offset(prog_data, ps, 2); +#endif } } diff --git a/src/intel/common/intel_genX_state.h b/src/intel/common/intel_genX_state.h index 2b0f85d971a..be606d129b6 100644 --- a/src/intel/common/intel_genX_state.h +++ b/src/intel/common/intel_genX_state.h @@ -119,9 +119,17 @@ intel_set_ps_dispatch_state(struct GENX(3DSTATE_PS) *ps, assert(enable_8 || enable_16 || enable_32); +#if GFX_VER >= 20 + assert(!enable_8); + ps->Kernel0Enable = enable_16 || enable_32; + ps->Kernel0SIMDWidth = enable_16 ? 0 : 1; + ps->Kernel1Enable = enable_16 && enable_32; + ps->Kernel1SIMDWidth = SIMD32 /* SIMD32 */; +#else ps->_8PixelDispatchEnable = enable_8; ps->_16PixelDispatchEnable = enable_16; ps->_32PixelDispatchEnable = enable_32; +#endif } #endif diff --git a/src/intel/compiler/brw_compiler.h b/src/intel/compiler/brw_compiler.h index 85f8644f1c6..bf6b2763fef 100644 --- a/src/intel/compiler/brw_compiler.h +++ b/src/intel/compiler/brw_compiler.h @@ -1062,6 +1062,39 @@ struct brw_wm_prog_data { uint8_t urb_setup_attribs_count; }; +#ifdef GFX_VERx10 + +#if GFX_VERx10 >= 200 + +/** Returns the SIMD width corresponding to a given KSP index + * + * The "Variable Pixel Dispatch" table in the PRM (which can be found, for + * example in Vol. 7 of the SKL PRM) has a mapping from dispatch widths to + * kernel start pointer (KSP) indices that is based on what dispatch widths + * are enabled. This function provides, effectively, the reverse mapping. + * + * If the given KSP is valid with respect to the SIMD8/16/32 enables, a SIMD + * width of 8, 16, or 32 is returned. If the KSP is invalid, 0 is returned. + */ +static inline unsigned +brw_fs_simd_width_for_ksp(unsigned ksp_idx, bool enabled, unsigned width_sel) +{ + if (ksp_idx < 2) { + return enabled ? (width_sel == 0 ? 16 : 32) : 0; + } else { + unreachable("Invalid KSP index"); + } +} + +#define brw_wm_state_simd_width_for_ksp(wm_state, ksp_idx) \ + (ksp_idx == 0 ? \ + brw_fs_simd_width_for_ksp(ksp_idx, (wm_state).Kernel0Enable, \ + (wm_state).Kernel0SIMDWidth) : \ + brw_fs_simd_width_for_ksp(ksp_idx, (wm_state).Kernel1Enable, \ + (wm_state).Kernel1SIMDWidth)) + +#else + /** Returns the SIMD width corresponding to a given KSP index * * The "Variable Pixel Dispatch" table in the PRM (which can be found, for @@ -1091,11 +1124,15 @@ brw_fs_simd_width_for_ksp(unsigned ksp_idx, bool simd8_enabled, } } -#define brw_wm_state_simd_width_for_ksp(wm_state, ksp_idx) \ +#define brw_wm_state_simd_width_for_ksp(wm_state, ksp_idx) \ brw_fs_simd_width_for_ksp((ksp_idx), (wm_state)._8PixelDispatchEnable, \ (wm_state)._16PixelDispatchEnable, \ (wm_state)._32PixelDispatchEnable) +#endif + +#endif + #define brw_wm_state_has_ksp(wm_state, ksp_idx) \ (brw_wm_state_simd_width_for_ksp((wm_state), (ksp_idx)) != 0) diff --git a/src/intel/genxml/gen20.xml b/src/intel/genxml/gen20.xml index 88e3be6fa08..0cb8872b9ec 100644 --- a/src/intel/genxml/gen20.xml +++ b/src/intel/genxml/gen20.xml @@ -188,6 +188,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c index a0740b7c603..d555bff2e11 100644 --- a/src/intel/vulkan/genX_pipeline.c +++ b/src/intel/vulkan/genX_pipeline.c @@ -1575,16 +1575,20 @@ emit_3dstate_ps(struct anv_graphics_pipeline *pipeline, brw_wm_prog_data_prog_offset(wm_prog_data, ps, 0); ps.KernelStartPointer1 = fs_bin->kernel.offset + brw_wm_prog_data_prog_offset(wm_prog_data, ps, 1); +#if GFX_VER < 20 ps.KernelStartPointer2 = fs_bin->kernel.offset + brw_wm_prog_data_prog_offset(wm_prog_data, ps, 2); +#endif ps.SingleProgramFlow = false; ps.VectorMaskEnable = wm_prog_data->uses_vmask; /* Wa_1606682166 */ ps.SamplerCount = GFX_VER == 11 ? 0 : get_sampler_count(fs_bin); ps.BindingTableEntryCount = fs_bin->bind_map.surface_count; +#if GFX_VER < 20 ps.PushConstantEnable = wm_prog_data->base.nr_params > 0 || wm_prog_data->base.ubo_ranges[0].length; +#endif ps.PositionXYOffsetSelect = !wm_prog_data->uses_pos_offset ? POSOFFSET_NONE : persample ? POSOFFSET_SAMPLE : POSOFFSET_CENTROID; @@ -1595,8 +1599,10 @@ emit_3dstate_ps(struct anv_graphics_pipeline *pipeline, brw_wm_prog_data_dispatch_grf_start_reg(wm_prog_data, ps, 0); ps.DispatchGRFStartRegisterForConstantSetupData1 = brw_wm_prog_data_dispatch_grf_start_reg(wm_prog_data, ps, 1); +#if GFX_VER < 20 ps.DispatchGRFStartRegisterForConstantSetupData2 = brw_wm_prog_data_dispatch_grf_start_reg(wm_prog_data, ps, 2); +#endif #if GFX_VERx10 >= 125 ps.ScratchSpaceBuffer = diff --git a/src/intel/vulkan/genX_simple_shader.c b/src/intel/vulkan/genX_simple_shader.c index 2fd48f78571..6bce939d72a 100644 --- a/src/intel/vulkan/genX_simple_shader.c +++ b/src/intel/vulkan/genX_simple_shader.c @@ -184,22 +184,28 @@ genX(emit_simpler_shader_init_fragment)(struct anv_simple_shader *state) ps.VectorMaskEnable = prog_data->uses_vmask; ps.BindingTableEntryCount = GFX_VER == 9 ? 1 : 0; +#if GFX_VER < 20 ps.PushConstantEnable = prog_data->base.nr_params > 0 || prog_data->base.ubo_ranges[0].length; +#endif ps.DispatchGRFStartRegisterForConstantSetupData0 = brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 0); ps.DispatchGRFStartRegisterForConstantSetupData1 = brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 1); +#if GFX_VER < 20 ps.DispatchGRFStartRegisterForConstantSetupData2 = brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 2); +#endif ps.KernelStartPointer0 = state->kernel->kernel.offset + brw_wm_prog_data_prog_offset(prog_data, ps, 0); ps.KernelStartPointer1 = state->kernel->kernel.offset + brw_wm_prog_data_prog_offset(prog_data, ps, 1); +#if GFX_VER < 20 ps.KernelStartPointer2 = state->kernel->kernel.offset + brw_wm_prog_data_prog_offset(prog_data, ps, 2); +#endif ps.MaximumNumberofThreadsPerPSD = device->info->max_threads_per_psd - 1; }