X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Ffreedreno%2Ffreedreno_resource.h;h=b0ec7553392c3e0996c2b24fc38265c386840499;hb=832010f6acdc9a55ea9a12ad2dc9b96457e46b51;hp=60ba7e6961fbd68d97ff65cb7df7fa95f3c3ecd4;hpb=a8e6734a83816df2a39e5c4c49721d762caee86b;p=mesa.git diff --git a/src/gallium/drivers/freedreno/freedreno_resource.h b/src/gallium/drivers/freedreno/freedreno_resource.h index 60ba7e6961f..b0ec7553392 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.h +++ b/src/gallium/drivers/freedreno/freedreno_resource.h @@ -1,5 +1,3 @@ -/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */ - /* * Copyright (C) 2012 Rob Clark * @@ -31,7 +29,7 @@ #include "util/list.h" #include "util/u_range.h" -#include "util/u_transfer.h" +#include "util/u_transfer_helper.h" #include "freedreno_batch.h" #include "freedreno_util.h" @@ -43,7 +41,7 @@ * programmed with the start address of each mipmap level, and hw * derives the layer offset within the level. * - * Texture Layout on a4xx: + * Texture Layout on a4xx+: * * For cubemap and 2d array, each layer contains all of it's mipmap * levels (layer_first layout). @@ -61,24 +59,28 @@ struct fd_resource_slice { uint32_t size0; /* size of first layer in slice */ }; -struct set; - struct fd_resource { - struct u_resource base; + struct pipe_resource base; struct fd_bo *bo; uint32_t cpp; enum pipe_format internal_format; bool layer_first; /* see above description */ uint32_t layer_size; struct fd_resource_slice slices[MAX_MIP_LEVELS]; - uint32_t timestamp; /* buffer range that has been initialized */ struct util_range valid_buffer_range; + bool valid; + struct renderonly_scanout *scanout; /* reference to the resource holding stencil data for a z32_s8 texture */ /* 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 @@ -96,6 +98,20 @@ struct fd_resource { * shadowed. */ uint32_t bc_batch_mask; + + /* Sequence # incremented each time bo changes: */ + uint16_t seqno; + + unsigned tile_mode : 2; + + /* + * LRZ + */ + bool lrz_valid : 1; + uint16_t lrz_width; // for lrz clear, does this differ from lrz_pitch? + uint16_t lrz_height; + uint16_t lrz_pitch; + struct fd_bo *lrz; }; static inline struct fd_resource * @@ -123,7 +139,8 @@ pending(struct fd_resource *rsc, bool write) struct fd_transfer { struct pipe_transfer base; - void *staging; + struct pipe_resource *staging_prsc; + struct pipe_box staging_box; }; static inline struct fd_transfer * @@ -135,7 +152,7 @@ fd_transfer(struct pipe_transfer *ptrans) static inline struct fd_resource_slice * fd_resource_slice(struct fd_resource *rsc, unsigned level) { - assert(level <= rsc->base.b.last_level); + assert(level <= rsc->base.last_level); return &rsc->slices[level]; } @@ -151,17 +168,54 @@ 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; } -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); +/* This might be a5xx specific, but higher mipmap levels are always linear: */ +static inline bool +fd_resource_level_linear(struct pipe_resource *prsc, int level) +{ + unsigned w = u_minify(prsc->width0, level); + if (w < 16) + return true; + return false; +} + +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);