diff --git a/src/gallium/drivers/panfrost/pan_fb_preload.c b/src/gallium/drivers/panfrost/pan_fb_preload.c index 3bb11cf1825..b69b89c6254 100644 --- a/src/gallium/drivers/panfrost/pan_fb_preload.c +++ b/src/gallium/drivers/panfrost/pan_fb_preload.c @@ -1073,10 +1073,10 @@ pan_preload_emit_dcd(struct pan_fb_preload_cache *cache, struct pan_pool *pool, maxy = fb->height - 1; } else { /* Align on 32x32 tiles */ - minx = fb->extent.minx & ~31; - miny = fb->extent.miny & ~31; - maxx = MIN2(ALIGN_POT(fb->extent.maxx + 1, 32), fb->width) - 1; - maxy = MIN2(ALIGN_POT(fb->extent.maxy + 1, 32), fb->height) - 1; + minx = fb->draw_extent.minx & ~31; + miny = fb->draw_extent.miny & ~31; + maxx = MIN2(ALIGN_POT(fb->draw_extent.maxx + 1, 32), fb->width) - 1; + maxy = MIN2(ALIGN_POT(fb->draw_extent.maxy + 1, 32), fb->height) - 1; } cfg.thread_storage = tsd; @@ -1221,9 +1221,9 @@ pan_preload_emit_pre_frame_dcd(struct pan_fb_preload_cache *cache, * write even clean tiles to make sure CRC data is updated. */ if (crc_rt >= 0) { bool *valid = fb->rts[crc_rt].crc_valid; - bool full = !fb->extent.minx && !fb->extent.miny && - fb->extent.maxx == (fb->width - 1) && - fb->extent.maxy == (fb->height - 1); + bool full = !fb->draw_extent.minx && !fb->draw_extent.miny && + fb->draw_extent.maxx == (fb->width - 1) && + fb->draw_extent.maxy == (fb->height - 1); if (full && !(*valid)) always_write = true; @@ -1241,9 +1241,9 @@ pan_preload_emit_pre_frame_dcd(struct pan_fb_preload_cache *cache, * performance. The UNUSED tag is because some PAN_ARCH variants do not * need this test. */ - UNUSED bool always = !fb->extent.minx && !fb->extent.miny && - fb->extent.maxx == (fb->width - 1) && - fb->extent.maxy == (fb->height - 1); + UNUSED bool always = !fb->draw_extent.minx && !fb->draw_extent.miny && + fb->draw_extent.maxx == (fb->width - 1) && + fb->draw_extent.maxy == (fb->height - 1); /* If we're dealing with a combined ZS resource and only one * component is cleared, we need to reload the whole surface diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index cd0713d91e0..0905209bde9 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -486,10 +486,10 @@ panfrost_batch_to_fb_info(const struct panfrost_batch *batch, fb->z_tile_buf_budget = dev->optimal_z_tib_size; fb->width = batch->key.width; fb->height = batch->key.height; - fb->extent.minx = batch->minx; - fb->extent.miny = batch->miny; - fb->extent.maxx = batch->maxx - 1; - fb->extent.maxy = batch->maxy - 1; + fb->draw_extent.minx = batch->minx; + fb->draw_extent.miny = batch->miny; + fb->draw_extent.maxx = batch->maxx - 1; + fb->draw_extent.maxy = batch->maxy - 1; fb->nr_samples = util_framebuffer_get_num_samples(&batch->key); fb->force_samples = (batch->line_smoothing == U_TRISTATE_YES) ? 16 : 0; fb->rt_count = batch->key.nr_cbufs; @@ -526,12 +526,16 @@ panfrost_batch_to_fb_info(const struct panfrost_batch *batch, * the damage region is "undefined behavior", so we should be safe. */ if (!fb->rts[i].discard) { - fb->extent.minx = MAX2(fb->extent.minx, prsrc->damage.extent.minx); - fb->extent.miny = MAX2(fb->extent.miny, prsrc->damage.extent.miny); - fb->extent.maxx = MIN2(fb->extent.maxx, prsrc->damage.extent.maxx - 1); - fb->extent.maxy = MIN2(fb->extent.maxy, prsrc->damage.extent.maxy - 1); - assert(fb->extent.minx <= fb->extent.maxx); - assert(fb->extent.miny <= fb->extent.maxy); + fb->draw_extent.minx = + MAX2(fb->draw_extent.minx, prsrc->damage.extent.minx); + fb->draw_extent.miny = + MAX2(fb->draw_extent.miny, prsrc->damage.extent.miny); + fb->draw_extent.maxx = + MIN2(fb->draw_extent.maxx, prsrc->damage.extent.maxx - 1); + fb->draw_extent.maxy = + MIN2(fb->draw_extent.maxy, prsrc->damage.extent.maxy - 1); + assert(fb->draw_extent.minx <= fb->draw_extent.maxx); + assert(fb->draw_extent.miny <= fb->draw_extent.maxy); } rts[i].format = surf->format; diff --git a/src/panfrost/lib/pan_desc.c b/src/panfrost/lib/pan_desc.c index 4215d11d8b0..b606b0d9203 100644 --- a/src/panfrost/lib/pan_desc.c +++ b/src/panfrost/lib/pan_desc.c @@ -111,9 +111,9 @@ GENX(pan_select_crc_rt)(const struct pan_fb_info *fb, unsigned tile_size) continue; bool valid = *(fb->rts[i].crc_valid); - bool full = !fb->extent.minx && !fb->extent.miny && - fb->extent.maxx == (fb->width - 1) && - fb->extent.maxy == (fb->height - 1); + bool full = !fb->draw_extent.minx && !fb->draw_extent.miny && + fb->draw_extent.maxx == (fb->width - 1) && + fb->draw_extent.maxy == (fb->height - 1); if (!full && !valid) continue; @@ -1135,9 +1135,9 @@ GENX(pan_emit_fbd)(const struct pan_fb_info *fb, unsigned layer_idx, if (crc_rt >= 0) { bool *valid = fb->rts[crc_rt].crc_valid; - bool full = !fb->extent.minx && !fb->extent.miny && - fb->extent.maxx == (fb->width - 1) && - fb->extent.maxy == (fb->height - 1); + bool full = !fb->draw_extent.minx && !fb->draw_extent.miny && + fb->draw_extent.maxx == (fb->width - 1) && + fb->draw_extent.maxy == (fb->height - 1); bool clean_tile_write = fb->rts[crc_rt].clear; #if PAN_ARCH >= 6 @@ -1386,10 +1386,10 @@ GENX(pan_emit_fragment_job_payload)(const struct pan_fb_info *fb, uint64_t fbd, void *out) { pan_section_pack(out, FRAGMENT_JOB, PAYLOAD, payload) { - payload.bound_min_x = fb->extent.minx >> MALI_TILE_SHIFT; - payload.bound_min_y = fb->extent.miny >> MALI_TILE_SHIFT; - payload.bound_max_x = fb->extent.maxx >> MALI_TILE_SHIFT; - payload.bound_max_y = fb->extent.maxy >> MALI_TILE_SHIFT; + payload.bound_min_x = fb->draw_extent.minx >> MALI_TILE_SHIFT; + payload.bound_min_y = fb->draw_extent.miny >> MALI_TILE_SHIFT; + payload.bound_max_x = fb->draw_extent.maxx >> MALI_TILE_SHIFT; + payload.bound_max_y = fb->draw_extent.maxy >> MALI_TILE_SHIFT; payload.framebuffer = fbd; #if PAN_ARCH >= 5 diff --git a/src/panfrost/lib/pan_desc.h b/src/panfrost/lib/pan_desc.h index 75b62d62b03..5cf3946b8e0 100644 --- a/src/panfrost/lib/pan_desc.h +++ b/src/panfrost/lib/pan_desc.h @@ -131,10 +131,11 @@ struct pan_fb_bifrost_info { struct pan_fb_info { unsigned width, height; + /* Draw-extent controlled by viewports/scissors. */ struct { - /* Max values are inclusive */ + /* Max values are exclusive */ unsigned minx, miny, maxx, maxy; - } extent; + } draw_extent; unsigned nr_samples; unsigned force_samples; /* samples used for rasterization */ unsigned rt_count; diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 9d3a1c3d2d2..c65af770edf 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -3075,9 +3075,9 @@ issue_fragment_jobs(struct panvk_cmd_buffer *cmdbuf) /* Now initialize the fragment bits. */ cs_update_frag_ctx(b) { cs_move32_to(b, cs_sr_reg32(b, FRAGMENT, BBOX_MIN), - (fbinfo->extent.miny << 16) | fbinfo->extent.minx); + (fbinfo->draw_extent.miny << 16) | fbinfo->draw_extent.minx); cs_move32_to(b, cs_sr_reg32(b, FRAGMENT, BBOX_MAX), - (fbinfo->extent.maxy << 16) | fbinfo->extent.maxx); + (fbinfo->draw_extent.maxy << 16) | fbinfo->draw_extent.maxx); } bool simul_use = diff --git a/src/panfrost/vulkan/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/panvk_vX_cmd_draw.c index d66a41a16e8..5d48b5529b2 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_draw.c @@ -336,19 +336,19 @@ panvk_per_arch(cmd_init_render_state)(struct panvk_cmd_buffer *cmdbuf, } } - fbinfo->extent.minx = pRenderingInfo->renderArea.offset.x; - fbinfo->extent.maxx = pRenderingInfo->renderArea.offset.x + - pRenderingInfo->renderArea.extent.width - 1; - fbinfo->extent.miny = pRenderingInfo->renderArea.offset.y; - fbinfo->extent.maxy = pRenderingInfo->renderArea.offset.y + - pRenderingInfo->renderArea.extent.height - 1; + fbinfo->draw_extent.minx = pRenderingInfo->renderArea.offset.x; + fbinfo->draw_extent.maxx = pRenderingInfo->renderArea.offset.x + + pRenderingInfo->renderArea.extent.width - 1; + fbinfo->draw_extent.miny = pRenderingInfo->renderArea.offset.y; + fbinfo->draw_extent.maxy = pRenderingInfo->renderArea.offset.y + + pRenderingInfo->renderArea.extent.height - 1; if (state->render.bound_attachments) { fbinfo->width = att_width; fbinfo->height = att_height; } else { - fbinfo->width = fbinfo->extent.maxx + 1; - fbinfo->height = fbinfo->extent.maxy + 1; + fbinfo->width = fbinfo->draw_extent.maxx + 1; + fbinfo->height = fbinfo->draw_extent.maxy + 1; } assert(fbinfo->width && fbinfo->height); @@ -467,10 +467,12 @@ panvk_per_arch(cmd_resolve_attachments)(struct panvk_cmd_buffer *cmdbuf) .sType = VK_STRUCTURE_TYPE_RENDERING_INFO, .renderArea = { - .offset.x = fbinfo->extent.minx, - .offset.y = fbinfo->extent.miny, - .extent.width = fbinfo->extent.maxx - fbinfo->extent.minx + 1, - .extent.height = fbinfo->extent.maxy - fbinfo->extent.miny + 1, + .offset.x = fbinfo->draw_extent.minx, + .offset.y = fbinfo->draw_extent.miny, + .extent.width = + fbinfo->draw_extent.maxx - fbinfo->draw_extent.minx + 1, + .extent.height = + fbinfo->draw_extent.maxy - fbinfo->draw_extent.miny + 1, }, .layerCount = cmdbuf->state.gfx.render.layer_count, .viewMask = cmdbuf->state.gfx.render.view_mask, @@ -610,11 +612,12 @@ panvk_per_arch(cmd_preload_render_area_border)( struct pan_fb_info *fbinfo = &state->render.fb.info; bool render_area_is_aligned = - ((fbinfo->extent.minx | fbinfo->extent.miny) % meta_tile_size) == 0 && - (fbinfo->extent.maxx + 1 == fbinfo->width || - (fbinfo->extent.maxx % meta_tile_size) == (meta_tile_size - 1)) && - (fbinfo->extent.maxy + 1 == fbinfo->height || - (fbinfo->extent.maxy % meta_tile_size) == (meta_tile_size - 1)); + ((fbinfo->draw_extent.minx | fbinfo->draw_extent.miny) % + meta_tile_size) == 0 && + (fbinfo->draw_extent.maxx + 1 == fbinfo->width || + (fbinfo->draw_extent.maxx % meta_tile_size) == (meta_tile_size - 1)) && + (fbinfo->draw_extent.maxy + 1 == fbinfo->height || + (fbinfo->draw_extent.maxy % meta_tile_size) == (meta_tile_size - 1)); /* If the render area is aligned on the meta tile size, we're good. */ if (!render_area_is_aligned) diff --git a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c index 5f110a77def..50c339f5a17 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c @@ -382,10 +382,10 @@ cmd_emit_dcd(struct panvk_cmd_buffer *cmdbuf, struct pan_fb_info *fbinfo, uint16_t minx = 0, miny = 0, maxx, maxy; /* Align on 32x32 tiles */ - minx = fbinfo->extent.minx & ~31; - miny = fbinfo->extent.miny & ~31; - maxx = MIN2(ALIGN_POT(fbinfo->extent.maxx + 1, 32), fbinfo->width) - 1; - maxy = MIN2(ALIGN_POT(fbinfo->extent.maxy + 1, 32), fbinfo->height) - 1; + minx = fbinfo->draw_extent.minx & ~31; + miny = fbinfo->draw_extent.miny & ~31; + maxx = MIN2(ALIGN_POT(fbinfo->draw_extent.maxx + 1, 32), fbinfo->width) - 1; + maxy = MIN2(ALIGN_POT(fbinfo->draw_extent.maxy + 1, 32), fbinfo->height) - 1; struct pan_ptr vpd = panvk_cmd_alloc_desc(cmdbuf, VIEWPORT); if (!vpd.cpu) @@ -486,9 +486,9 @@ cmd_emit_dcd(struct panvk_cmd_buffer *cmdbuf, struct pan_fb_info *fbinfo, * screen rectangle will always intersect, this won't affect * performance. */ - bool always = !fbinfo->extent.minx && !fbinfo->extent.miny && - fbinfo->extent.maxx == (fbinfo->width - 1) && - fbinfo->extent.maxy == (fbinfo->height - 1); + bool always = !fbinfo->draw_extent.minx && !fbinfo->draw_extent.miny && + fbinfo->draw_extent.maxx == (fbinfo->width - 1) && + fbinfo->draw_extent.maxy == (fbinfo->height - 1); /* If we're dealing with a combined ZS resource and only one * component is cleared, we need to reload the whole surface