summaryrefslogtreecommitdiffstats
path: root/src/intel
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-08-25 17:08:04 -0500
committerAndres Gomez <[email protected]>2018-08-27 09:55:58 +0300
commit0207765ab2d3b484e2a0fcaf071b2fd607f54444 (patch)
treebe06f0b4be09c85f2a4146014eb0632488b9a270 /src/intel
parentf6dccf66865c31b13f48b50891a9f5a0d9949b1c (diff)
anv: Fill holes in the VF VUE to zero
This fixes a GPU hang in DOOM 2016 running under wine. Cc: [email protected] Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104809 Reviewed-by: Lionel Landwerlin <[email protected]> (cherry picked from commit 76b0e4d8c9d3cd8af0b665cec88bded7a61e8ad6)
Diffstat (limited to 'src/intel')
-rw-r--r--src/intel/vulkan/genX_pipeline.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c
index ec47360764c..8817c383017 100644
--- a/src/intel/vulkan/genX_pipeline.c
+++ b/src/intel/vulkan/genX_pipeline.c
@@ -115,7 +115,34 @@ emit_vertex_input(struct anv_pipeline *pipeline,
GENX(3DSTATE_VERTEX_ELEMENTS));
if (!p)
return;
- memset(p + 1, 0, (num_dwords - 1) * 4);
+
+ for (uint32_t i = 0; i < total_elems; i++) {
+ /* The SKL docs for VERTEX_ELEMENT_STATE say:
+ *
+ * "All elements must be valid from Element[0] to the last valid
+ * element. (I.e. if Element[2] is valid then Element[1] and
+ * Element[0] must also be valid)."
+ *
+ * The SKL docs for 3D_Vertex_Component_Control say:
+ *
+ * "Don't store this component. (Not valid for Component 0, but can
+ * be used for Component 1-3)."
+ *
+ * So we can't just leave a vertex element blank and hope for the best.
+ * We have to tell the VF hardware to put something in it; so we just
+ * store a bunch of zero.
+ *
+ * TODO: Compact vertex elements so we never end up with holes.
+ */
+ struct GENX(VERTEX_ELEMENT_STATE) element = {
+ .Valid = true,
+ .Component0Control = VFCOMP_STORE_0,
+ .Component1Control = VFCOMP_STORE_0,
+ .Component2Control = VFCOMP_STORE_0,
+ .Component3Control = VFCOMP_STORE_0,
+ };
+ GENX(VERTEX_ELEMENT_STATE_pack)(NULL, &p[1 + i * 2], &element);
+ }
for (uint32_t i = 0; i < info->vertexAttributeDescriptionCount; i++) {
const VkVertexInputAttributeDescription *desc =