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"
32e7a73b75a0dbd599187b8980b2e1e1cb5dfdaf6dMarek Olšák#include "util/slab.h"
3378087676c98aa8884ba92e75a0a5306a8f78ad43Eric Anholt#include "xf86drm.h"
341850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
35a3cd3c0d198374647df3db83198e8ce0cddcb6b7Eric Anholt#define __user
36a3cd3c0d198374647df3db83198e8ce0cddcb6b7Eric Anholt#include "vc4_drm.h"
371850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "vc4_bufmgr.h"
381850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "vc4_resource.h"
391850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "vc4_cl.h"
40792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt#include "vc4_qir.h"
411850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
4245c022f2b06967196516f0616a9e4959ddcd14daEric Anholt#ifndef DRM_VC4_PARAM_SUPPORTS_ETC1
4345c022f2b06967196516f0616a9e4959ddcd14daEric Anholt#define DRM_VC4_PARAM_SUPPORTS_ETC1		4
4445c022f2b06967196516f0616a9e4959ddcd14daEric Anholt#endif
457f27ad55974d0bdac4c94a4523a4d42cc75334d5Eric Anholt#ifndef DRM_VC4_PARAM_SUPPORTS_THREADED_FS
467f27ad55974d0bdac4c94a4523a4d42cc75334d5Eric Anholt#define DRM_VC4_PARAM_SUPPORTS_THREADED_FS	5
477f27ad55974d0bdac4c94a4523a4d42cc75334d5Eric Anholt#endif
4845c022f2b06967196516f0616a9e4959ddcd14daEric Anholt
49af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt#ifdef USE_VC4_SIMULATOR
50af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt#define using_vc4_simulator true
51af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt#else
52af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt#define using_vc4_simulator false
53af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt#endif
54af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt
551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_BLEND         (1 <<  0)
561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_RASTERIZER    (1 <<  1)
571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_ZSA           (1 <<  2)
581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_FRAGTEX       (1 <<  3)
591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VERTTEX       (1 <<  4)
601a328120d334ae09fa6a1ce8b599174f730a9753Eric Anholt
611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_BLEND_COLOR   (1 <<  7)
621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_STENCIL_REF   (1 <<  8)
631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_SAMPLE_MASK   (1 <<  9)
641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_FRAMEBUFFER   (1 << 10)
651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_STIPPLE       (1 << 11)
661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VIEWPORT      (1 << 12)
671850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_CONSTBUF      (1 << 13)
681850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VTXSTATE      (1 << 14)
691850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VTXBUF        (1 << 15)
701850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_INDEXBUF      (1 << 16)
711850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_SCISSOR       (1 << 17)
7245b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt#define VC4_DIRTY_FLAT_SHADE_FLAGS (1 << 18)
73d09509da2aa5ff709c48bdc4163a2c57811c70abEric Anholt#define VC4_DIRTY_PRIM_MODE     (1 << 19)
74201d4c0b2a6f7f0c1d59c4fd5cce4916fc48a2d2Eric Anholt#define VC4_DIRTY_CLIP          (1 << 20)
751a328120d334ae09fa6a1ce8b599174f730a9753Eric Anholt#define VC4_DIRTY_UNCOMPILED_VS (1 << 21)
761a328120d334ae09fa6a1ce8b599174f730a9753Eric Anholt#define VC4_DIRTY_UNCOMPILED_FS (1 << 22)
772e04492a142102823dfb8fc8599cfd417b84c97aEric Anholt#define VC4_DIRTY_COMPILED_CS   (1 << 23)
782e04492a142102823dfb8fc8599cfd417b84c97aEric Anholt#define VC4_DIRTY_COMPILED_VS   (1 << 24)
792e04492a142102823dfb8fc8599cfd417b84c97aEric Anholt#define VC4_DIRTY_COMPILED_FS   (1 << 25)
802350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt#define VC4_DIRTY_FS_INPUTS     (1 << 26)
811850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
820f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholtstruct vc4_sampler_view {
830f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt        struct pipe_sampler_view base;
840f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt        uint32_t texture_p0;
850f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt        uint32_t texture_p1;
863bcd0f1912a60cc9d3813923d18d29465e41ff56Eric Anholt        bool force_first_level;
870f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt};
880f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt
897124feba1b879deb88dbf2baf600ed42309d9839Eric Anholtstruct vc4_sampler_state {
907124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt        struct pipe_sampler_state base;
917124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt        uint32_t texture_p1;
927124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt};
937124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt
941850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_texture_stateobj {
951850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS];
961850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned num_textures;
971850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
981850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned num_samplers;
991850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1001850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
101792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholtstruct vc4_shader_uniform_info {
102792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt        enum quniform_contents *contents;
103792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt        uint32_t *data;
104792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt        uint32_t count;
105a8f2bf0f51222a96a49dfb3d6f9b36d3e54d08cdEric Anholt        uint32_t num_texture_samples;
106792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt};
107792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt
108581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholtstruct vc4_uncompiled_shader {
1095d32e263357e562779bfc0d2af712d4c7538a32bEric Anholt        /** A name for this program, so you can track it in shader-db output. */
1105d32e263357e562779bfc0d2af712d4c7538a32bEric Anholt        uint32_t program_id;
1115d32e263357e562779bfc0d2af712d4c7538a32bEric Anholt        /** How many variants of this program were compiled, for shader-db. */
1125d32e263357e562779bfc0d2af712d4c7538a32bEric Anholt        uint32_t compiled_variant_count;
113581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt        struct pipe_shader_state base;
114581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt};
115581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt
116f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholtstruct vc4_ubo_range {
117f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt        /**
118f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt         * offset in bytes from the start of the ubo where this range is
119f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt         * uploaded.
120f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt         *
121f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt         * Only set once used is set.
122f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt         */
123f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt        uint32_t dst_offset;
124f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt
125f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt        /**
126f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt         * offset in bytes from the start of the gallium uniforms where the
127f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt         * data comes from.
128f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt         */
129f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt        uint32_t src_offset;
130f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt
131f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt        /** size in bytes of this ubo range */
132f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt        uint32_t size;
133f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt};
134f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt
1352350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholtstruct vc4_fs_inputs {
1362350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt        /**
1372350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt         * Array of the meanings of the VPM inputs this shader needs.
1382350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt         *
1392350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt         * It doesn't include those that aren't part of the VPM, like
1402350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt         * point/line coordinates.
1412350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt         */
1422350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt        struct vc4_varying_slot *input_slots;
1432350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt        uint32_t num_inputs;
1442350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt};
1452350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt
146cf2d777fbe7fd87f9076d4bc0ad639b33e7ffb70Eric Anholtstruct vc4_compiled_shader {
1475d72a1c95662109b1338605da83329dd25e00859Eric Anholt        uint64_t program_id;
1481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_bo *bo;
149e59890aebbad990a02c2c27531525804de47115dEric Anholt
150c4b0dd53568fa276079f6b6bf7ba4b857ddd65a5Eric Anholt        struct vc4_shader_uniform_info uniforms;
15145b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt
152f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt        struct vc4_ubo_range *ubo_ranges;
153f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt        uint32_t num_ubo_ranges;
154f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt        uint32_t ubo_size;
1552e04492a142102823dfb8fc8599cfd417b84c97aEric Anholt        /**
1562e04492a142102823dfb8fc8599cfd417b84c97aEric Anholt         * VC4_DIRTY_* flags that, when set in vc4->dirty, mean that the
1572e04492a142102823dfb8fc8599cfd417b84c97aEric Anholt         * uniforms have to be rewritten (and therefore the shader state
1582e04492a142102823dfb8fc8599cfd417b84c97aEric Anholt         * reemitted).
1592e04492a142102823dfb8fc8599cfd417b84c97aEric Anholt         */
1602e04492a142102823dfb8fc8599cfd417b84c97aEric Anholt        uint32_t uniform_dirty_bits;
161f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt
16245b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt        /** bitmask of which inputs are color inputs, for flat shade handling. */
16345b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt        uint32_t color_inputs;
16445b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt
165ce8504d196291452b42ed755ed3830ecb16febcdEric Anholt        bool disable_early_z;
166ce8504d196291452b42ed755ed3830ecb16febcdEric Anholt
1674d019bd703e7c20d56d5b858577607115b4926a3Eric Anholt        /* Set if the compile failed, likely due to register allocation
1684d019bd703e7c20d56d5b858577607115b4926a3Eric Anholt         * failure.  In this case, we have no shader to run and should not try
1694d019bd703e7c20d56d5b858577607115b4926a3Eric Anholt         * to do any draws.
1704d019bd703e7c20d56d5b858577607115b4926a3Eric Anholt         */
1714d019bd703e7c20d56d5b858577607115b4926a3Eric Anholt        bool failed;
1724d019bd703e7c20d56d5b858577607115b4926a3Eric Anholt
17396ffee2d02a9cbf7ff0042b3083376724b68ed36Eric Anholt        bool fs_threaded;
17496ffee2d02a9cbf7ff0042b3083376724b68ed36Eric Anholt
175c29392751180e21a2857cade8d0b4902cbe9d001Eric Anholt        uint8_t num_inputs;
1765d72a1c95662109b1338605da83329dd25e00859Eric Anholt
177b920ecf793bd419558a240014624add08774765dEric Anholt        /* Byte offsets for the start of the vertex attributes 0-7, and the
178b920ecf793bd419558a240014624add08774765dEric Anholt         * total size as "attribute" 8.
179b920ecf793bd419558a240014624add08774765dEric Anholt         */
180b920ecf793bd419558a240014624add08774765dEric Anholt        uint8_t vattr_offsets[9];
181b920ecf793bd419558a240014624add08774765dEric Anholt        uint8_t vattrs_live;
182b920ecf793bd419558a240014624add08774765dEric Anholt
1832350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt        const struct vc4_fs_inputs *fs_inputs;
1841850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1851850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1861850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_program_stateobj {
187581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt        struct vc4_uncompiled_shader *bind_vs, *bind_fs;
188c4b0dd53568fa276079f6b6bf7ba4b857ddd65a5Eric Anholt        struct vc4_compiled_shader *cs, *vs, *fs;
1891850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1901850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1911850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_constbuf_stateobj {
1921850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_constant_buffer cb[PIPE_MAX_CONSTANT_BUFFERS];
1931850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t enabled_mask;
1941850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t dirty_mask;
1951850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
1961850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
1971850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_vertexbuf_stateobj {
1981850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS];
1991850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned count;
2001850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t enabled_mask;
2011850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t dirty_mask;
2021850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
2031850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
2041850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_vertex_stateobj {
2051850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS];
2061850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned num_elements;
2071850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
2081850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
209f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt/* Hash table key for vc4->jobs */
210f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholtstruct vc4_job_key {
211f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt        struct pipe_surface *cbuf;
212f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt        struct pipe_surface *zsbuf;
213f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt};
214f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt
2159688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt/**
2169688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt * A complete bin/render job.
2179688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt *
2189688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt * This is all of the state necessary to submit a bin/render to the kernel.
2199688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt * We want to be able to have multiple in progress at a time, so that we don't
2209688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt * need to flush an existing CL just to switch to rendering to a new render
2219688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt * target (which would mean reading back from the old render target when
2229688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt * starting to render to it again).
2239688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt */
2249688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholtstruct vc4_job {
2251850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_cl bcl;
2261850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_cl shader_rec;
227a8f2bf0f51222a96a49dfb3d6f9b36d3e54d08cdEric Anholt        struct vc4_cl uniforms;
2281850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_cl bo_handles;
229a3cd3c0d198374647df3db83198e8ce0cddcb6b7Eric Anholt        struct vc4_cl bo_pointers;
2301850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint32_t shader_rec_count;
231ebf33e577aee00cf888c79e11a3b62c181b46510Eric Anholt        /**
232ebf33e577aee00cf888c79e11a3b62c181b46510Eric Anholt         * Amount of memory used by the BOs in bo_pointers.
233ebf33e577aee00cf888c79e11a3b62c181b46510Eric Anholt         *
234ebf33e577aee00cf888c79e11a3b62c181b46510Eric Anholt         * Used for checking when we should flush the job early so we don't
235ebf33e577aee00cf888c79e11a3b62c181b46510Eric Anholt         * OOM.
236ebf33e577aee00cf888c79e11a3b62c181b46510Eric Anholt         */
237ebf33e577aee00cf888c79e11a3b62c181b46510Eric Anholt        uint32_t bo_space;
2389adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt
2399adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt        /** @{ Surfaces to submit rendering for. */
2409adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt        struct pipe_surface *color_read;
2419adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt        struct pipe_surface *color_write;
2429adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt        struct pipe_surface *zs_read;
2439adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt        struct pipe_surface *zs_write;
244edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt        struct pipe_surface *msaa_color_write;
245edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt        struct pipe_surface *msaa_zs_write;
2469adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt        /** @} */
2473ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt        /** @{
2483ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt         * Bounding box of the scissor across all queued drawing.
2493ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt         *
2503ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt         * Note that the max values are exclusive.
2513ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt         */
2523ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt        uint32_t draw_min_x;
2533ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt        uint32_t draw_min_y;
2543ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt        uint32_t draw_max_x;
2553ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt        uint32_t draw_max_y;
2563ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt        /** @} */
2579adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt        /** @{
2589adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt         * Width/height of the color framebuffer being rendered to,
2599adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt         * for VC4_TILE_RENDERING_MODE_CONFIG.
2609adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt        */
2619adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt        uint32_t draw_width;
2629adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt        uint32_t draw_height;
2639adcd2d80aceec90b9c3712b53d8e7839dc5634bEric Anholt        /** @} */
264edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt        /** @{ Tile information, depending on MSAA and float color buffer. */
265edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt        uint32_t draw_tiles_x; /** @< Number of tiles wide for framebuffer. */
266edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt        uint32_t draw_tiles_y; /** @< Number of tiles high for framebuffer. */
267edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt
268edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt        uint32_t tile_width; /** @< Width of a tile. */
269edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt        uint32_t tile_height; /** @< Height of a tile. */
270edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt        /** Whether the current rendering is in a 4X MSAA tile buffer. */
271edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt        bool msaa;
272edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt	/** @} */
2731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
274165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        /* Bitmask of PIPE_CLEAR_* of buffers that were cleared before the
275165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         * first rendering.
276165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         */
277165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        uint32_t cleared;
278165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        /* Bitmask of PIPE_CLEAR_* of buffers that have been rendered to
279165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         * (either clears or draws).
280165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         */
281165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        uint32_t resolve;
282165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        uint32_t clear_color[2];
2834160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt        uint32_t clear_depth; /**< 24-bit unorm depth */
2845774f164532ac85d213469f688ea87e1da16d444Eric Anholt        uint8_t clear_stencil;
2851850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
2861850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /**
2871850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * Set if some drawing (triangles, blits, or just a glClear()) has
2881850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * been done to the FBO, meaning that we need to
2891850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         * DRM_IOCTL_VC4_SUBMIT_CL.
2901850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt         */
2911850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        bool needs_flush;
2921850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
293165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt        /**
2947d7fbcdf4e1683d1aef19c7ee08cc222d8279672Eric Anholt         * Number of draw calls (not counting full buffer clears) queued in
2957d7fbcdf4e1683d1aef19c7ee08cc222d8279672Eric Anholt         * the current job.
296165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt         */
2977d7fbcdf4e1683d1aef19c7ee08cc222d8279672Eric Anholt        uint32_t draw_calls_queued;
298f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt
299f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt        struct vc4_job_key key;
3009688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt};
301165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt
3029688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholtstruct vc4_context {
3039688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt        struct pipe_context base;
3049688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt
3059688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt        int fd;
3069688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt        struct vc4_screen *screen;
3079688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt
308f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt        /** The 3D rendering job for the currently bound FBO. */
3099688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt        struct vc4_job *job;
3109688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt
311f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt        /* Map from struct vc4_job_key to the job for that FBO.
312f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt         */
313f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt        struct hash_table *jobs;
314f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt
315f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt        /**
316f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt         * Map from vc4_resource to a job writing to that resource.
317f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt         *
318f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt         * Primarily for flushing jobs rendering to textures that are now
319f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt         * being read from.
320f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt         */
321f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt        struct hash_table *write_jobs;
322f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt
3232a83036fe29262c8761812c65d6e81c7198da54eNicolai Hähnle        struct slab_child_pool transfer_pool;
3249688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt        struct blitter_context *blitter;
3259688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt
3269688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt        /** bitfield of VC4_DIRTY_* */
3279688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt        uint32_t dirty;
3282e04492a142102823dfb8fc8599cfd417b84c97aEric Anholt
3297108c24fd02a76f3efef4ba5d9aefdf0704ab0d8Eric Anholt        struct primconvert_context *primconvert;
3307108c24fd02a76f3efef4ba5d9aefdf0704ab0d8Eric Anholt
3315c9b8eace2b7e92899aae2cad131c0ca05b389e7Eric Anholt        struct hash_table *fs_cache, *vs_cache;
3322350569a78c60d32e3b751b4386ea7e6d7e2ebe9Eric Anholt        struct set *fs_inputs_set;
3335d32e263357e562779bfc0d2af712d4c7538a32bEric Anholt        uint32_t next_uncompiled_program_id;
3345d72a1c95662109b1338605da83329dd25e00859Eric Anholt        uint64_t next_compiled_program_id;
335cf2d777fbe7fd87f9076d4bc0ad639b33e7ffb70Eric Anholt
33671e5ba9c011939c962018af7f3ca78b600c95148Eric Anholt        struct ra_regs *regs;
337755037173d19b65777a97f55455c1f64bf618264Eric Anholt        unsigned int reg_class_any[2];
338755037173d19b65777a97f55455c1f64bf618264Eric Anholt        unsigned int reg_class_a_or_b[2];
339755037173d19b65777a97f55455c1f64bf618264Eric Anholt        unsigned int reg_class_a_or_b_or_acc[2];
340e763e19808a84ae0218117c89864ff50cb6b0d16Eric Anholt        unsigned int reg_class_r0_r3;
341755037173d19b65777a97f55455c1f64bf618264Eric Anholt        unsigned int reg_class_r4_or_a[2];
342755037173d19b65777a97f55455c1f64bf618264Eric Anholt        unsigned int reg_class_a[2];
34371e5ba9c011939c962018af7f3ca78b600c95148Eric Anholt
344d09509da2aa5ff709c48bdc4163a2c57811c70abEric Anholt        uint8_t prim_mode;
345d09509da2aa5ff709c48bdc4163a2c57811c70abEric Anholt
3469688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt        /** Maximum index buffer valid for the current shader_rec. */
3479688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt        uint32_t max_index;
3489688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt        /** Last index bias baked into the current shader_rec. */
3499688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt        uint32_t last_index_bias;
3509688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholt
35121577571b37e68edc0422fbf80932588a4614abcEric Anholt        /** Seqno of the last CL flush's job. */
35221577571b37e68edc0422fbf80932588a4614abcEric Anholt        uint64_t last_emit_seqno;
35321577571b37e68edc0422fbf80932588a4614abcEric Anholt
35410aacf5ae8f3e90e2f0967fbdcf96df93e346e20Eric Anholt        struct u_upload_mgr *uploader;
35510aacf5ae8f3e90e2f0967fbdcf96df93e346e20Eric Anholt
3561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /** @{ Current pipeline state objects */
3571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_scissor_state scissor;
3581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_blend_state *blend;
3591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_rasterizer_state *rasterizer;
3604160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt        struct vc4_depth_stencil_alpha_state *zsa;
3611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
3621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_texture_stateobj verttex, fragtex;
3631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
3641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_program_stateobj prog;
3651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
3661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_vertex_stateobj *vtx;
3671850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
36870b06fb5d55d639fd74596a2ff6971cb57c030caEric Anholt        struct {
36970b06fb5d55d639fd74596a2ff6971cb57c030caEric Anholt                struct pipe_blend_color f;
37070b06fb5d55d639fd74596a2ff6971cb57c030caEric Anholt                uint8_t ub[4];
37170b06fb5d55d639fd74596a2ff6971cb57c030caEric Anholt        } blend_color;
3721850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_stencil_ref stencil_ref;
3731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        unsigned sample_mask;
3741850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_framebuffer_state framebuffer;
3751850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_poly_stipple stipple;
376201d4c0b2a6f7f0c1d59c4fd5cce4916fc48a2d2Eric Anholt        struct pipe_clip_state clip;
3771850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_viewport_state viewport;
3781850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_constbuf_stateobj constbuf[PIPE_SHADER_TYPES];
3791850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct vc4_vertexbuf_stateobj vertexbuf;
3801850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_index_buffer indexbuf;
3811850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /** @} */
3821850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
3831850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
3841850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_rasterizer_state {
3851850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        struct pipe_rasterizer_state base;
3861850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
3871850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        /* VC4_CONFIGURATION_BITS */
3881850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        uint8_t config_bits[3];
3891850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
3901850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        float point_size;
3917fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt
3927fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt        /**
3937fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         * Half-float (1/8/7 bits) value of polygon offset units for
3947fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         * VC4_PACKET_DEPTH_OFFSET
3957fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         */
3967fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt        uint16_t offset_units;
3977fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt        /**
3987fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         * Half-float (1/8/7 bits) value of polygon offset scale for
3997fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         * VC4_PACKET_DEPTH_OFFSET
4007fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt         */
4017fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt        uint16_t offset_factor;
4021850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt};
4031850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
4044160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholtstruct vc4_depth_stencil_alpha_state {
4054160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt        struct pipe_depth_stencil_alpha_state base;
4064160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt
4074160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt        /* VC4_CONFIGURATION_BITS */
4084160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt        uint8_t config_bits[3];
40919589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt
41019589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt        /** Uniforms for stencil state.
41119589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt         *
41219589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt         * Index 0 is either the front config, or the front-and-back config.
41319589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt         * Index 1 is the back config if doing separate back stencil.
41419589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt         * Index 2 is the writemask config if it's not a common mask value.
41519589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt         */
41619589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt        uint32_t stencil_uniforms[3];
4174160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt};
4184160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt
419bd957b1b79124c5061af1eddf16932793e806d87Eric Anholt#define perf_debug(...) do {                            \
420bd957b1b79124c5061af1eddf16932793e806d87Eric Anholt        if (unlikely(vc4_debug & VC4_DEBUG_PERF))       \
421bd957b1b79124c5061af1eddf16932793e806d87Eric Anholt                fprintf(stderr, __VA_ARGS__);           \
422bd957b1b79124c5061af1eddf16932793e806d87Eric Anholt} while (0)
423bd957b1b79124c5061af1eddf16932793e806d87Eric Anholt
4241850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic inline struct vc4_context *
4251850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_context(struct pipe_context *pcontext)
4261850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{
4271850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt        return (struct vc4_context *)pcontext;
4281850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt}
4291850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
4300f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholtstatic inline struct vc4_sampler_view *
4310f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholtvc4_sampler_view(struct pipe_sampler_view *psview)
4320f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt{
4330f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt        return (struct vc4_sampler_view *)psview;
4340f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt}
4350f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt
4367124feba1b879deb88dbf2baf600ed42309d9839Eric Anholtstatic inline struct vc4_sampler_state *
4377124feba1b879deb88dbf2baf600ed42309d9839Eric Anholtvc4_sampler_state(struct pipe_sampler_state *psampler)
4387124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt{
4397124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt        return (struct vc4_sampler_state *)psampler;
4407124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt}
4417124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt
4421850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct pipe_context *vc4_context_create(struct pipe_screen *pscreen,
4430fc21ecfc0891d239f20bf7724e51bc75503570cMarek Olšák                                        void *priv, unsigned flags);
4441850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_draw_init(struct pipe_context *pctx);
4451850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_state_init(struct pipe_context *pctx);
4461850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_program_init(struct pipe_context *pctx);
44780ed075e6033eba68b034fbd748da4e0b82a27f4Eric Anholtvoid vc4_program_fini(struct pipe_context *pctx);
448b65761f764f2c03b375460b3d6e36227ec161c2dEric Anholtvoid vc4_query_init(struct pipe_context *pctx);
4491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_simulator_init(struct vc4_screen *screen);
45006cc3dfda49b557b177ea6a5bc4fb87e087df21aEric Anholtvoid vc4_simulator_destroy(struct vc4_screen *screen);
451a3cd3c0d198374647df3db83198e8ce0cddcb6b7Eric Anholtint vc4_simulator_flush(struct vc4_context *vc4,
452f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt                        struct drm_vc4_submit_cl *args,
453f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt                        struct vc4_job *job);
45478087676c98aa8884ba92e75a0a5306a8f78ad43Eric Anholtint vc4_simulator_ioctl(int fd, unsigned long request, void *arg);
4551c38ee380dc6c847c62e8a83978b31382f55bcffEric Anholtvoid vc4_simulator_open_from_handle(int fd, uint32_t winsys_stride,
4561c38ee380dc6c847c62e8a83978b31382f55bcffEric Anholt                                    int handle, uint32_t size);
45778087676c98aa8884ba92e75a0a5306a8f78ad43Eric Anholt
45878087676c98aa8884ba92e75a0a5306a8f78ad43Eric Anholtstatic inline int
45978087676c98aa8884ba92e75a0a5306a8f78ad43Eric Anholtvc4_ioctl(int fd, unsigned long request, void *arg)
46078087676c98aa8884ba92e75a0a5306a8f78ad43Eric Anholt{
46178087676c98aa8884ba92e75a0a5306a8f78ad43Eric Anholt        if (using_vc4_simulator)
46278087676c98aa8884ba92e75a0a5306a8f78ad43Eric Anholt                return vc4_simulator_ioctl(fd, request, arg);
46378087676c98aa8884ba92e75a0a5306a8f78ad43Eric Anholt        else
46478087676c98aa8884ba92e75a0a5306a8f78ad43Eric Anholt                return drmIoctl(fd, request, arg);
46578087676c98aa8884ba92e75a0a5306a8f78ad43Eric Anholt}
4661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
4672e04492a142102823dfb8fc8599cfd417b84c97aEric Anholtvoid vc4_set_shader_uniform_dirty_flags(struct vc4_compiled_shader *shader);
468a8f2bf0f51222a96a49dfb3d6f9b36d3e54d08cdEric Anholtvoid vc4_write_uniforms(struct vc4_context *vc4,
469cf2d777fbe7fd87f9076d4bc0ad639b33e7ffb70Eric Anholt                        struct vc4_compiled_shader *shader,
470792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt                        struct vc4_constbuf_stateobj *cb,
471c4b0dd53568fa276079f6b6bf7ba4b857ddd65a5Eric Anholt                        struct vc4_texture_stateobj *texstate);
472792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt
4731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_flush(struct pipe_context *pctx);
474f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholtvoid vc4_job_init(struct vc4_context *vc4);
475f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholtstruct vc4_job *vc4_get_job(struct vc4_context *vc4,
476f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt                            struct pipe_surface *cbuf,
477f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt                            struct pipe_surface *zsbuf);
478f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholtstruct vc4_job *vc4_get_job_for_fbo(struct vc4_context *vc4);
479f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt
4809688166bd9c3e12c74c55b857ad0dbb62b28da9eEric Anholtvoid vc4_job_submit(struct vc4_context *vc4, struct vc4_job *job);
481f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholtvoid vc4_flush_jobs_writing_resource(struct vc4_context *vc4,
482f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt                                     struct pipe_resource *prsc);
483f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholtvoid vc4_flush_jobs_reading_resource(struct vc4_context *vc4,
484f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt                                     struct pipe_resource *prsc);
4851850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_emit_state(struct pipe_context *pctx);
48671e5ba9c011939c962018af7f3ca78b600c95148Eric Anholtvoid vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c);
48771e5ba9c011939c962018af7f3ca78b600c95148Eric Anholtstruct qpu_reg *vc4_register_allocate(struct vc4_context *vc4, struct vc4_compile *c);
4884d019bd703e7c20d56d5b858577607115b4926a3Eric Anholtbool vc4_update_compiled_shaders(struct vc4_context *vc4, uint8_t prim_mode);
4891850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt
490b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtbool vc4_rt_format_supported(enum pipe_format f);
491b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtbool vc4_rt_format_is_565(enum pipe_format f);
492b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtbool vc4_tex_format_supported(enum pipe_format f);
493b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtuint8_t vc4_get_tex_format(enum pipe_format f);
494b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtconst uint8_t *vc4_get_format_swizzle(enum pipe_format f);
495b65761f764f2c03b375460b3d6e36227ec161c2dEric Anholtvoid vc4_init_query_functions(struct vc4_context *vc4);
49643b20795b742b9f1608dd6f2dc586337408760adEric Anholtvoid vc4_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info);
49721a27ad9569211e48cfd7ad60ac4025ab9f96a7aEric Anholtvoid vc4_blitter_save(struct vc4_context *vc4);
4981850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#endif /* VC4_CONTEXT_H */
499