X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Ffreedreno%2Ffreedreno_util.h;h=0d2418e1e00c6fe3dce05243a9348616c84380c3;hb=34738a92dea31ab91edb62bf83a3fe1ca44c35a1;hp=c519e23092e025b4a14f8cab1b77706170f498a9;hpb=480fe244dd41a034111963440a9f51999cfc9035;p=mesa.git diff --git a/src/gallium/drivers/freedreno/freedreno_util.h b/src/gallium/drivers/freedreno/freedreno_util.h index c519e23092e..0d2418e1e00 100644 --- a/src/gallium/drivers/freedreno/freedreno_util.h +++ b/src/gallium/drivers/freedreno/freedreno_util.h @@ -38,7 +38,9 @@ #include "util/u_math.h" #include "util/u_half.h" #include "util/u_dynarray.h" +#include "util/u_pack_color.h" +#include "disasm.h" #include "adreno_common.xml.h" #include "adreno_pm4.xml.h" @@ -52,19 +54,25 @@ enum adreno_stencil_op fd_stencil_op(unsigned op); /* TBD if it is same on a2xx, but for now: */ #define MAX_MIP_LEVELS A3XX_MAX_MIP_LEVELS +#define A2XX_MAX_RENDER_TARGETS 1 +#define A3XX_MAX_RENDER_TARGETS 4 +#define A4XX_MAX_RENDER_TARGETS 8 + +#define MAX_RENDER_TARGETS A4XX_MAX_RENDER_TARGETS + #define FD_DBG_MSGS 0x0001 #define FD_DBG_DISASM 0x0002 #define FD_DBG_DCLEAR 0x0004 -#define FD_DBG_DGMEM 0x0008 -#define FD_DBG_DSCIS 0x0010 +#define FD_DBG_DDRAW 0x0008 +#define FD_DBG_NOSCIS 0x0010 #define FD_DBG_DIRECT 0x0020 -#define FD_DBG_DBYPASS 0x0040 +#define FD_DBG_NOBYPASS 0x0040 #define FD_DBG_FRAGHALF 0x0080 #define FD_DBG_NOBIN 0x0100 -#define FD_DBG_NOOPT 0x0200 -#define FD_DBG_OPTMSGS 0x0400 -#define FD_DBG_OPTDUMP 0x0800 -#define FD_DBG_GLSL130 0x1000 +#define FD_DBG_OPTMSGS 0x0200 +#define FD_DBG_GLSL120 0x0400 +#define FD_DBG_SHADERDB 0x0800 +#define FD_DBG_FLUSH 0x1000 extern int fd_mesa_debug; extern bool fd_binning_enabled; @@ -74,8 +82,6 @@ extern bool fd_binning_enabled; debug_printf("%s:%d: "fmt "\n", \ __FUNCTION__, __LINE__, ##__VA_ARGS__); } while (0) -#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) - /* for conditionally setting boolean flag(s): */ #define COND(bool, val) ((bool) ? (val) : 0) @@ -83,14 +89,16 @@ extern bool fd_binning_enabled; static inline uint32_t DRAW(enum pc_di_primtype prim_type, enum pc_di_src_sel source_select, enum pc_di_index_size index_size, - enum pc_di_vis_cull_mode vis_cull_mode) + enum pc_di_vis_cull_mode vis_cull_mode, + uint8_t instances) { return (prim_type << 0) | (source_select << 6) | ((index_size & 1) << 11) | ((index_size >> 1) << 13) | (vis_cull_mode << 9) | - (1 << 14); + (1 << 14) | + (instances << 24); } /* for tracking cmdstream positions that need to be patched: */ @@ -109,6 +117,58 @@ pipe_surface_format(struct pipe_surface *psurf) return psurf->format; } +static inline bool +fd_surface_half_precision(const struct pipe_surface *psurf) +{ + enum pipe_format format; + + if (!psurf) + return true; + + format = psurf->format; + + /* colors are provided in consts, which go through cov.f32f16, which will + * break these values + */ + if (util_format_is_pure_integer(format)) + return false; + + /* avoid losing precision on 32-bit float formats */ + if (util_format_is_float(format) && + util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0) == 32) + return false; + + return true; +} + +static inline unsigned +fd_sampler_first_level(const struct pipe_sampler_view *view) +{ + if (view->target == PIPE_BUFFER) + return 0; + return view->u.tex.first_level; +} + +static inline unsigned +fd_sampler_last_level(const struct pipe_sampler_view *view) +{ + if (view->target == PIPE_BUFFER) + return 0; + return view->u.tex.last_level; +} + +static inline bool +fd_half_precision(struct pipe_framebuffer_state *pfb) +{ + unsigned i; + + for (i = 0; i < pfb->nr_cbufs; i++) + if (!fd_surface_half_precision(pfb->cbufs[i])) + return false; + + return true; +} + #define LOG_DWORDS 0 static inline void emit_marker(struct fd_ringbuffer *ring, int scratch_idx); @@ -208,6 +268,10 @@ static inline void OUT_IB(struct fd_ringbuffer *ring, struct fd_ringmarker *start, struct fd_ringmarker *end) { + uint32_t dwords = fd_ringmarker_dwords(start, end); + + assert(dwords > 0); + /* for debug after a lock up, write a unique counter value * to scratch6 for each IB, to make it easier to match up * register dumps to cmdstream. The combination of IB and @@ -218,7 +282,7 @@ OUT_IB(struct fd_ringbuffer *ring, struct fd_ringmarker *start, OUT_PKT3(ring, CP_INDIRECT_BUFFER_PFD, 2); fd_ringbuffer_emit_reloc_ring(ring, start, end); - OUT_RING(ring, fd_ringmarker_dwords(start, end)); + OUT_RING(ring, dwords); emit_marker(ring, 6); } @@ -246,8 +310,16 @@ static inline uint32_t env2u(const char *envvar) { char *str = getenv(envvar); if (str) - return strtol(str, NULL, 0); + return strtoul(str, NULL, 0); return 0; } +static inline uint32_t +pack_rgba(enum pipe_format format, const float *rgba) +{ + union util_color uc; + util_pack_color(rgba, format, &uc); + return uc.ui[0]; +} + #endif /* FREEDRENO_UTIL_H_ */