gen7_compute_urb_partition(struct anv_pipeline *pipeline)
{
const struct brw_device_info *devinfo = &pipeline->device->info;
- unsigned vs_size = pipeline->vs_prog_data.base.urb_entry_size;
+ bool vs_present = pipeline->vs_simd8 != NO_KERNEL;
+ unsigned vs_size = vs_present ? pipeline->vs_prog_data.base.urb_entry_size : 1;
unsigned vs_entry_size_bytes = vs_size * 64;
bool gs_present = pipeline->gs_vec4 != NO_KERNEL;
unsigned gs_size = gs_present ? pipeline->gs_prog_data.base.urb_entry_size : 1;
fail_if(program == NULL || program->Shaders == NULL,
"failed to create program\n");
- /* FIXME: Only supports vs and fs combo at the moment */
- assert(pipeline->shaders[VK_SHADER_STAGE_VERTEX]);
- assert(pipeline->shaders[VK_SHADER_STAGE_FRAGMENT]);
-
- anv_compile_shader(compiler, program, pipeline, VK_SHADER_STAGE_VERTEX);
+ if (pipeline->shaders[VK_SHADER_STAGE_VERTEX])
+ anv_compile_shader(compiler, program, pipeline, VK_SHADER_STAGE_VERTEX);
anv_compile_shader(compiler, program, pipeline, VK_SHADER_STAGE_FRAGMENT);
if (pipeline->shaders[VK_SHADER_STAGE_GEOMETRY])
anv_compile_shader(compiler, program, pipeline, VK_SHADER_STAGE_GEOMETRY);
success = really_do_wm_prog(brw, program, bfp, &wm_key, pipeline);
fail_if(!success, "do_wm_prog failed\n");
pipeline->prog_data[VK_SHADER_STAGE_FRAGMENT] = &pipeline->wm_prog_data.base;
+ pipeline->active_stages = VK_SHADER_STAGE_FRAGMENT_BIT;
- struct brw_vs_prog_key vs_key;
- struct gl_vertex_program *vp = (struct gl_vertex_program *)
- program->_LinkedShaders[MESA_SHADER_VERTEX]->Program;
- struct brw_vertex_program *bvp = brw_vertex_program(vp);
+ if (pipeline->shaders[VK_SHADER_STAGE_VERTEX]) {
+ struct brw_vs_prog_key vs_key;
+ struct gl_vertex_program *vp = (struct gl_vertex_program *)
+ program->_LinkedShaders[MESA_SHADER_VERTEX]->Program;
+ struct brw_vertex_program *bvp = brw_vertex_program(vp);
- brw_vs_populate_key(brw, bvp, &vs_key);
+ brw_vs_populate_key(brw, bvp, &vs_key);
+
+ success = really_do_vs_prog(brw, program, bvp, &vs_key, pipeline);
+ fail_if(!success, "do_wm_prog failed\n");
+ pipeline->prog_data[VK_SHADER_STAGE_VERTEX] = &pipeline->vs_prog_data.base.base;
+ pipeline->active_stages |= VK_SHADER_STAGE_VERTEX_BIT;;
+ } else {
+ pipeline->vs_simd8 = NO_KERNEL;
+ }
- success = really_do_vs_prog(brw, program, bvp, &vs_key, pipeline);
- fail_if(!success, "do_wm_prog failed\n");
- pipeline->prog_data[VK_SHADER_STAGE_VERTEX] = &pipeline->vs_prog_data.base.base;
if (pipeline->shaders[VK_SHADER_STAGE_GEOMETRY]) {
struct brw_gs_prog_key gs_key;
success = really_do_gs_prog(brw, program, bgp, &gs_key, pipeline);
fail_if(!success, "do_gs_prog failed\n");
- pipeline->active_stages = VK_SHADER_STAGE_VERTEX_BIT |
- VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_FRAGMENT_BIT;
+ pipeline->active_stages |= VK_SHADER_STAGE_GEOMETRY_BIT;
pipeline->prog_data[VK_SHADER_STAGE_GEOMETRY] = &pipeline->gs_prog_data.base.base;
-
} else {
pipeline->gs_vec4 = NO_KERNEL;
- pipeline->active_stages =
- VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT;
}
anv_compiler_run(device->compiler, pipeline);
+ /* FIXME: The compiler dead-codes FS inputs when we don't have a VS, so we
+ * hard code this to num_attributes - 2. This is because the attributes
+ * include VUE header and position, which aren't counted as varying
+ * inputs. */
+ if (pipeline->vs_simd8 == NO_KERNEL)
+ pipeline->wm_prog_data.num_varying_inputs = vi_info->attributeCount - 2;
+
emit_vertex_input(pipeline, vi_info);
emit_ia_state(pipeline, ia_info);
emit_rs_state(pipeline, rs_info);
offset = 1;
length = (vue_prog_data->vue_map.num_slots + 1) / 2 - offset;
- anv_batch_emit(&pipeline->batch, GEN8_3DSTATE_VS,
- .KernelStartPointer = pipeline->vs_simd8,
- .SingleVertexDispatch = Multiple,
- .VectorMaskEnable = Dmask,
- .SamplerCount = 0,
- .BindingTableEntryCount =
+ if (pipeline->vs_simd8 == NO_KERNEL)
+ anv_batch_emit(&pipeline->batch, GEN8_3DSTATE_VS,
+ .FunctionEnable = false,
+ .VertexURBEntryOutputReadOffset = 1,
+ /* Even if VS is disabled, SBE still gets the amount of
+ * vertex data to read from this field. We use attribute
+ * count - 1, as we don't count the VUE header here. */
+ .VertexURBEntryOutputLength =
+ DIV_ROUND_UP(vi_info->attributeCount - 1, 2));
+ else
+ anv_batch_emit(&pipeline->batch, GEN8_3DSTATE_VS,
+ .KernelStartPointer = pipeline->vs_simd8,
+ .SingleVertexDispatch = Multiple,
+ .VectorMaskEnable = Dmask,
+ .SamplerCount = 0,
+ .BindingTableEntryCount =
vue_prog_data->base.binding_table.size_bytes / 4,
- .ThreadDispatchPriority = Normal,
- .FloatingPointMode = IEEE754,
- .IllegalOpcodeExceptionEnable = false,
- .AccessesUAV = false,
- .SoftwareExceptionEnable = false,
-
- /* FIXME: pointer needs to be assigned outside as it aliases
- * PerThreadScratchSpace.
- */
- .ScratchSpaceBasePointer = 0,
- .PerThreadScratchSpace = 0,
+ .ThreadDispatchPriority = Normal,
+ .FloatingPointMode = IEEE754,
+ .IllegalOpcodeExceptionEnable = false,
+ .AccessesUAV = false,
+ .SoftwareExceptionEnable = false,
+
+ /* FIXME: pointer needs to be assigned outside as it aliases
+ * PerThreadScratchSpace.
+ */
+ .ScratchSpaceBasePointer = 0,
+ .PerThreadScratchSpace = 0,
- .DispatchGRFStartRegisterForURBData =
+ .DispatchGRFStartRegisterForURBData =
vue_prog_data->base.dispatch_grf_start_reg,
- .VertexURBEntryReadLength = vue_prog_data->urb_read_length,
- .VertexURBEntryReadOffset = 0,
-
- .MaximumNumberofThreads = device->info.max_vs_threads - 1,
- .StatisticsEnable = false,
- .SIMD8DispatchEnable = true,
- .VertexCacheDisable = ia_info->disableVertexReuse,
- .FunctionEnable = true,
-
- .VertexURBEntryOutputReadOffset = offset,
- .VertexURBEntryOutputLength = length,
- .UserClipDistanceClipTestEnableBitmask = 0,
- .UserClipDistanceCullTestEnableBitmask = 0);
+ .VertexURBEntryReadLength = vue_prog_data->urb_read_length,
+ .VertexURBEntryReadOffset = 0,
+
+ .MaximumNumberofThreads = device->info.max_vs_threads - 1,
+ .StatisticsEnable = false,
+ .SIMD8DispatchEnable = true,
+ .VertexCacheDisable = ia_info->disableVertexReuse,
+ .FunctionEnable = true,
+
+ .VertexURBEntryOutputReadOffset = offset,
+ .VertexURBEntryOutputLength = length,
+ .UserClipDistanceClipTestEnableBitmask = 0,
+ .UserClipDistanceCullTestEnableBitmask = 0);
const struct brw_wm_prog_data *wm_prog_data = &pipeline->wm_prog_data;
uint32_t ksp0, ksp2, grf_start0, grf_start2;