X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgallium%2Fdrivers%2Ffreedreno%2Ffreedreno_resource.h;h=b0ec7553392c3e0996c2b24fc38265c386840499;hb=832010f6acdc9a55ea9a12ad2dc9b96457e46b51;hp=10ab8bfa2252ff4fe39b9bdf9989b641536f8dea;hpb=41ddf1d1506e4a1394ab784d805d1df78b1892e1;p=mesa.git diff --git a/src/gallium/drivers/freedreno/freedreno_resource.h b/src/gallium/drivers/freedreno/freedreno_resource.h index 10ab8bfa225..b0ec7553392 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.h +++ b/src/gallium/drivers/freedreno/freedreno_resource.h @@ -59,8 +59,6 @@ struct fd_resource_slice { uint32_t size0; /* size of first layer in slice */ }; -struct set; - struct fd_resource { struct pipe_resource base; struct fd_bo *bo; @@ -78,6 +76,11 @@ struct fd_resource { /* TODO rename to secondary or auxiliary? */ struct fd_resource *stencil; + uint32_t offset; + uint32_t ubwc_offset; + uint32_t ubwc_pitch; + uint32_t ubwc_size; + /* bitmask of in-flight batches which reference this resource. Note * that the batch doesn't hold reference to resources (but instead * the fd_ringbuffer holds refs to the underlying fd_bo), but in case @@ -100,7 +103,6 @@ struct fd_resource { uint16_t seqno; unsigned tile_mode : 2; - unsigned preferred_tile_mode : 2; /* * LRZ @@ -166,7 +168,20 @@ fd_resource_offset(struct fd_resource *rsc, unsigned level, unsigned layer) offset = slice->offset + (slice->size0 * layer); } debug_assert(offset < fd_bo_size(rsc->bo)); - return offset; + return offset + rsc->offset; +} + +static inline uint32_t +fd_resource_ubwc_offset(struct fd_resource *rsc, unsigned level, unsigned layer) +{ + /* for now this doesn't do anything clever, but when UBWC is enabled + * for multi layer/level images, it will. + */ + if (rsc->ubwc_size) { + debug_assert(level == 0); + debug_assert(layer == 0); + } + return rsc->ubwc_offset; } /* This might be a5xx specific, but higher mipmap levels are always linear: */ @@ -179,15 +194,28 @@ fd_resource_level_linear(struct pipe_resource *prsc, int level) return false; } -void fd_blitter_pipe_begin(struct fd_context *ctx, bool render_cond, bool discard, - enum fd_render_stage stage); -void fd_blitter_pipe_end(struct fd_context *ctx); +static inline bool +fd_resource_ubwc_enabled(struct fd_resource *rsc, int level) +{ + return rsc->ubwc_size && rsc->tile_mode && + !fd_resource_level_linear(&rsc->base, level); +} + +/* access # of samples, with 0 normalized to 1 (which is what we care about + * most of the time) + */ +static inline unsigned +fd_resource_nr_samples(struct pipe_resource *prsc) +{ + return MAX2(1, prsc->nr_samples); +} void fd_resource_screen_init(struct pipe_screen *pscreen); void fd_resource_context_init(struct pipe_context *pctx); uint32_t fd_setup_slices(struct fd_resource *rsc); void fd_resource_resize(struct pipe_resource *prsc, uint32_t sz); +void fd_resource_uncompress(struct fd_context *ctx, struct fd_resource *rsc); bool fd_render_condition_check(struct pipe_context *pctx);