freedreno/a4xx: better occlusion/sample counting
[mesa.git] / src / gallium / drivers / freedreno / freedreno_context.h
index cc585af1b3f55ff58912a1e03ff1ff1284f114c1..85ce97c16b79c377c64e3d5b3396364155c28b20 100644 (file)
@@ -40,6 +40,8 @@
 #include "freedreno_gmem.h"
 #include "freedreno_util.h"
 
+#define BORDER_COLOR_UPLOAD_SIZE (2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE)
+
 struct fd_vertex_stateobj;
 
 struct fd_texture_stateobj {
@@ -162,6 +164,9 @@ struct fd_context {
         */
        struct fd_hw_sample *sample_cache[MAX_HW_SAMPLE_PROVIDERS];
 
+       /* which sample providers were active in the current batch: */
+       uint32_t active_providers;
+
        /* tracking for current stage, to know when to start/stop
         * any active queries:
         */
@@ -193,7 +198,7 @@ struct fd_context {
        struct fd_program_stateobj solid_prog; // TODO move to screen?
 
        /* shaders used by mem->gmem blits: */
-       struct fd_program_stateobj blit_prog[8]; // TODO move to screen?
+       struct fd_program_stateobj blit_prog[MAX_RENDER_TARGETS]; // TODO move to screen?
        struct fd_program_stateobj blit_z, blit_zs;
 
        /* do we need to mem2gmem before rendering.  We don't, if for example,
@@ -334,6 +339,8 @@ struct fd_context {
                FD_DIRTY_INDEXBUF    = (1 << 16),
                FD_DIRTY_SCISSOR     = (1 << 17),
                FD_DIRTY_STREAMOUT   = (1 << 18),
+               FD_DIRTY_UCP         = (1 << 19),
+               FD_DIRTY_BLEND_DUAL  = (1 << 20),
        } dirty;
 
        struct pipe_blend_state *blend;
@@ -355,6 +362,11 @@ struct fd_context {
        struct fd_constbuf_stateobj constbuf[PIPE_SHADER_TYPES];
        struct pipe_index_buffer indexbuf;
        struct fd_streamout_stateobj streamout;
+       struct pipe_clip_state ucp;
+
+       struct pipe_query *cond_query;
+       bool cond_cond; /* inverted rendering condition */
+       uint cond_mode;
 
        /* GMEM/tile handling fxns: */
        void (*emit_tile_init)(struct fd_context *ctx);
@@ -377,6 +389,10 @@ struct fd_context {
                        const uint32_t *dwords, struct pipe_resource *prsc);
        void (*emit_const_bo)(struct fd_ringbuffer *ring, enum shader_t type, boolean write,
                        uint32_t regid, uint32_t num, struct fd_bo **bos, uint32_t *offsets);
+
+       /* indirect-branch emit: */
+       void (*emit_ib)(struct fd_ringbuffer *ring, struct fd_ringmarker *start,
+                       struct fd_ringmarker *end);
 };
 
 static inline struct fd_context *