vc4_context.h revision 792d1c92df6f58f219eb8b77e668424cdcc9c9af
11850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt/*
21850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * Copyright © 2014 Broadcom
31850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * Copyright (C) 2012 Rob Clark <robclark@freedesktop.org>
41850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt *
51850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
61850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * copy of this software and associated documentation files (the "Software"),
71850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * to deal in the Software without restriction, including without limitation
81850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense,
91850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * and/or sell copies of the Software, and to permit persons to whom the
101850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * Software is furnished to do so, subject to the following conditions:
111850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt *
121850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * The above copyright notice and this permission notice (including the next
131850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * paragraph) shall be included in all copies or substantial portions of the
141850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * Software.
151850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt *
161850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
171850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
181850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
191850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
201850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
211850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
221850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * IN THE SOFTWARE.
231850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt */
241850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
251850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#ifndef VC4_CONTEXT_H
261850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_CONTEXT_H
271850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
281850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "pipe/p_context.h"
291850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "pipe/p_state.h"
301850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "util/u_slab.h"
311850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
321850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "vc4_bufmgr.h"
331850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "vc4_resource.h"
341850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "vc4_cl.h"
35792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt#include "vc4_qir.h"
361850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
371850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_BLEND         (1 <<  0)
381850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_RASTERIZER    (1 <<  1)
391850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_ZSA           (1 <<  2)
401850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_FRAGTEX       (1 <<  3)
411850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VERTTEX       (1 <<  4)
421850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_TEXSTATE      (1 <<  5)
431850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_PROG          (1 <<  6)
441850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_BLEND_COLOR   (1 <<  7)
451850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_STENCIL_REF   (1 <<  8)
461850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_SAMPLE_MASK   (1 <<  9)
471850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_FRAMEBUFFER   (1 << 10)
481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_STIPPLE       (1 << 11)
491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VIEWPORT      (1 << 12)
501850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_CONSTBUF      (1 << 13)
511850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VTXSTATE      (1 << 14)
521850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VTXBUF        (1 << 15)
531850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_INDEXBUF      (1 << 16)
541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_SCISSOR       (1 << 17)
551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_SHADER_DIRTY_VP     (1 << 0)
571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_SHADER_DIRTY_FP     (1 << 1)
581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_texture_stateobj {
601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS];
611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned num_textures;
621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned num_samplers;
641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned dirty_samplers;
651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
67792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholtstruct vc4_shader_uniform_info {
68792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt        enum quniform_contents *contents;
69792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt        uint32_t *data;
70792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt        uint32_t count;
71792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt};
72792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt
731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_shader_state {
741850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_shader_state base;
751850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_bo *bo;
76e59890aebbad990a02c2c27531525804de47115dEric Anholt
77792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt        struct vc4_shader_uniform_info uniforms[2];
78792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt
79e59890aebbad990a02c2c27531525804de47115dEric Anholt        uint32_t coord_shader_offset;
801850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
811850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
821850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_program_stateobj {
831850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_shader_state *vs, *fs;
841850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t dirty;
851850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint8_t num_exports;
861850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /* Indexed by semantic name or TGSI_SEMANTIC_COUNT + semantic index
871850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * for TGSI_SEMANTIC_GENERIC.  Special vs exports (position and point-
881850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * size) are not included in this
891850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         */
901850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint8_t export_linkage[63];
911850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
921850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
931850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_constbuf_stateobj {
941850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_constant_buffer cb[PIPE_MAX_CONSTANT_BUFFERS];
951850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t enabled_mask;
961850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t dirty_mask;
971850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
981850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
991850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_vertexbuf_stateobj {
1001850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS];
1011850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned count;
1021850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t enabled_mask;
1031850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t dirty_mask;
1041850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1051850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1061850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_vertex_stateobj {
1071850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS];
1081850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned num_elements;
1091850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1101850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1111850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_context {
1121850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_context base;
1131850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1141850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        int fd;
1151850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_screen *screen;
1161850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1171850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_cl bcl;
1181850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_cl rcl;
1191850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_cl shader_rec;
1201850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_cl bo_handles;
1211850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t shader_rec_count;
1221850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1231850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct util_slab_mempool transfer_pool;
1241850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct blitter_context *blitter;
1251850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1261850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /** bitfield of VC4_DIRTY_* */
1271850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t dirty;
1281850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1291850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /**
1301850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * Set if some drawing (triangles, blits, or just a glClear()) has
1311850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * been done to the FBO, meaning that we need to
1321850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * DRM_IOCTL_VC4_SUBMIT_CL.
1331850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         */
1341850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        bool needs_flush;
1351850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1361850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /** @{ Current pipeline state objects */
1371850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_scissor_state scissor;
1381850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_blend_state *blend;
1391850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_rasterizer_state *rasterizer;
1401850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_depth_stencil_alpha_state *zsa;
1411850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1421850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_texture_stateobj verttex, fragtex;
1431850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1441850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_program_stateobj prog;
1451850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1461850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_vertex_stateobj *vtx;
1471850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_blend_color blend_color;
1491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_stencil_ref stencil_ref;
1501850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned sample_mask;
1511850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_framebuffer_state framebuffer;
1521850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_poly_stipple stipple;
1531850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_viewport_state viewport;
1541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_constbuf_stateobj constbuf[PIPE_SHADER_TYPES];
1551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_vertexbuf_stateobj vertexbuf;
1561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_index_buffer indexbuf;
1571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /** @} */
1581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_rasterizer_state {
1611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_rasterizer_state base;
1621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /* VC4_CONFIGURATION_BITS */
1641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint8_t config_bits[3];
1651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        float point_size;
1671850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1681850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1691850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic inline struct vc4_context *
1701850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_context(struct pipe_context *pcontext)
1711850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{
1721850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        return (struct vc4_context *)pcontext;
1731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt}
1741850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1751850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct pipe_context *vc4_context_create(struct pipe_screen *pscreen,
1761850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt                                        void *priv);
1771850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_draw_init(struct pipe_context *pctx);
1781850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_state_init(struct pipe_context *pctx);
1791850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_program_init(struct pipe_context *pctx);
1801850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_simulator_init(struct vc4_screen *screen);
1811850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_simulator_flush(struct vc4_context *vc4,
1821850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt                         struct vc4_surface *color_surf);
1831850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid *vc4_simulator_alloc(struct vc4_screen *screen, uint32_t size);
1841850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
185792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholtvoid vc4_get_uniform_bo(struct vc4_context *vc4,
186792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt                        struct vc4_shader_state *shader,
187792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt                        struct vc4_constbuf_stateobj *cb,
188792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt                        int shader_index, struct vc4_bo **out_bo,
189792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt                        uint32_t *out_offset);
190792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt
1911850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_flush(struct pipe_context *pctx);
1921850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_emit_state(struct pipe_context *pctx);
193792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholtvoid vc4_generate_code(struct qcompile *c);
1941850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1951850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#endif /* VC4_CONTEXT_H */
196