vc4_context.h revision bd957b1b79124c5061af1eddf16932793e806d87
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 41af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt#ifdef USE_VC4_SIMULATOR 42af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt#define using_vc4_simulator true 43af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt#else 44af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt#define using_vc4_simulator false 45af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt#endif 46af3d7471943d54e692f2dd7448321a4f96e56ed2Eric Anholt 471850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_BLEND (1 << 0) 481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_RASTERIZER (1 << 1) 491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_ZSA (1 << 2) 501850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_FRAGTEX (1 << 3) 511850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VERTTEX (1 << 4) 521850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_TEXSTATE (1 << 5) 531a328120d334ae09fa6a1ce8b599174f730a9753Eric Anholt 541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_BLEND_COLOR (1 << 7) 551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_STENCIL_REF (1 << 8) 561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_SAMPLE_MASK (1 << 9) 571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_FRAMEBUFFER (1 << 10) 581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_STIPPLE (1 << 11) 591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VIEWPORT (1 << 12) 601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_CONSTBUF (1 << 13) 611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VTXSTATE (1 << 14) 621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_VTXBUF (1 << 15) 631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_INDEXBUF (1 << 16) 641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#define VC4_DIRTY_SCISSOR (1 << 17) 6545b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt#define VC4_DIRTY_FLAT_SHADE_FLAGS (1 << 18) 66d09509da2aa5ff709c48bdc4163a2c57811c70abEric Anholt#define VC4_DIRTY_PRIM_MODE (1 << 19) 67201d4c0b2a6f7f0c1d59c4fd5cce4916fc48a2d2Eric Anholt#define VC4_DIRTY_CLIP (1 << 20) 681a328120d334ae09fa6a1ce8b599174f730a9753Eric Anholt#define VC4_DIRTY_UNCOMPILED_VS (1 << 21) 691a328120d334ae09fa6a1ce8b599174f730a9753Eric Anholt#define VC4_DIRTY_UNCOMPILED_FS (1 << 22) 701a328120d334ae09fa6a1ce8b599174f730a9753Eric Anholt#define VC4_DIRTY_COMPILED_FS (1 << 24) 711850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 721850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_texture_stateobj { 731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS]; 741850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned num_textures; 751850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS]; 761850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned num_samplers; 771850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned dirty_samplers; 781850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt}; 791850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 80792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholtstruct vc4_shader_uniform_info { 81792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt enum quniform_contents *contents; 82792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt uint32_t *data; 83792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt uint32_t count; 84a8f2bf0f51222a96a49dfb3d6f9b36d3e54d08cdEric Anholt uint32_t num_texture_samples; 85792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt}; 86792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt 87581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholtstruct vc4_uncompiled_shader { 885d32e263357e562779bfc0d2af712d4c7538a32bEric Anholt /** A name for this program, so you can track it in shader-db output. */ 895d32e263357e562779bfc0d2af712d4c7538a32bEric Anholt uint32_t program_id; 905d32e263357e562779bfc0d2af712d4c7538a32bEric Anholt /** How many variants of this program were compiled, for shader-db. */ 915d32e263357e562779bfc0d2af712d4c7538a32bEric Anholt uint32_t compiled_variant_count; 92581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt struct pipe_shader_state base; 93581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt const struct tgsi_token *twoside_tokens; 94581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt}; 95581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt 96f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholtstruct vc4_ubo_range { 97f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt /** 98f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt * offset in bytes from the start of the ubo where this range is 99f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt * uploaded. 100f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt * 101f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt * Only set once used is set. 102f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt */ 103f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt uint32_t dst_offset; 104f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt 105f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt /** 106f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt * offset in bytes from the start of the gallium uniforms where the 107f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt * data comes from. 108f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt */ 109f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt uint32_t src_offset; 110f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt 111f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt /** size in bytes of this ubo range */ 112f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt uint32_t size; 113f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt}; 114f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt 115cf2d777fbe7fd87f9076d4bc0ad639b33e7ffb70Eric Anholtstruct vc4_compiled_shader { 1165d72a1c95662109b1338605da83329dd25e00859Eric Anholt uint64_t program_id; 1171850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_bo *bo; 118e59890aebbad990a02c2c27531525804de47115dEric Anholt 119c4b0dd53568fa276079f6b6bf7ba4b857ddd65a5Eric Anholt struct vc4_shader_uniform_info uniforms; 12045b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt 121f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt struct vc4_ubo_range *ubo_ranges; 122f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt uint32_t num_ubo_ranges; 123f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt uint32_t ubo_size; 124f87c7008958cdb095efa1cfb29ca8f3c9b9066e4Eric Anholt 12545b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt /** bitmask of which inputs are color inputs, for flat shade handling. */ 12645b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt uint32_t color_inputs; 12745b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt 128c29392751180e21a2857cade8d0b4902cbe9d001Eric Anholt uint8_t num_inputs; 1295d72a1c95662109b1338605da83329dd25e00859Eric Anholt 130b920ecf793bd419558a240014624add08774765dEric Anholt /* Byte offsets for the start of the vertex attributes 0-7, and the 131b920ecf793bd419558a240014624add08774765dEric Anholt * total size as "attribute" 8. 132b920ecf793bd419558a240014624add08774765dEric Anholt */ 133b920ecf793bd419558a240014624add08774765dEric Anholt uint8_t vattr_offsets[9]; 134b920ecf793bd419558a240014624add08774765dEric Anholt uint8_t vattrs_live; 135b920ecf793bd419558a240014624add08774765dEric Anholt 1365d72a1c95662109b1338605da83329dd25e00859Eric Anholt /** 1375d72a1c95662109b1338605da83329dd25e00859Eric Anholt * Array of the meanings of the VPM inputs this shader needs. 1385d72a1c95662109b1338605da83329dd25e00859Eric Anholt * 1395d72a1c95662109b1338605da83329dd25e00859Eric Anholt * It doesn't include those that aren't part of the VPM, like 1405d72a1c95662109b1338605da83329dd25e00859Eric Anholt * point/line coordinates. 1415d72a1c95662109b1338605da83329dd25e00859Eric Anholt */ 1425d72a1c95662109b1338605da83329dd25e00859Eric Anholt struct vc4_varying_semantic *input_semantics; 1431850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt}; 1441850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1451850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_program_stateobj { 146581418585e5dee3cca1b42c472b72aa9c74140bbEric Anholt struct vc4_uncompiled_shader *bind_vs, *bind_fs; 147c4b0dd53568fa276079f6b6bf7ba4b857ddd65a5Eric Anholt struct vc4_compiled_shader *cs, *vs, *fs; 1481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt uint8_t num_exports; 1491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt /* Indexed by semantic name or TGSI_SEMANTIC_COUNT + semantic index 1501850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * for TGSI_SEMANTIC_GENERIC. Special vs exports (position and point- 1511850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * size) are not included in this 1521850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt */ 1531850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt uint8_t export_linkage[63]; 1541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt}; 1551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_constbuf_stateobj { 1571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_constant_buffer cb[PIPE_MAX_CONSTANT_BUFFERS]; 1581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt uint32_t enabled_mask; 1591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt uint32_t dirty_mask; 1601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt}; 1611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_vertexbuf_stateobj { 1631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS]; 1641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned count; 1651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt uint32_t enabled_mask; 1661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt uint32_t dirty_mask; 1671850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt}; 1681850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1691850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_vertex_stateobj { 1701850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS]; 1711850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned num_elements; 1721850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt}; 1731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1741850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_context { 1751850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_context base; 1761850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1771850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt int fd; 1781850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_screen *screen; 1791850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1801850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_cl bcl; 1811850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_cl rcl; 1821850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_cl shader_rec; 183a8f2bf0f51222a96a49dfb3d6f9b36d3e54d08cdEric Anholt struct vc4_cl uniforms; 1841850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_cl bo_handles; 185a3cd3c0d198374647df3db83198e8ce0cddcb6b7Eric Anholt struct vc4_cl bo_pointers; 1861850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt uint32_t shader_rec_count; 1873ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt /** @{ 1883ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt * Bounding box of the scissor across all queued drawing. 1893ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt * 1903ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt * Note that the max values are exclusive. 1913ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt */ 1923ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt uint32_t draw_min_x; 1933ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt uint32_t draw_min_y; 1943ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt uint32_t draw_max_x; 1953ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt uint32_t draw_max_y; 1963ba57bae47666ada1145259755fc326b1b9f9463Eric Anholt /** @} */ 1971850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 198c3f96060a8d1ebc9caa7053592e80155a5266e92Eric Anholt struct vc4_bo *tile_alloc; 199c3f96060a8d1ebc9caa7053592e80155a5266e92Eric Anholt struct vc4_bo *tile_state; 200c3f96060a8d1ebc9caa7053592e80155a5266e92Eric Anholt 2011850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct util_slab_mempool transfer_pool; 2021850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct blitter_context *blitter; 2031850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2041850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt /** bitfield of VC4_DIRTY_* */ 2051850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt uint32_t dirty; 206165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt /* Bitmask of PIPE_CLEAR_* of buffers that were cleared before the 207165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt * first rendering. 208165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt */ 209165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt uint32_t cleared; 210165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt /* Bitmask of PIPE_CLEAR_* of buffers that have been rendered to 211165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt * (either clears or draws). 212165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt */ 213165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt uint32_t resolve; 214165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt uint32_t clear_color[2]; 2154160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt uint32_t clear_depth; /**< 24-bit unorm depth */ 2165774f164532ac85d213469f688ea87e1da16d444Eric Anholt uint8_t clear_stencil; 2171850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2181850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt /** 2191850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * Set if some drawing (triangles, blits, or just a glClear()) has 2201850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * been done to the FBO, meaning that we need to 2211850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * DRM_IOCTL_VC4_SUBMIT_CL. 2221850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt */ 2231850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt bool needs_flush; 2241850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 225165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt /** 226165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt * Set when needs_flush, and the queued rendering is not just composed 227165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt * of full-buffer clears. 228165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt */ 229165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt bool draw_call_queued; 230165ca6b5ad4fbd20798b6bd8120504761865436cEric Anholt 2317108c24fd02a76f3efef4ba5d9aefdf0704ab0d8Eric Anholt struct primconvert_context *primconvert; 2327108c24fd02a76f3efef4ba5d9aefdf0704ab0d8Eric Anholt 2335c9b8eace2b7e92899aae2cad131c0ca05b389e7Eric Anholt struct hash_table *fs_cache, *vs_cache; 2345d32e263357e562779bfc0d2af712d4c7538a32bEric Anholt uint32_t next_uncompiled_program_id; 2355d72a1c95662109b1338605da83329dd25e00859Eric Anholt uint64_t next_compiled_program_id; 236cf2d777fbe7fd87f9076d4bc0ad639b33e7ffb70Eric Anholt 23771e5ba9c011939c962018af7f3ca78b600c95148Eric Anholt struct ra_regs *regs; 23871e5ba9c011939c962018af7f3ca78b600c95148Eric Anholt unsigned int reg_class_any; 23971e5ba9c011939c962018af7f3ca78b600c95148Eric Anholt unsigned int reg_class_a; 24071e5ba9c011939c962018af7f3ca78b600c95148Eric Anholt 241d09509da2aa5ff709c48bdc4163a2c57811c70abEric Anholt uint8_t prim_mode; 242d09509da2aa5ff709c48bdc4163a2c57811c70abEric Anholt 24321577571b37e68edc0422fbf80932588a4614abcEric Anholt /** Seqno of the last CL flush's job. */ 24421577571b37e68edc0422fbf80932588a4614abcEric Anholt uint64_t last_emit_seqno; 24521577571b37e68edc0422fbf80932588a4614abcEric Anholt 2461850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt /** @{ Current pipeline state objects */ 2471850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_scissor_state scissor; 2481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_blend_state *blend; 2491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_rasterizer_state *rasterizer; 2504160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt struct vc4_depth_stencil_alpha_state *zsa; 2511850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2521850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_texture_stateobj verttex, fragtex; 2531850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_program_stateobj prog; 2551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_vertex_stateobj *vtx; 2571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_blend_color blend_color; 2591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_stencil_ref stencil_ref; 2601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned sample_mask; 2611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_framebuffer_state framebuffer; 2621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_poly_stipple stipple; 263201d4c0b2a6f7f0c1d59c4fd5cce4916fc48a2d2Eric Anholt struct pipe_clip_state clip; 2641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_viewport_state viewport; 2651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_constbuf_stateobj constbuf[PIPE_SHADER_TYPES]; 2661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_vertexbuf_stateobj vertexbuf; 2671850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_index_buffer indexbuf; 2681850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt /** @} */ 2691850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt}; 2701850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2711850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct vc4_rasterizer_state { 2721850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_rasterizer_state base; 2731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2741850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt /* VC4_CONFIGURATION_BITS */ 2751850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt uint8_t config_bits[3]; 2761850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2771850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt float point_size; 2787fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt 2797fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt /** 2807fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt * Half-float (1/8/7 bits) value of polygon offset units for 2817fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt * VC4_PACKET_DEPTH_OFFSET 2827fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt */ 2837fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt uint16_t offset_units; 2847fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt /** 2857fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt * Half-float (1/8/7 bits) value of polygon offset scale for 2867fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt * VC4_PACKET_DEPTH_OFFSET 2877fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt */ 2887fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt uint16_t offset_factor; 2891850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt}; 2901850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2914160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholtstruct vc4_depth_stencil_alpha_state { 2924160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt struct pipe_depth_stencil_alpha_state base; 2934160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt 2944160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt /* VC4_CONFIGURATION_BITS */ 2954160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt uint8_t config_bits[3]; 29619589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt 29719589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt /** Uniforms for stencil state. 29819589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt * 29919589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt * Index 0 is either the front config, or the front-and-back config. 30019589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt * Index 1 is the back config if doing separate back stencil. 30119589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt * Index 2 is the writemask config if it's not a common mask value. 30219589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt */ 30319589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt uint32_t stencil_uniforms[3]; 3044160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt}; 3054160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt 306bd957b1b79124c5061af1eddf16932793e806d87Eric Anholt#define perf_debug(...) do { \ 307bd957b1b79124c5061af1eddf16932793e806d87Eric Anholt if (unlikely(vc4_debug & VC4_DEBUG_PERF)) \ 308bd957b1b79124c5061af1eddf16932793e806d87Eric Anholt fprintf(stderr, __VA_ARGS__); \ 309bd957b1b79124c5061af1eddf16932793e806d87Eric Anholt} while (0) 310bd957b1b79124c5061af1eddf16932793e806d87Eric Anholt 3111850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic inline struct vc4_context * 3121850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_context(struct pipe_context *pcontext) 3131850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 3141850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return (struct vc4_context *)pcontext; 3151850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 3161850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3171850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstruct pipe_context *vc4_context_create(struct pipe_screen *pscreen, 3181850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt void *priv); 3191850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_draw_init(struct pipe_context *pctx); 3201850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_state_init(struct pipe_context *pctx); 3211850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_program_init(struct pipe_context *pctx); 32280ed075e6033eba68b034fbd748da4e0b82a27f4Eric Anholtvoid vc4_program_fini(struct pipe_context *pctx); 323b65761f764f2c03b375460b3d6e36227ec161c2dEric Anholtvoid vc4_query_init(struct pipe_context *pctx); 3241850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_simulator_init(struct vc4_screen *screen); 325a3cd3c0d198374647df3db83198e8ce0cddcb6b7Eric Anholtint vc4_simulator_flush(struct vc4_context *vc4, 32664ad96a9f4dec0724d7276d32de59cc621fccb55Eric Anholt struct drm_vc4_submit_cl *args); 3271850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 328a8f2bf0f51222a96a49dfb3d6f9b36d3e54d08cdEric Anholtvoid vc4_write_uniforms(struct vc4_context *vc4, 329cf2d777fbe7fd87f9076d4bc0ad639b33e7ffb70Eric Anholt struct vc4_compiled_shader *shader, 330792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt struct vc4_constbuf_stateobj *cb, 331c4b0dd53568fa276079f6b6bf7ba4b857ddd65a5Eric Anholt struct vc4_texture_stateobj *texstate); 332792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt 3331850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_flush(struct pipe_context *pctx); 334e214a596352e67c89ce379a1e5a060dbc1ce31e1Eric Anholtvoid vc4_job_init(struct vc4_context *vc4); 335e214a596352e67c89ce379a1e5a060dbc1ce31e1Eric Anholtvoid vc4_job_submit(struct vc4_context *vc4); 336e214a596352e67c89ce379a1e5a060dbc1ce31e1Eric Anholtvoid vc4_job_reset(struct vc4_context *vc4); 337a71c3b885a532016aa426b5bb753291cffe39a44Eric Anholtbool vc4_cl_references_bo(struct pipe_context *pctx, struct vc4_bo *bo); 3381850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid vc4_emit_state(struct pipe_context *pctx); 33971e5ba9c011939c962018af7f3ca78b600c95148Eric Anholtvoid vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c); 34071e5ba9c011939c962018af7f3ca78b600c95148Eric Anholtstruct qpu_reg *vc4_register_allocate(struct vc4_context *vc4, struct vc4_compile *c); 341ba875b3a0d8119fda030dfdc28cd831d9ca51e08Eric Anholtvoid vc4_update_compiled_shaders(struct vc4_context *vc4, uint8_t prim_mode); 3421850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 343b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtbool vc4_rt_format_supported(enum pipe_format f); 344b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtbool vc4_rt_format_is_565(enum pipe_format f); 345b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtbool vc4_tex_format_supported(enum pipe_format f); 346b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtuint8_t vc4_get_tex_format(enum pipe_format f); 347b064c9103d8fc0bb4ae8fe597b4d9de82a274638Eric Anholtconst uint8_t *vc4_get_format_swizzle(enum pipe_format f); 348b65761f764f2c03b375460b3d6e36227ec161c2dEric Anholtvoid vc4_init_query_functions(struct vc4_context *vc4); 34943b20795b742b9f1608dd6f2dc586337408760adEric Anholtvoid vc4_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info); 3501850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#endif /* VC4_CONTEXT_H */ 351