{
struct sysval_uniform *uniforms = ptr_cpu;
- for (unsigned i = 0; i < ss->info.sysvals.sysval_count; ++i) {
- int sysval = ss->info.sysvals.sysvals[i];
+ for (unsigned i = 0; i < ss->sysvals.sysval_count; ++i) {
+ int sysval = ss->sysvals.sysvals[i];
switch (PAN_SYSVAL_TYPE(sysval)) {
case PAN_SYSVAL_VIEWPORT_SCALE:
return 0;
/* Allocate room for the sysval and the uniforms */
- size_t sys_size = sizeof(float) * 4 * ss->info.sysvals.sysval_count;
+ size_t sys_size = sizeof(float) * 4 * ss->sysvals.sysval_count;
struct panfrost_ptr transfer =
pan_pool_alloc_aligned(&batch->pool.base, sys_size, 16);
unsigned sysval_idx = src.offset / 16;
unsigned sysval_comp = (src.offset % 16) / 4;
unsigned sysval_type =
- PAN_SYSVAL_TYPE(ss->info.sysvals.sysvals[sysval_idx]);
+ PAN_SYSVAL_TYPE(ss->sysvals.sysvals[sysval_idx]);
mali_ptr ptr = push_transfer.gpu + (4 * i);
if (sysval_type == PAN_SYSVAL_NUM_WORK_GROUPS)
uint32_t partial_rsd[RSD_WORDS];
struct pan_shader_info info;
+ struct panfrost_sysvals sysvals;
struct pan_earlyzs_lut earlyzs;
struct panfrost_shader_binary {
/* Collected information about the compiled shader */
struct pan_shader_info info;
+ struct panfrost_sysvals sysvals;
/* The binary itself */
struct util_dynarray binary;
* 1. Size of program binary
* 2. Program binary
* 3. Shader info
+ * 4. System values
*/
blob_write_uint32(&blob, binary->binary.size);
blob_write_bytes(&blob, binary->binary.data, binary->binary.size);
blob_write_bytes(&blob, &binary->info, sizeof(binary->info));
+ blob_write_bytes(&blob, &binary->sysvals, sizeof(binary->sysvals));
disk_cache_put(cache, cache_key, blob.data, blob.size, NULL);
blob_finish(&blob);
blob_copy_bytes(&blob, ptr, binary_size);
blob_copy_bytes(&blob, &binary->info, sizeof(binary->info));
+ blob_copy_bytes(&blob, &binary->sysvals, sizeof(binary->sysvals));
free(buffer);
unsigned dirty = 0;
unsigned dirty_shader = PAN_DIRTY_STAGE_SHADER | PAN_DIRTY_STAGE_CONST;
- for (unsigned i = 0; i < ss->info.sysvals.sysval_count; ++i) {
- switch (PAN_SYSVAL_TYPE(ss->info.sysvals.sysvals[i])) {
+ for (unsigned i = 0; i < ss->sysvals.sysval_count; ++i) {
+ switch (PAN_SYSVAL_TYPE(ss->sysvals.sysvals[i])) {
case PAN_SYSVAL_VIEWPORT_SCALE:
case PAN_SYSVAL_VIEWPORT_OFFSET:
dirty |= PAN_DIRTY_VIEWPORT;
dev->gpu_id < 0x700);
}
- struct panfrost_sysvals sysvals = {0};
- NIR_PASS_V(s, panfrost_nir_lower_sysvals, &sysvals);
+ NIR_PASS_V(s, panfrost_nir_lower_sysvals, &out->sysvals);
screen->vtbl.compile_shader(s, &inputs, &out->binary, &out->info);
- out->info.sysvals = sysvals;
assert(req_local_mem >= out->info.wls_size);
out->info.wls_size = req_local_mem;
}
state->info = res.info;
+ state->sysvals = res.sysvals;
if (res.binary.size) {
state->bin = panfrost_pool_take_ref(
GENX(pan_shader_compile)(nir, &inputs, &variant->binary, &info);
- /* Blend shaders can't have sysvals */
- assert(info.sysvals.sysval_count == 0);
-
variant->work_reg_count = info.work_reg_count;
#if PAN_ARCH <= 5
GENX(pan_shader_compile)(b.shader, &inputs, &binary, &shader->info);
- /* Blit shaders shouldn't have sysvals */
- assert(shader->info.sysvals.sysval_count == 0);
-
shader->key = *key;
shader->address =
pan_pool_upload_aligned(dev->blitter.shaders.pool, binary.data,
assert(!shader_info.tls_size);
assert(!shader_info.wls_size);
- assert(!shader_info.sysvals.sysval_count);
shader_info.push.count =
DIV_ROUND_UP(sizeof(struct pan_indirect_dispatch_info), 4);
struct pan_shader_varying output[PAN_MAX_VARYINGS];
} varyings;
- struct panfrost_sysvals sysvals;
-
/* UBOs to push to Register Mapped Uniforms (Midgard) or Fast Access
* Uniforms (Bifrost) */
struct panfrost_ubo_push push;
struct {
unsigned ubo_idx;
- struct panfrost_sysvals ids;
} sysvals[MESA_SHADER_STAGES];
unsigned tls_size;
{
const struct panvk_shader *shader = builder->shaders[stage];
- pipeline->sysvals[stage].ids = shader->info.sysvals;
pipeline->sysvals[stage].ubo_idx = shader->sysval_ubo;
}