mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-10 01:18:18 +02:00
lavapipe: Fix push_constant_size for shader objects
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39496>
This commit is contained in:
parent
327093a306
commit
a4bdc0ba0d
2 changed files with 25 additions and 16 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue