nak: Refactor shader upload math

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27156>
This commit is contained in:
Faith Ekstrand
2024-01-18 14:49:51 -06:00
committed by Marge Bot
parent 148971f232
commit 0bc02eee4b
2 changed files with 17 additions and 9 deletions

View File

@@ -501,23 +501,31 @@ nvk_shader_upload(struct nvk_device *dev, struct nvk_shader *shader)
* Kepler+ needs the first instruction to be 0x80 aligned, so we waste 0x30 bytes
*/
int alignment = dev->pdev->info.cls_eng3d >= KEPLER_A ? 0x80 : 0x40;
int offset = 0;
uint32_t total_size = 0;
if (dev->pdev->info.cls_eng3d >= KEPLER_A &&
dev->pdev->info.cls_eng3d < TURING_A &&
hdr_size > 0) {
/* offset will be 0x30 */
offset = alignment - hdr_size;
/* The instructions are what has to be aligned so we need to start at a
* small offset (0x30 B) into the upload area.
*/
total_size = alignment - hdr_size;
}
uint32_t total_size = shader->code_size + hdr_size + offset;
const uint32_t hdr_offset = total_size;
total_size += hdr_size;
const uint32_t code_offset = total_size;
assert(code_offset % alignment == 0);
total_size += shader->code_size;
char *data = malloc(total_size);
if (data == NULL)
return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
assert(hdr_size <= sizeof(shader->info.hdr));
memcpy(data + offset, shader->info.hdr, hdr_size);
memcpy(data + offset + hdr_size, shader->code_ptr, shader->code_size);
memcpy(data + hdr_offset, shader->info.hdr, hdr_size);
memcpy(data + code_offset, shader->code_ptr, shader->code_size);
#ifndef NDEBUG
if (debug_get_bool_option("NV50_PROG_DEBUG", false))
@@ -528,7 +536,7 @@ nvk_shader_upload(struct nvk_device *dev, struct nvk_shader *shader)
total_size, alignment, &shader->upload_addr);
if (result == VK_SUCCESS) {
shader->upload_size = total_size;
shader->upload_padding = offset;
shader->hdr_offset = hdr_offset;
}
free(data);

View File

@@ -66,13 +66,13 @@ struct nvk_shader {
uint32_t upload_size;
uint64_t upload_addr;
uint32_t upload_padding;
uint32_t hdr_offset;
};
static inline uint64_t
nvk_shader_address(const struct nvk_shader *shader)
{
return shader->upload_addr + shader->upload_padding;
return shader->upload_addr + shader->hdr_offset;
}
static inline bool