lavapipe: Fix push_constant_size for shader objects

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39496>
This commit is contained in:
Konstantin 2026-04-11 14:37:10 +02:00 committed by Marge Bot
parent 327093a306
commit a4bdc0ba0d
2 changed files with 25 additions and 16 deletions

View file

@ -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;
}

View file

@ -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: