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