diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index 0a23f784dd7..70ae8356947 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -4414,10 +4414,10 @@ handle_shaders(struct vk_cmd_queue_entry *cmd, struct rendering_state *state) } if (stage != MESA_SHADER_COMPUTE) { - state->gfx_push_sizes[stage] = shader ? shader->layout->push_constant_size : 0; + state->gfx_push_sizes[stage] = shader ? shader->push_constant_size : 0; gfx = true; } else { - state->push_size[LVP_PIPELINE_COMPUTE] = shader ? shader->layout->push_constant_size : 0; + state->push_size[LVP_PIPELINE_COMPUTE] = shader ? shader->push_constant_size : 0; if (state->push_size[LVP_PIPELINE_COMPUTE] != state->emitted_push_size[LVP_PIPELINE_COMPUTE]) state->pcbuf_dirty[MESA_SHADER_COMPUTE] = true; } diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index 1df0ef66550..685c8ee5d3b 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -1250,6 +1250,23 @@ create_shader_object(struct lvp_device *device, const VkShaderCreateInfoEXT *pCr nir_shader *nir = NULL; mesa_shader_stage stage = vk_to_mesa_shader_stage(pCreateInfo->stage); assert(stage <= LVP_SHADER_STAGES && stage != MESA_SHADER_NONE); + + struct lvp_shader *shader = vk_object_zalloc(&device->vk, pAllocator, sizeof(struct lvp_shader), VK_OBJECT_TYPE_SHADER_EXT); + if (!shader) + goto fail; + + VkPipelineLayoutCreateInfo pci = { + VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + NULL, + 0, + pCreateInfo->setLayoutCount, + pCreateInfo->pSetLayouts, + pCreateInfo->pushConstantRangeCount, + pCreateInfo->pPushConstantRanges, + }; + shader->layout = lvp_pipeline_layout_create(device, &pci, pAllocator); + shader->push_constant_size = shader->layout->push_constant_size; + if (pCreateInfo->codeType == VK_SHADER_CODE_TYPE_SPIRV_EXT) { VkShaderModuleCreateInfo minfo = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, @@ -1300,24 +1317,13 @@ create_shader_object(struct lvp_device *device, const VkShaderCreateInfoEXT *pCr nir = nir_deserialize(NULL, device->pscreen->nir_options[stage], &blob); if (!nir) goto fail; + + shader->push_constant_size = blob_read_uint32(&blob); } if (!nir_shader_get_entrypoint(nir)) goto fail; - struct lvp_shader *shader = vk_object_zalloc(&device->vk, pAllocator, sizeof(struct lvp_shader), VK_OBJECT_TYPE_SHADER_EXT); - if (!shader) - goto fail; + blob_init(&shader->blob); - VkPipelineLayoutCreateInfo pci = { - VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, - NULL, - 0, - pCreateInfo->setLayoutCount, - pCreateInfo->pSetLayouts, - pCreateInfo->pushConstantRangeCount, - pCreateInfo->pPushConstantRanges, - }; - shader->layout = lvp_pipeline_layout_create(device, &pci, pAllocator); - shader->push_constant_size = shader->layout->push_constant_size; if (pCreateInfo->codeType == VK_SHADER_CODE_TYPE_SPIRV_EXT) lvp_shader_lower(device, nir, shader->layout, NULL); @@ -1333,6 +1339,9 @@ create_shader_object(struct lvp_device *device, const VkShaderCreateInfoEXT *pCr shader->tess_ccw_cso = lvp_shader_compile(device, shader, nir_shader_clone(NULL, shader->tess_ccw->nir), false); } nir_serialize(&shader->blob, nir, true); + + blob_write_uint32(&shader->blob, shader->push_constant_size); + shader->shader_cso = lvp_shader_compile(device, shader, nir_shader_clone(NULL, nir), false); return lvp_shader_to_handle(shader); fail: