diff options
author | Jason Ekstrand <[email protected]> | 2016-04-28 15:37:39 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2016-05-14 13:34:25 -0700 |
commit | bee160b31be9e09eeab83f62d26ac331f08955fa (patch) | |
tree | e0446c57d900f30d17419758c3ea3b37c24ded4a /src/intel | |
parent | 7be100ac9af52b1ab5e2c34b45aba0d66304d55a (diff) |
i965/fs: Organize prog_data by ksp number rather than SIMD width
The hardware packets organize kernel pointers and GRF start by slots that
don't map directly to dispatch width. This means that all of the state
setup code has to re-arrange the data from prog_data into these slots.
This logic has been duplicated 4 times in the GL driver and one more time
in the Vulkan driver. Let's just put it all in brw_fs.cpp.
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/intel')
-rw-r--r-- | src/intel/vulkan/anv_pipeline.c | 41 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 5 | ||||
-rw-r--r-- | src/intel/vulkan/gen7_pipeline.c | 12 | ||||
-rw-r--r-- | src/intel/vulkan/gen8_pipeline.c | 12 |
4 files changed, 21 insertions, 49 deletions
diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index f55069ee747..a8e31b13cf1 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -585,17 +585,17 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline, const struct brw_stage_prog_data *stage_prog_data; struct anv_pipeline_bind_map map; struct brw_wm_prog_key key; - uint32_t kernel = NO_KERNEL; unsigned char sha1[20]; populate_wm_prog_key(&pipeline->device->info, info, extra, &key); if (module->size > 0) { anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, spec_info); - kernel = anv_pipeline_cache_search(cache, sha1, &stage_prog_data, &map); + pipeline->ps_ksp0 = + anv_pipeline_cache_search(cache, sha1, &stage_prog_data, &map); } - if (kernel == NO_KERNEL) { + if (pipeline->ps_ksp0 == NO_KERNEL) { struct brw_wm_prog_data prog_data = { 0, }; struct anv_pipeline_binding surface_to_descriptor[256]; struct anv_pipeline_binding sampler_to_descriptor[256]; @@ -682,43 +682,16 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline, } stage_prog_data = &prog_data.base; - kernel = anv_pipeline_cache_upload_kernel(cache, - module->size > 0 ? sha1 : NULL, - shader_code, code_size, + pipeline->ps_ksp0 = + anv_pipeline_cache_upload_kernel(cache, + module->size > 0 ? sha1 : NULL, + shader_code, code_size, &stage_prog_data, sizeof(prog_data), &map); ralloc_free(mem_ctx); } - const struct brw_wm_prog_data *wm_prog_data = - (const struct brw_wm_prog_data *) stage_prog_data; - - if (wm_prog_data->no_8) - pipeline->ps_simd8 = NO_KERNEL; - else - pipeline->ps_simd8 = kernel; - - if (wm_prog_data->no_8 || wm_prog_data->prog_offset_16) { - pipeline->ps_simd16 = kernel + wm_prog_data->prog_offset_16; - } else { - pipeline->ps_simd16 = NO_KERNEL; - } - - pipeline->ps_ksp2 = 0; - pipeline->ps_grf_start2 = 0; - if (pipeline->ps_simd8 != NO_KERNEL) { - pipeline->ps_ksp0 = pipeline->ps_simd8; - pipeline->ps_grf_start0 = wm_prog_data->base.dispatch_grf_start_reg; - if (pipeline->ps_simd16 != NO_KERNEL) { - pipeline->ps_ksp2 = pipeline->ps_simd16; - pipeline->ps_grf_start2 = wm_prog_data->dispatch_grf_start_reg_16; - } - } else if (pipeline->ps_simd16 != NO_KERNEL) { - pipeline->ps_ksp0 = pipeline->ps_simd16; - pipeline->ps_grf_start0 = wm_prog_data->dispatch_grf_start_reg_16; - } - anv_pipeline_add_compiled_stage(pipeline, MESA_SHADER_FRAGMENT, stage_prog_data, &map); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index d8a21942d83..c55f1db5180 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1418,12 +1418,7 @@ struct anv_pipeline { struct anv_state blend_state; uint32_t vs_simd8; uint32_t vs_vec4; - uint32_t ps_simd8; - uint32_t ps_simd16; uint32_t ps_ksp0; - uint32_t ps_ksp2; - uint32_t ps_grf_start0; - uint32_t ps_grf_start2; uint32_t gs_kernel; uint32_t cs_simd; diff --git a/src/intel/vulkan/gen7_pipeline.c b/src/intel/vulkan/gen7_pipeline.c index d4797c59977..285b191352c 100644 --- a/src/intel/vulkan/gen7_pipeline.c +++ b/src/intel/vulkan/gen7_pipeline.c @@ -375,19 +375,21 @@ genX(graphics_pipeline_create)( POSOFFSET_SAMPLE : POSOFFSET_NONE; ps._32PixelDispatchEnable = false; - ps._16PixelDispatchEnable = pipeline->ps_simd16 != NO_KERNEL; - ps._8PixelDispatchEnable = pipeline->ps_simd8 != NO_KERNEL; + ps._16PixelDispatchEnable = wm_prog_data->dispatch_16; + ps._8PixelDispatchEnable = wm_prog_data->dispatch_8; - ps.DispatchGRFStartRegisterforConstantSetupData0 = pipeline->ps_grf_start0, + ps.DispatchGRFStartRegisterforConstantSetupData0 = + wm_prog_data->base.dispatch_grf_start_reg, ps.DispatchGRFStartRegisterforConstantSetupData1 = 0, - ps.DispatchGRFStartRegisterforConstantSetupData2 = pipeline->ps_grf_start2, + ps.DispatchGRFStartRegisterforConstantSetupData2 = + wm_prog_data->dispatch_grf_start_reg_2, /* Haswell requires the sample mask to be set in this packet as well as * in 3DSTATE_SAMPLE_MASK; the values should match. */ /* _NEW_BUFFERS, _NEW_MULTISAMPLE */ ps.KernelStartPointer1 = 0; - ps.KernelStartPointer2 = pipeline->ps_ksp2; + ps.KernelStartPointer2 = pipeline->ps_ksp0 + wm_prog_data->prog_offset_2; } /* FIXME-GEN7: This needs a lot more work, cf gen7 upload_wm_state(). */ diff --git a/src/intel/vulkan/gen8_pipeline.c b/src/intel/vulkan/gen8_pipeline.c index 857f9798111..d96669494a2 100644 --- a/src/intel/vulkan/gen8_pipeline.c +++ b/src/intel/vulkan/gen8_pipeline.c @@ -502,9 +502,9 @@ genX(graphics_pipeline_create)( anv_batch_emit(&pipeline->batch, GENX(3DSTATE_PS), ps) { ps.KernelStartPointer0 = pipeline->ps_ksp0; ps.KernelStartPointer1 = 0; - ps.KernelStartPointer2 = pipeline->ps_ksp2; - ps._8PixelDispatchEnable = pipeline->ps_simd8 != NO_KERNEL; - ps._16PixelDispatchEnable = pipeline->ps_simd16 != NO_KERNEL; + ps.KernelStartPointer2 = pipeline->ps_ksp0 + wm_prog_data->prog_offset_2; + ps._8PixelDispatchEnable = wm_prog_data->dispatch_8; + ps._16PixelDispatchEnable = wm_prog_data->dispatch_16; ps._32PixelDispatchEnable = false; ps.SingleProgramFlow = false; ps.VectorMaskEnable = true; @@ -518,9 +518,11 @@ genX(graphics_pipeline_create)( ps.ScratchSpaceBasePointer = pipeline->scratch_start[MESA_SHADER_FRAGMENT]; ps.PerThreadScratchSpace = scratch_space(&wm_prog_data->base); - ps.DispatchGRFStartRegisterForConstantSetupData0 = pipeline->ps_grf_start0; + ps.DispatchGRFStartRegisterForConstantSetupData0 = + wm_prog_data->base.dispatch_grf_start_reg; ps.DispatchGRFStartRegisterForConstantSetupData1 = 0; - ps.DispatchGRFStartRegisterForConstantSetupData2 = pipeline->ps_grf_start2; + ps.DispatchGRFStartRegisterForConstantSetupData2 = + wm_prog_data->dispatch_grf_start_reg_2; } bool per_sample_ps = pCreateInfo->pMultisampleState && |