vc4_context.h revision 201d4c0b2a6f7f0c1d59c4fd5cce4916fc48a2d2
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
28b0a1e401a93b7b13870b936bc667b3fc15dba6d5Eric Anholt#include <stdio.h>
29b0a1e401a93b7b13870b936bc667b3fc15dba6d5Eric Anholt
301850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "pipe/p_context.h"
311850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "pipe/p_state.h"
321850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "util/u_slab.h"
331850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
34a3cd3c0d198374647df3db83198e8ce0cddcb6b7Eric Anholt#define __user
35a3cd3c0d198374647df3db83198e8ce0cddcb6b7Eric Anholt#include "vc4_drm.h"
361850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "vc4_bufmgr.h"
371850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "vc4_resource.h"
381850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "vc4_cl.h"
39792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt#include "vc4_qir.h"
401850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
411850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_BLEND         (1 <<  0)
421850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_RASTERIZER    (1 <<  1)
431850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_ZSA           (1 <<  2)
441850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_FRAGTEX       (1 <<  3)
451850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VERTTEX       (1 <<  4)
461850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_TEXSTATE      (1 <<  5)
471850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_PROG          (1 <<  6)
481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_BLEND_COLOR   (1 <<  7)
491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_STENCIL_REF   (1 <<  8)
501850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_SAMPLE_MASK   (1 <<  9)
511850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_FRAMEBUFFER   (1 << 10)
521850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_STIPPLE       (1 << 11)
531850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VIEWPORT      (1 << 12)
541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_CONSTBUF      (1 << 13)
551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VTXSTATE      (1 << 14)
561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VTXBUF        (1 << 15)
571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_INDEXBUF      (1 << 16)
581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_SCISSOR       (1 << 17)
5945b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt#define VC4_DIRTY_FLAT_SHADE_FLAGS (1 << 18)
60d09509da2aa5ff709c48bdc4163a2c57811c70abEric Anholt#define VC4_DIRTY_PRIM_MODE     (1 << 19)
61201d4c0b2a6f7f0c1d59c4fd5cce4916fc48a2d2Eric Anholt#define VC4_DIRTY_CLIP          (1 << 20)
621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_SHADER_DIRTY_VP     (1 << 0)
641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_SHADER_DIRTY_FP     (1 << 1)
651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_texture_stateobj {
671850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS];
681850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned num_textures;
691850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
701850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned num_samplers;
711850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned dirty_samplers;
721850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
74792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholtstruct vc4_shader_uniform_info {
75792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt        enum quniform_contents *contents;
76792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt        uint32_t *data;
77792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt        uint32_t count;
78a8f2bf0f51222a96a49dfb3d6f9b36d3e54d08cdEric Anholt        uint32_t num_texture_samples;
79792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt};
80792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt
81581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholtstruct vc4_uncompiled_shader {
82581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt        struct pipe_shader_state base;
83581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt        const struct tgsi_token *twoside_tokens;
84581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt};
85581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt
86cf2d777fbe7fd87f9076d4bc0ad639b33e7ffb70Eric Anholtstruct vc4_compiled_shader {
875d72a1c95662109b1338605da83329dd25e00859Eric Anholt        uint64_t program_id;
881850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_bo *bo;
89e59890aebbad990a02c2c27531525804de47115dEric Anholt
90c4b0dd53568fa276079f6b6bf7ba4b857ddd65a5Eric Anholt        struct vc4_shader_uniform_info uniforms;
9145b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt
9245b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt        /** bitmask of which inputs are color inputs, for flat shade handling. */
9345b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt        uint32_t color_inputs;
9445b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt
95c29392751180e21a2857cade8d0b4902cbe9d001Eric Anholt        uint8_t num_inputs;
965d72a1c95662109b1338605da83329dd25e00859Eric Anholt
975d72a1c95662109b1338605da83329dd25e00859Eric Anholt        /**
985d72a1c95662109b1338605da83329dd25e00859Eric Anholt         * Array of the meanings of the VPM inputs this shader needs.
995d72a1c95662109b1338605da83329dd25e00859Eric Anholt         *
1005d72a1c95662109b1338605da83329dd25e00859Eric Anholt         * It doesn't include those that aren't part of the VPM, like
1015d72a1c95662109b1338605da83329dd25e00859Eric Anholt         * point/line coordinates.
1025d72a1c95662109b1338605da83329dd25e00859Eric Anholt         */
1035d72a1c95662109b1338605da83329dd25e00859Eric Anholt        struct vc4_varying_semantic *input_semantics;
1041850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1051850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1061850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_program_stateobj {
107581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt        struct vc4_uncompiled_shader *bind_vs, *bind_fs;
108c4b0dd53568fa276079f6b6bf7ba4b857ddd65a5Eric Anholt        struct vc4_compiled_shader *cs, *vs, *fs;
1091850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t dirty;
1101850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint8_t num_exports;
1111850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /* Indexed by semantic name or TGSI_SEMANTIC_COUNT + semantic index
1121850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * for TGSI_SEMANTIC_GENERIC.  Special vs exports (position and point-
1131850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * size) are not included in this
1141850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         */
1151850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint8_t export_linkage[63];
1161850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1171850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1181850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_constbuf_stateobj {
1191850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_constant_buffer cb[PIPE_MAX_CONSTANT_BUFFERS];
1201850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t enabled_mask;
1211850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t dirty_mask;
1221850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1231850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1241850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_vertexbuf_stateobj {
1251850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS];
1261850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned count;
1271850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t enabled_mask;
1281850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t dirty_mask;
1291850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1301850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1311850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_vertex_stateobj {
1321850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS];
1331850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned num_elements;
1341850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1351850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1361850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_context {
1371850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_context base;
1381850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1391850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        int fd;
1401850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_screen *screen;
1411850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1421850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_cl bcl;
1431850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_cl rcl;
1441850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_cl shader_rec;
145a8f2bf0f51222a96a49dfb3d6f9b36d3e54d08cdEric Anholt        struct vc4_cl uniforms;
1461850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_cl bo_handles;
147a3cd3c0d198374647df3db83198e8ce0cddcb6b7Eric Anholt        struct vc4_cl bo_pointers;
1481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t shader_rec_count;
1491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
150c3f96060a8d1ebc9caa7053592e80155a5266e92Eric Anholt        struct vc4_bo *tile_alloc;
151c3f96060a8d1ebc9caa7053592e80155a5266e92Eric Anholt        struct vc4_bo *tile_state;
152c3f96060a8d1ebc9caa7053592e80155a5266e92Eric Anholt
1531850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct util_slab_mempool transfer_pool;
1541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct blitter_context *blitter;
1551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /** bitfield of VC4_DIRTY_* */
1571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t dirty;
158165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        /* Bitmask of PIPE_CLEAR_* of buffers that were cleared before the
159165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         * first rendering.
160165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         */
161165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        uint32_t cleared;
162165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        /* Bitmask of PIPE_CLEAR_* of buffers that have been rendered to
163165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         * (either clears or draws).
164165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         */
165165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        uint32_t resolve;
166165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        uint32_t clear_color[2];
1674160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt        uint32_t clear_depth; /**< 24-bit unorm depth */
1685774f164532ac85d213469f688ea87e1da16d444Eric Anholt        uint8_t clear_stencil;
1691850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1701850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /**
1711850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * Set if some drawing (triangles, blits, or just a glClear()) has
1721850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * been done to the FBO, meaning that we need to
1731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * DRM_IOCTL_VC4_SUBMIT_CL.
1741850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         */
1751850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        bool needs_flush;
1761850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
177165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        /**
178165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         * Set when needs_flush, and the queued rendering is not just composed
179165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         * of full-buffer clears.
180165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         */
181165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        bool draw_call_queued;
182165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt
1837108c24fd02a76f3efef4ba5d9aefdf0704ab0d8Eric Anholt        struct primconvert_context *primconvert;
1847108c24fd02a76f3efef4ba5d9aefdf0704ab0d8Eric Anholt
185cf2d777fbe7fd87f9076d4bc0ad639b33e7ffb70Eric Anholt        struct util_hash_table *fs_cache, *vs_cache;
1865d72a1c95662109b1338605da83329dd25e00859Eric Anholt        uint64_t next_compiled_program_id;
187cf2d777fbe7fd87f9076d4bc0ad639b33e7ffb70Eric Anholt
18871e5ba9c011939c962018af7f3ca78b600c95148Eric Anholt        struct ra_regs *regs;
18971e5ba9c011939c962018af7f3ca78b600c95148Eric Anholt        unsigned int reg_class_any;
19071e5ba9c011939c962018af7f3ca78b600c95148Eric Anholt        unsigned int reg_class_a;
19171e5ba9c011939c962018af7f3ca78b600c95148Eric Anholt
192d09509da2aa5ff709c48bdc4163a2c57811c70abEric Anholt        uint8_t prim_mode;
193d09509da2aa5ff709c48bdc4163a2c57811c70abEric Anholt
1941850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /** @{ Current pipeline state objects */
1951850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_scissor_state scissor;
1961850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_blend_state *blend;
1971850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_rasterizer_state *rasterizer;
1984160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt        struct vc4_depth_stencil_alpha_state *zsa;
1991850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
2001850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_texture_stateobj verttex, fragtex;
2011850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
2021850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_program_stateobj prog;
2031850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
2041850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_vertex_stateobj *vtx;
2051850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
2061850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_blend_color blend_color;
2071850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_stencil_ref stencil_ref;
2081850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned sample_mask;
2091850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_framebuffer_state framebuffer;
2101850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_poly_stipple stipple;
211201d4c0b2a6f7f0c1d59c4fd5cce4916fc48a2d2Eric Anholt        struct pipe_clip_state clip;
2121850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_viewport_state viewport;
2131850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_constbuf_stateobj constbuf[PIPE_SHADER_TYPES];
2141850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_vertexbuf_stateobj vertexbuf;
2151850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_index_buffer indexbuf;
2161850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /** @} */
2171850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
2181850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
2191850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_rasterizer_state {
2201850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_rasterizer_state base;
2211850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
2221850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /* VC4_CONFIGURATION_BITS */
2231850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint8_t config_bits[3];
2241850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
2251850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        float point_size;
2267fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt
2277fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt        /**
2287fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         * Half-float (1/8/7 bits) value of polygon offset units for
2297fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         * VC4_PACKET_DEPTH_OFFSET
2307fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         */
2317fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt        uint16_t offset_units;
2327fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt        /**
2337fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         * Half-float (1/8/7 bits) value of polygon offset scale for
2347fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         * VC4_PACKET_DEPTH_OFFSET
2357fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         */
2367fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt        uint16_t offset_factor;
2371850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
2381850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
2394160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholtstruct vc4_depth_stencil_alpha_state {
2404160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt        struct pipe_depth_stencil_alpha_state base;
2414160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt
2424160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt        /* VC4_CONFIGURATION_BITS */
2434160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt        uint8_t config_bits[3];
24419589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt
24519589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt        /** Uniforms for stencil state.
24619589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt         *
24719589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt         * Index 0 is either the front config, or the front-and-back config.
24819589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt         * Index 1 is the back config if doing separate back stencil.
24919589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt         * Index 2 is the writemask config if it's not a common mask value.
25019589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt         */
25119589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt        uint32_t stencil_uniforms[3];
2524160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt};
2534160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt
2541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic inline struct vc4_context *
2551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_context(struct pipe_context *pcontext)
2561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{
2571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        return (struct vc4_context *)pcontext;
2581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt}
2591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
2601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct pipe_context *vc4_context_create(struct pipe_screen *pscreen,
2611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt                                        void *priv);
2621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_draw_init(struct pipe_context *pctx);
2631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_state_init(struct pipe_context *pctx);
2641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_program_init(struct pipe_context *pctx);
265b65761f764f2c03b375460b3d6e36227ec161c2dEric Anholtvoid vc4_query_init(struct pipe_context *pctx);
2661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_simulator_init(struct vc4_screen *screen);
267a3cd3c0d198374647df3db83198e8ce0cddcb6b7Eric Anholtint vc4_simulator_flush(struct vc4_context *vc4,
26864ad96a9f4dec0724d7276d32de59cc621fccb55Eric Anholt                        struct drm_vc4_submit_cl *args);
2691850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
270a8f2bf0f51222a96a49dfb3d6f9b36d3e54d08cdEric Anholtvoid vc4_write_uniforms(struct vc4_context *vc4,
271cf2d777fbe7fd87f9076d4bc0ad639b33e7ffb70Eric Anholt                        struct vc4_compiled_shader *shader,
272792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt                        struct vc4_constbuf_stateobj *cb,
273c4b0dd53568fa276079f6b6bf7ba4b857ddd65a5Eric Anholt                        struct vc4_texture_stateobj *texstate);
274792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt
2751850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_flush(struct pipe_context *pctx);
2762259cc5aebcb16636b1399dd438beed9d9867e67Eric Anholtvoid vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo);
2771850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_emit_state(struct pipe_context *pctx);
27871e5ba9c011939c962018af7f3ca78b600c95148Eric Anholtvoid vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c);
27971e5ba9c011939c962018af7f3ca78b600c95148Eric Anholtstruct qpu_reg *vc4_register_allocate(struct vc4_context *vc4, struct vc4_compile *c);
280ba875b3a0d8119fda030dfdc28cd831d9ca51e08Eric Anholtvoid vc4_update_compiled_shaders(struct vc4_context *vc4, uint8_t prim_mode);
2811850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
282b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtbool vc4_rt_format_supported(enum pipe_format f);
283b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtbool vc4_rt_format_is_565(enum pipe_format f);
284b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtbool vc4_tex_format_supported(enum pipe_format f);
285b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtuint8_t vc4_get_tex_format(enum pipe_format f);
286b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtconst uint8_t *vc4_get_format_swizzle(enum pipe_format f);
287b65761f764f2c03b375460b3d6e36227ec161c2dEric Anholtvoid vc4_init_query_functions(struct vc4_context *vc4);
2881850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#endif /* VC4_CONTEXT_H */
289