mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-08 02:00:21 +01:00
ilo: precalculate aligned depth buffer size
To replace the hacky zs_align_surface(). Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
This commit is contained in:
parent
343b014b57
commit
2b4c8ffc30
7 changed files with 43 additions and 48 deletions
|
|
@ -31,7 +31,7 @@
|
|||
#include "ilo_builder_3d_top.h" /* for ve_init_cso_with_components() */
|
||||
#include "ilo_draw.h"
|
||||
#include "ilo_state.h"
|
||||
#include "ilo_state_gen.h" /* for zs_align_surface() */
|
||||
#include "ilo_state_gen.h"
|
||||
#include "ilo_blit.h"
|
||||
#include "ilo_blitter.h"
|
||||
|
||||
|
|
@ -254,10 +254,6 @@ hiz_align_fb(struct ilo_blitter *blitter)
|
|||
if (blitter->fb.width % align_w || blitter->fb.height % align_h) {
|
||||
blitter->fb.width = align(blitter->fb.width, align_w);
|
||||
blitter->fb.height = align(blitter->fb.height, align_h);
|
||||
|
||||
assert(!blitter->fb.dst.is_rt);
|
||||
zs_align_surface(blitter->ilo->dev, align_w, align_h,
|
||||
&blitter->fb.dst.u.zs);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -747,7 +747,8 @@ gen6_3DSTATE_AA_LINE_PARAMETERS(struct ilo_builder *builder)
|
|||
|
||||
static inline void
|
||||
gen6_3DSTATE_DEPTH_BUFFER(struct ilo_builder *builder,
|
||||
const struct ilo_zs_surface *zs)
|
||||
const struct ilo_zs_surface *zs,
|
||||
bool aligned_8x4)
|
||||
{
|
||||
const uint32_t cmd = (ilo_dev_gen(builder->dev) >= ILO_GEN(7)) ?
|
||||
GEN7_RENDER_CMD(3D, 3DSTATE_DEPTH_BUFFER) :
|
||||
|
|
@ -762,7 +763,7 @@ gen6_3DSTATE_DEPTH_BUFFER(struct ilo_builder *builder,
|
|||
|
||||
dw[0] = cmd | (cmd_len - 2);
|
||||
dw[1] = zs->payload[0];
|
||||
dw[3] = zs->payload[2];
|
||||
dw[3] = (aligned_8x4) ? zs->dw_aligned_8x4 : zs->payload[2];
|
||||
dw[4] = zs->payload[3];
|
||||
dw[5] = zs->payload[4];
|
||||
dw[6] = zs->payload[5];
|
||||
|
|
|
|||
|
|
@ -788,7 +788,7 @@ gen6_draw_wm_depth(struct ilo_render *r,
|
|||
gen6_wa_pre_depth(r);
|
||||
}
|
||||
|
||||
gen6_3DSTATE_DEPTH_BUFFER(r->builder, zs);
|
||||
gen6_3DSTATE_DEPTH_BUFFER(r->builder, zs, false);
|
||||
gen6_3DSTATE_HIER_DEPTH_BUFFER(r->builder, zs);
|
||||
gen6_3DSTATE_STENCIL_BUFFER(r->builder, zs);
|
||||
gen6_3DSTATE_CLEAR_PARAMS(r->builder, clear_params);
|
||||
|
|
@ -919,7 +919,7 @@ gen6_rectlist_wm_depth(struct ilo_render *r,
|
|||
if (blitter->uses & (ILO_BLITTER_USE_FB_DEPTH |
|
||||
ILO_BLITTER_USE_FB_STENCIL)) {
|
||||
gen6_3DSTATE_DEPTH_BUFFER(r->builder,
|
||||
&blitter->fb.dst.u.zs);
|
||||
&blitter->fb.dst.u.zs, true);
|
||||
}
|
||||
|
||||
if (blitter->uses & ILO_BLITTER_USE_FB_DEPTH) {
|
||||
|
|
|
|||
|
|
@ -602,7 +602,7 @@ gen7_draw_wm(struct ilo_render *r,
|
|||
clear_params = 0;
|
||||
}
|
||||
|
||||
gen6_3DSTATE_DEPTH_BUFFER(r->builder, zs);
|
||||
gen6_3DSTATE_DEPTH_BUFFER(r->builder, zs, false);
|
||||
gen6_3DSTATE_HIER_DEPTH_BUFFER(r->builder, zs);
|
||||
gen6_3DSTATE_STENCIL_BUFFER(r->builder, zs);
|
||||
gen7_3DSTATE_CLEAR_PARAMS(r->builder, clear_params);
|
||||
|
|
@ -789,7 +789,7 @@ gen7_rectlist_wm_depth(struct ilo_render *r,
|
|||
if (blitter->uses & (ILO_BLITTER_USE_FB_DEPTH |
|
||||
ILO_BLITTER_USE_FB_STENCIL)) {
|
||||
gen6_3DSTATE_DEPTH_BUFFER(r->builder,
|
||||
&blitter->fb.dst.u.zs);
|
||||
&blitter->fb.dst.u.zs, true);
|
||||
}
|
||||
|
||||
if (blitter->uses & ILO_BLITTER_USE_FB_DEPTH) {
|
||||
|
|
|
|||
|
|
@ -335,6 +335,8 @@ struct ilo_surface_cso {
|
|||
struct ilo_view_surface rt;
|
||||
struct ilo_zs_surface {
|
||||
uint32_t payload[10];
|
||||
uint32_t dw_aligned_8x4;
|
||||
|
||||
struct intel_bo *bo;
|
||||
struct intel_bo *hiz_bo;
|
||||
struct intel_bo *separate_s8_bo;
|
||||
|
|
|
|||
|
|
@ -80,41 +80,6 @@ ilo_gpe_gen6_translate_texture(enum pipe_texture_target target)
|
|||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
zs_align_surface(const struct ilo_dev_info *dev,
|
||||
unsigned align_w, unsigned align_h,
|
||||
struct ilo_zs_surface *zs)
|
||||
{
|
||||
unsigned mask, shift_w, shift_h;
|
||||
unsigned width, height;
|
||||
uint32_t dw3;
|
||||
|
||||
ILO_DEV_ASSERT(dev, 6, 7.5);
|
||||
|
||||
if (ilo_dev_gen(dev) >= ILO_GEN(7)) {
|
||||
shift_w = 4;
|
||||
shift_h = 18;
|
||||
mask = 0x3fff;
|
||||
}
|
||||
else {
|
||||
shift_w = 6;
|
||||
shift_h = 19;
|
||||
mask = 0x1fff;
|
||||
}
|
||||
|
||||
dw3 = zs->payload[2];
|
||||
|
||||
/* aligned width and height */
|
||||
width = align(((dw3 >> shift_w) & mask) + 1, align_w);
|
||||
height = align(((dw3 >> shift_h) & mask) + 1, align_h);
|
||||
|
||||
dw3 = (dw3 & ~((mask << shift_w) | (mask << shift_h))) |
|
||||
(width - 1) << shift_w |
|
||||
(height - 1) << shift_h;
|
||||
|
||||
zs->payload[2] = dw3;
|
||||
}
|
||||
|
||||
void
|
||||
ilo_gpe_init_ve(const struct ilo_dev_info *dev,
|
||||
unsigned num_states,
|
||||
|
|
|
|||
|
|
@ -1140,13 +1140,35 @@ ilo_gpe_init_zs_surface(const struct ilo_dev_info *dev,
|
|||
const int max_array_size = (ilo_dev_gen(dev) >= ILO_GEN(7)) ? 2048 : 512;
|
||||
struct ilo_zs_surface_info info;
|
||||
uint32_t dw1, dw2, dw3, dw4, dw5, dw6;
|
||||
int align_w = 8, align_h = 4;
|
||||
|
||||
ILO_DEV_ASSERT(dev, 6, 7.5);
|
||||
|
||||
if (tex)
|
||||
if (tex) {
|
||||
zs_init_info(dev, tex, format, level, first_layer, num_layers, &info);
|
||||
else
|
||||
|
||||
switch (tex->base.nr_samples) {
|
||||
case 2:
|
||||
align_w /= 2;
|
||||
break;
|
||||
case 4:
|
||||
align_w /= 2;
|
||||
align_h /= 2;
|
||||
break;
|
||||
case 8:
|
||||
align_w /= 4;
|
||||
align_h /= 2;
|
||||
break;
|
||||
case 16:
|
||||
align_w /= 4;
|
||||
align_h /= 4;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
zs_init_info_null(dev, &info);
|
||||
}
|
||||
|
||||
switch (info.surface_type) {
|
||||
case GEN6_SURFTYPE_NULL:
|
||||
|
|
@ -1209,6 +1231,10 @@ ilo_gpe_init_zs_surface(const struct ilo_dev_info *dev,
|
|||
(info.width - 1) << 4 |
|
||||
info.lod;
|
||||
|
||||
zs->dw_aligned_8x4 = (align(info.height, align_h) - 1) << 18 |
|
||||
(align(info.width, align_w) - 1) << 4 |
|
||||
info.lod;
|
||||
|
||||
dw4 = (info.depth - 1) << 21 |
|
||||
info.first_layer << 10;
|
||||
|
||||
|
|
@ -1231,6 +1257,11 @@ ilo_gpe_init_zs_surface(const struct ilo_dev_info *dev,
|
|||
info.lod << 2 |
|
||||
GEN6_DEPTH_DW3_MIPLAYOUT_BELOW;
|
||||
|
||||
zs->dw_aligned_8x4 = (align(info.height, align_h) - 1) << 19 |
|
||||
(align(info.width, align_w) - 1) << 6 |
|
||||
info.lod << 2 |
|
||||
GEN6_DEPTH_DW3_MIPLAYOUT_BELOW;
|
||||
|
||||
dw4 = (info.depth - 1) << 21 |
|
||||
info.first_layer << 10 |
|
||||
(info.num_layers - 1) << 1;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue