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#include "pipe/p_state.h" 261850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "util/u_inlines.h" 271850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "util/u_math.h" 281850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "util/u_memory.h" 291850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "util/u_helpers.h" 301850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 311850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt#include "vc4_context.h" 321850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 331850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void * 341850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_generic_cso_state_create(const void *src, uint32_t size) 351850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 361850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt void *dst = calloc(1, size); 371850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt if (!dst) 381850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return NULL; 391850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt memcpy(dst, src, size); 401850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return dst; 411850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 421850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 431850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 441850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_generic_cso_state_delete(struct pipe_context *pctx, void *hwcso) 451850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 461850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt free(hwcso); 471850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 501850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_set_blend_color(struct pipe_context *pctx, 511850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_blend_color *blend_color) 521850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 531850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 5470b06fb5d55d639fd74596a2ff6971cb57c030caEric Anholt vc4->blend_color.f = *blend_color; 5570b06fb5d55d639fd74596a2ff6971cb57c030caEric Anholt for (int i = 0; i < 4; i++) 5670b06fb5d55d639fd74596a2ff6971cb57c030caEric Anholt vc4->blend_color.ub[i] = float_to_ubyte(blend_color->color[i]); 571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_BLEND_COLOR; 581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_set_stencil_ref(struct pipe_context *pctx, 621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_stencil_ref *stencil_ref) 631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->stencil_ref =* stencil_ref; 661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_STENCIL_REF; 671850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 681850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 691850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 701850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_set_clip_state(struct pipe_context *pctx, 711850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_clip_state *clip) 721850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 73201d4c0b2a6f7f0c1d59c4fd5cce4916fc48a2d2Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 74201d4c0b2a6f7f0c1d59c4fd5cce4916fc48a2d2Eric Anholt vc4->clip = *clip; 75201d4c0b2a6f7f0c1d59c4fd5cce4916fc48a2d2Eric Anholt vc4->dirty |= VC4_DIRTY_CLIP; 761850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 771850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 781850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 791850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_set_sample_mask(struct pipe_context *pctx, unsigned sample_mask) 801850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 811850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 82a664233042e1ad343184a0c237c3bd7ac5010779Eric Anholt vc4->sample_mask = sample_mask & ((1 << VC4_MAX_SAMPLES) - 1); 831850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_SAMPLE_MASK; 841850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 851850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 867fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholtstatic uint16_t 877fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholtfloat_to_187_half(float f) 887fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt{ 897fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt return fui(f) >> 16; 907fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt} 917fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt 921850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void * 931850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_create_rasterizer_state(struct pipe_context *pctx, 941850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_rasterizer_state *cso) 951850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 961850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_rasterizer_state *so; 971850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 981850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so = CALLOC_STRUCT(vc4_rasterizer_state); 991850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt if (!so) 1001850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return NULL; 1011850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1021850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->base = *cso; 1031850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1041850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt if (!(cso->cull_face & PIPE_FACE_FRONT)) 1051850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->config_bits[0] |= VC4_CONFIG_BITS_ENABLE_PRIM_FRONT; 1061850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt if (!(cso->cull_face & PIPE_FACE_BACK)) 1071850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->config_bits[0] |= VC4_CONFIG_BITS_ENABLE_PRIM_BACK; 1081850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 10966b7bd60e01fd17a356bf26d69ea351261080586Eric Anholt /* Workaround: HW-2726 PTB does not handle zero-size points (BCM2835, 11066b7bd60e01fd17a356bf26d69ea351261080586Eric Anholt * BCM21553). 11166b7bd60e01fd17a356bf26d69ea351261080586Eric Anholt */ 1129476b11d6edc67403dd7c5aaddbc375400e02425Eric Anholt so->point_size = MAX2(cso->point_size, .125f); 1131850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 114602a3f92d4d695e116794597db81623a8fd4c653Eric Anholt if (cso->front_ccw) 1151850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->config_bits[0] |= VC4_CONFIG_BITS_CW_PRIMITIVES; 1161850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1177fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt if (cso->offset_tri) { 1181850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->config_bits[0] |= VC4_CONFIG_BITS_ENABLE_DEPTH_OFFSET; 1191850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1207fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt so->offset_units = float_to_187_half(cso->offset_units); 1217fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt so->offset_factor = float_to_187_half(cso->offset_scale); 1227fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt } 1237fa399f93af288bc0b9764819d4e5b6184e75d78Eric Anholt 124edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt if (cso->multisample) 125edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt so->config_bits[0] |= VC4_CONFIG_BITS_RASTERIZER_OVERSAMPLE_4X; 126edfd4d853a0d26bc0cde811de7b20116db7e66fcEric Anholt 1271850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return so; 1281850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 1291850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 1301850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt/* Blend state is baked into shaders. */ 1311850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void * 1321850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_create_blend_state(struct pipe_context *pctx, 1331850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_blend_state *cso) 1341850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 1351850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return vc4_generic_cso_state_create(cso, sizeof(*cso)); 1361850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 1371850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 13819589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt/** 13919589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt * The TLB_STENCIL_SETUP data has a little bitfield for common writemask 14019589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt * values, so you don't have to do a separate writemask setup. 14119589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt */ 14219589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholtstatic uint8_t 14319589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholttlb_stencil_setup_writemask(uint8_t mask) 14419589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt{ 14519589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt switch (mask) { 14619589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt case 0x1: return 0; 14719589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt case 0x3: return 1; 14819589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt case 0xf: return 2; 14919589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt case 0xff: return 3; 15019589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt default: return 0xff; 15119589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt } 15219589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt} 15319589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt 15419589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholtstatic uint32_t 15519589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholttlb_stencil_setup_bits(const struct pipe_stencil_state *state, 15619589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt uint8_t writemask_bits) 15719589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt{ 15819589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt static const uint8_t op_map[] = { 15919589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt [PIPE_STENCIL_OP_ZERO] = 0, 16019589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt [PIPE_STENCIL_OP_KEEP] = 1, 16119589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt [PIPE_STENCIL_OP_REPLACE] = 2, 16219589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt [PIPE_STENCIL_OP_INCR] = 3, 16319589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt [PIPE_STENCIL_OP_DECR] = 4, 16419589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt [PIPE_STENCIL_OP_INVERT] = 5, 16519589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt [PIPE_STENCIL_OP_INCR_WRAP] = 6, 16619589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt [PIPE_STENCIL_OP_DECR_WRAP] = 7, 16719589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt }; 16819589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt uint32_t bits = 0; 16919589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt 17019589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt if (writemask_bits != 0xff) 17119589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt bits |= writemask_bits << 28; 17219589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt bits |= op_map[state->zfail_op] << 25; 17319589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt bits |= op_map[state->zpass_op] << 22; 17419589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt bits |= op_map[state->fail_op] << 19; 17519589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt bits |= state->func << 16; 17619589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt /* Ref is filled in at uniform upload time */ 17719589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt bits |= state->valuemask << 0; 17819589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt 17919589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt return bits; 18019589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt} 18119589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt 1821850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void * 1831850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_create_depth_stencil_alpha_state(struct pipe_context *pctx, 1841850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_depth_stencil_alpha_state *cso) 1851850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 1864160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt struct vc4_depth_stencil_alpha_state *so; 1874160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt 1884160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt so = CALLOC_STRUCT(vc4_depth_stencil_alpha_state); 1894160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt if (!so) 1904160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt return NULL; 1914160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt 1924160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt so->base = *cso; 1934160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt 1943f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt /* We always keep the early Z state correct, since a later state using 1953f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt * early Z may want it. 1963f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt */ 1973f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt so->config_bits[2] |= VC4_CONFIG_BITS_EARLY_Z_UPDATE; 1983f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt 1994160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt if (cso->depth.enabled) { 2004160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt if (cso->depth.writemask) { 2014160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt so->config_bits[1] |= VC4_CONFIG_BITS_Z_UPDATE; 2024160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt } 2034160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt so->config_bits[1] |= (cso->depth.func << 2044160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt VC4_CONFIG_BITS_DEPTH_FUNC_SHIFT); 2053f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt 2063f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt /* We only handle early Z in the < direction because otherwise 2073f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt * we'd have to runtime guess which direction to set in the 2083f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt * render config. 2093f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt */ 2103f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt if ((cso->depth.func == PIPE_FUNC_LESS || 2113f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt cso->depth.func == PIPE_FUNC_LEQUAL) && 2123f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt (!cso->stencil[0].enabled || 2133f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt (cso->stencil[0].zfail_op == PIPE_STENCIL_OP_KEEP && 2143f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt (!cso->stencil[1].enabled || 2153f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt cso->stencil[1].zfail_op == PIPE_STENCIL_OP_KEEP)))) { 2163f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt so->config_bits[2] |= VC4_CONFIG_BITS_EARLY_Z; 2173f6b008168d2edcb673fefba53031d4bfaa0982eEric Anholt } 2184160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt } else { 2194160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt so->config_bits[1] |= (PIPE_FUNC_ALWAYS << 2204160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt VC4_CONFIG_BITS_DEPTH_FUNC_SHIFT); 2214160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt } 2224160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt 22319589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt if (cso->stencil[0].enabled) { 22419589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt const struct pipe_stencil_state *front = &cso->stencil[0]; 22519589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt const struct pipe_stencil_state *back = &cso->stencil[1]; 22619589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt 22719589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt uint8_t front_writemask_bits = 22819589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt tlb_stencil_setup_writemask(front->writemask); 22948f6351940ff62c29fff618cec722e845acc86d5Eric Anholt uint8_t back_writemask = front->writemask; 23048f6351940ff62c29fff618cec722e845acc86d5Eric Anholt uint8_t back_writemask_bits = front_writemask_bits; 23119589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt 23219589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt so->stencil_uniforms[0] = 23319589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt tlb_stencil_setup_bits(front, front_writemask_bits); 23419589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt if (back->enabled) { 23548f6351940ff62c29fff618cec722e845acc86d5Eric Anholt back_writemask = back->writemask; 23648f6351940ff62c29fff618cec722e845acc86d5Eric Anholt back_writemask_bits = 23748f6351940ff62c29fff618cec722e845acc86d5Eric Anholt tlb_stencil_setup_writemask(back->writemask); 23848f6351940ff62c29fff618cec722e845acc86d5Eric Anholt 23919589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt so->stencil_uniforms[0] |= (1 << 30); 24019589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt so->stencil_uniforms[1] = 24119589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt tlb_stencil_setup_bits(back, back_writemask_bits); 24219589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt so->stencil_uniforms[1] |= (2 << 30); 24319589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt } else { 24419589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt so->stencil_uniforms[0] |= (3 << 30); 24519589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt } 24619589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt 24719589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt if (front_writemask_bits == 0xff || 24819589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt back_writemask_bits == 0xff) { 249cc298023c9b302a7a24ee01fe2da1c93f5b44666Eric Anholt so->stencil_uniforms[2] = (front->writemask | 250cc298023c9b302a7a24ee01fe2da1c93f5b44666Eric Anholt (back_writemask << 8)); 25119589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt } 25219589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt } 25319589147ef660c0bf7fcc52ca82dfbbadf3a9a23Eric Anholt 2544160ac5ee41630a5c9fc4e1f3520f0fabf42cb14Eric Anholt return so; 2551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 2561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 2581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_set_polygon_stipple(struct pipe_context *pctx, 2591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_poly_stipple *stipple) 2601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 2611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 2621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->stipple = *stipple; 2631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_STIPPLE; 2641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 2651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 2671850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_set_scissor_states(struct pipe_context *pctx, 2681850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned start_slot, 2691850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned num_scissors, 2701850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_scissor_state *scissor) 2711850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 2721850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 2731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2741850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->scissor = *scissor; 2751850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_SCISSOR; 2761850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 2771850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2781850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 2791850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_set_viewport_states(struct pipe_context *pctx, 2801850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned start_slot, 2811850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned num_viewports, 2821850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_viewport_state *viewport) 2831850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 2841850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 2851850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->viewport = *viewport; 2861850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_VIEWPORT; 2871850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 2881850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2891850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 2901850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_set_vertex_buffers(struct pipe_context *pctx, 2911850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned start_slot, unsigned count, 2921850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_vertex_buffer *vb) 2931850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 2941850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 2951850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_vertexbuf_stateobj *so = &vc4->vertexbuf; 2961850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 2971850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, 2981850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt start_slot, count); 2991850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->count = util_last_bit(so->enabled_mask); 3001850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3011850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_VTXBUF; 3021850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 3031850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3041850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 3051850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_set_index_buffer(struct pipe_context *pctx, 3061850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_index_buffer *ib) 3071850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 3081850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 3091850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3101850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt if (ib) { 31110aacf5ae8f3e90e2f0967fbdcf96df93e346e20Eric Anholt pipe_resource_reference(&vc4->indexbuf.buffer, ib->buffer); 31210aacf5ae8f3e90e2f0967fbdcf96df93e346e20Eric Anholt vc4->indexbuf.index_size = ib->index_size; 313d78eb5752838979057a8a1210d6951c084904c0fEric Anholt vc4->indexbuf.offset = ib->offset; 31404c42f3ab56a19089b46dea48615aeef8b8225daEric Anholt vc4->indexbuf.user_buffer = ib->user_buffer; 3151850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt } else { 3161850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pipe_resource_reference(&vc4->indexbuf.buffer, NULL); 3171850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt } 3181850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3191850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_INDEXBUF; 3201850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 3211850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3221850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 3231850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_blend_state_bind(struct pipe_context *pctx, void *hwcso) 3241850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 3251850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 3261850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->blend = hwcso; 3271850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_BLEND; 3281850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 3291850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3301850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 3311850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_rasterizer_state_bind(struct pipe_context *pctx, void *hwcso) 3321850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 3331850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 33445b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt struct vc4_rasterizer_state *rast = hwcso; 33545b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt 33645b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt if (vc4->rasterizer && rast && 33745b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt vc4->rasterizer->base.flatshade != rast->base.flatshade) { 33845b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt vc4->dirty |= VC4_DIRTY_FLAT_SHADE_FLAGS; 33945b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt } 34045b104e0a228595142ed4bc62bbc8948100b9325Eric Anholt 3411850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->rasterizer = hwcso; 3421850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_RASTERIZER; 3431850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 3441850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3451850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 3461850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_zsa_state_bind(struct pipe_context *pctx, void *hwcso) 3471850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 3481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 3491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->zsa = hwcso; 3501850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_ZSA; 3511850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 3521850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3531850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void * 3541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_vertex_state_create(struct pipe_context *pctx, unsigned num_elements, 3551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_vertex_element *elements) 3561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 3571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_vertex_stateobj *so = CALLOC_STRUCT(vc4_vertex_stateobj); 3581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt if (!so) 3601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return NULL; 3611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt memcpy(so->pipe, elements, sizeof(*elements) * num_elements); 3631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->num_elements = num_elements; 3641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return so; 3661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 3671850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3681850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 3691850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_vertex_state_bind(struct pipe_context *pctx, void *hwcso) 3701850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 3711850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 3721850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->vtx = hwcso; 3731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_VTXSTATE; 3741850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 3751850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3761850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 3771850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_set_constant_buffer(struct pipe_context *pctx, uint shader, uint index, 378ef534b9389bc74b007d76d2a1776068d23e5b887Rob Clark const struct pipe_constant_buffer *cb) 3791850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 3801850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 3811850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_constbuf_stateobj *so = &vc4->constbuf[shader]; 3821850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3831850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt assert(index == 0); 3841850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3851850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt /* Note that the state tracker can unbind constant buffers by 3861850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt * passing NULL here. 3871850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt */ 3881850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt if (unlikely(!cb)) { 3891850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->enabled_mask &= ~(1 << index); 3901850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->dirty_mask &= ~(1 << index); 3911850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return; 3921850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt } 3931850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 394792d1c92df6f58f219eb8b77e668424cdcc9c9afEric Anholt assert(!cb->buffer); 3951850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->cb[index].buffer_offset = cb->buffer_offset; 3961850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->cb[index].buffer_size = cb->buffer_size; 3971850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->cb[index].user_buffer = cb->user_buffer; 3981850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 3991850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->enabled_mask |= 1 << index; 4001850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt so->dirty_mask |= 1 << index; 4011850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_CONSTBUF; 4021850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 4031850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 4041850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 4051850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_set_framebuffer_state(struct pipe_context *pctx, 4061850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_framebuffer_state *framebuffer) 4071850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 4081850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 4091850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_framebuffer_state *cso = &vc4->framebuffer; 4101850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned i; 4111850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 412f597ac3966405934e13a9aaa18c73211b5a40c7cEric Anholt vc4->job = NULL; 4131850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 4141850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt for (i = 0; i < framebuffer->nr_cbufs; i++) 4151850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pipe_surface_reference(&cso->cbufs[i], framebuffer->cbufs[i]); 4161850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt for (; i < vc4->framebuffer.nr_cbufs; i++) 4171850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pipe_surface_reference(&cso->cbufs[i], NULL); 4181850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 4191850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt cso->nr_cbufs = framebuffer->nr_cbufs; 4201850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 42167aea92964ed06f10097271822f4a16378138be5Eric Anholt pipe_surface_reference(&cso->zsbuf, framebuffer->zsbuf); 42267aea92964ed06f10097271822f4a16378138be5Eric Anholt 4231850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt cso->width = framebuffer->width; 4241850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt cso->height = framebuffer->height; 4251850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 42667aea92964ed06f10097271822f4a16378138be5Eric Anholt /* Nonzero texture mipmap levels are laid out as if they were in 42767aea92964ed06f10097271822f4a16378138be5Eric Anholt * power-of-two-sized spaces. The renderbuffer config infers its 42867aea92964ed06f10097271822f4a16378138be5Eric Anholt * stride from the width parameter, so we need to configure our 42967aea92964ed06f10097271822f4a16378138be5Eric Anholt * framebuffer. Note that if the z/color buffers were mismatched 43067aea92964ed06f10097271822f4a16378138be5Eric Anholt * sizes, we wouldn't be able to do this. 43167aea92964ed06f10097271822f4a16378138be5Eric Anholt */ 432a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt if (cso->cbufs[0] && cso->cbufs[0]->u.tex.level) { 433a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt struct vc4_resource *rsc = 434a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt vc4_resource(cso->cbufs[0]->texture); 435a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt cso->width = 436a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt (rsc->slices[cso->cbufs[0]->u.tex.level].stride / 437a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt rsc->cpp); 438a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt } else if (cso->zsbuf && cso->zsbuf->u.tex.level){ 439a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt struct vc4_resource *rsc = 440a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt vc4_resource(cso->zsbuf->texture); 441a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt cso->width = 442a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt (rsc->slices[cso->zsbuf->u.tex.level].stride / 443a2d8b6dbd5359e5dc930e22ac21a92bf20587401Eric Anholt rsc->cpp); 44467aea92964ed06f10097271822f4a16378138be5Eric Anholt } 4451850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 4461850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_FRAMEBUFFER; 4471850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 4481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 4491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic struct vc4_texture_stateobj * 450532db3b7881f3dfcd299320cbf44443d06b88373Kai Wasserbächvc4_get_stage_tex(struct vc4_context *vc4, enum pipe_shader_type shader) 4511850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 4521850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt switch (shader) { 4531850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt case PIPE_SHADER_FRAGMENT: 4541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_FRAGTEX; 4551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return &vc4->fragtex; 4561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt break; 4571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt case PIPE_SHADER_VERTEX: 4581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt vc4->dirty |= VC4_DIRTY_VERTTEX; 4591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return &vc4->verttex; 4601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt break; 4611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt default: 4621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt fprintf(stderr, "Unknown shader target %d\n", shader); 4631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt abort(); 4641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt } 4651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 4661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 4677124feba1b879deb88dbf2baf600ed42309d9839Eric Anholtstatic uint32_t translate_wrap(uint32_t p_wrap, bool using_nearest) 4687124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt{ 4697124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt switch (p_wrap) { 4707124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt case PIPE_TEX_WRAP_REPEAT: 4717124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt return 0; 4727124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt case PIPE_TEX_WRAP_CLAMP_TO_EDGE: 4737124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt return 1; 4747124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt case PIPE_TEX_WRAP_MIRROR_REPEAT: 4757124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt return 2; 4767124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt case PIPE_TEX_WRAP_CLAMP_TO_BORDER: 4777124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt return 3; 4787124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt case PIPE_TEX_WRAP_CLAMP: 4797124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt return (using_nearest ? 1 : 3); 4807124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt default: 4817124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt fprintf(stderr, "Unknown wrap mode %d\n", p_wrap); 4827124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt assert(!"not reached"); 4837124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt return 0; 4847124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt } 4857124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt} 4867124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt 4871850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void * 4881850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_create_sampler_state(struct pipe_context *pctx, 4891850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_sampler_state *cso) 4901850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 4917124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt static const uint8_t minfilter_map[6] = { 4927124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_TEX_P1_MINFILT_NEAR_MIP_NEAR, 4937124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_TEX_P1_MINFILT_LIN_MIP_NEAR, 4947124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_TEX_P1_MINFILT_NEAR_MIP_LIN, 4957124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_TEX_P1_MINFILT_LIN_MIP_LIN, 4967124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_TEX_P1_MINFILT_NEAREST, 4977124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_TEX_P1_MINFILT_LINEAR, 4987124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt }; 4997124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt static const uint32_t magfilter_map[] = { 5007124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt [PIPE_TEX_FILTER_NEAREST] = VC4_TEX_P1_MAGFILT_NEAREST, 5017124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt [PIPE_TEX_FILTER_LINEAR] = VC4_TEX_P1_MAGFILT_LINEAR, 5027124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt }; 5037124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt bool either_nearest = 5047124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt (cso->mag_img_filter == PIPE_TEX_MIPFILTER_NEAREST || 5057124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt cso->min_img_filter == PIPE_TEX_MIPFILTER_NEAREST); 5067124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt struct vc4_sampler_state *so = CALLOC_STRUCT(vc4_sampler_state); 5077124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt 5087124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt if (!so) 5097124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt return NULL; 5107124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt 5117124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt memcpy(so, cso, sizeof(*cso)); 5127124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt 5137124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt so->texture_p1 = 5147124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt (VC4_SET_FIELD(magfilter_map[cso->mag_img_filter], 5157124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_TEX_P1_MAGFILT) | 5167124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_SET_FIELD(minfilter_map[cso->min_mip_filter * 2 + 5177124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt cso->min_img_filter], 5187124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_TEX_P1_MINFILT) | 5197124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_SET_FIELD(translate_wrap(cso->wrap_s, either_nearest), 5207124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_TEX_P1_WRAP_S) | 5217124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_SET_FIELD(translate_wrap(cso->wrap_t, either_nearest), 5227124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt VC4_TEX_P1_WRAP_T)); 5237124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt 5247124feba1b879deb88dbf2baf600ed42309d9839Eric Anholt return so; 5251850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 5261850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 5271850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 5281850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_sampler_states_bind(struct pipe_context *pctx, 5297413625ad357c87f409cd1673b40f8dffbc43259Kai Wasserbäch enum pipe_shader_type shader, unsigned start, 5301850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned nr, void **hwcso) 5311850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 5321850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 5331850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_texture_stateobj *stage_tex = vc4_get_stage_tex(vc4, shader); 5341850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 5351850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt assert(start == 0); 5361850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned i; 5371850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned new_nr = 0; 5381850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 5391850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt for (i = 0; i < nr; i++) { 5401850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt if (hwcso[i]) 5411850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt new_nr = i + 1; 5421850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt stage_tex->samplers[i] = hwcso[i]; 5431850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt } 5441850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 5451850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt for (; i < stage_tex->num_samplers; i++) { 5461850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt stage_tex->samplers[i] = NULL; 5471850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt } 5481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 5491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt stage_tex->num_samplers = new_nr; 5501850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 5511850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 5521850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic struct pipe_sampler_view * 5531850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc, 5541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt const struct pipe_sampler_view *cso) 5551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 55626ff7e373f5675a0a60c97a11ef557ad8b1bfbe5Eric Anholt struct vc4_sampler_view *so = CALLOC_STRUCT(vc4_sampler_view); 55744b63cf5c051f7eccfc1d7427247fd58dabb7761Eric Anholt struct vc4_resource *rsc = vc4_resource(prsc); 5581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 5591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt if (!so) 5601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt return NULL; 5611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 5620f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt so->base = *cso; 563572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt 5641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pipe_reference(NULL, &prsc->reference); 565572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt 566572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt /* There is no hardware level clamping, and the start address of a 567572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt * texture may be misaligned, so in that case we have to copy to a 568572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt * temporary. 56944b63cf5c051f7eccfc1d7427247fd58dabb7761Eric Anholt * 57044b63cf5c051f7eccfc1d7427247fd58dabb7761Eric Anholt * Also, Raspberry Pi doesn't support sampling from raster textures, 57144b63cf5c051f7eccfc1d7427247fd58dabb7761Eric Anholt * so we also have to copy to a temporary then. 572572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt */ 5733bcd0f1912a60cc9d3813923d18d29465e41ff56Eric Anholt if ((cso->u.tex.first_level && 5743bcd0f1912a60cc9d3813923d18d29465e41ff56Eric Anholt (cso->u.tex.first_level != cso->u.tex.last_level)) || 57544b63cf5c051f7eccfc1d7427247fd58dabb7761Eric Anholt rsc->vc4_format == VC4_TEXTURE_TYPE_RGBA32R) { 576572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt struct vc4_resource *shadow_parent = vc4_resource(prsc); 577572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt struct pipe_resource tmpl = shadow_parent->base.b; 578572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt struct vc4_resource *clone; 579572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt 580b0edc19a521853371a63e9ffbc519424c8f82942Eric Anholt tmpl.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET; 5810f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt tmpl.width0 = u_minify(tmpl.width0, cso->u.tex.first_level); 5820f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt tmpl.height0 = u_minify(tmpl.height0, cso->u.tex.first_level); 5830f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt tmpl.last_level = cso->u.tex.last_level - cso->u.tex.first_level; 584572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt 585572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt prsc = vc4_resource_create(pctx->screen, &tmpl); 5865980389bbf98b8186ba6a06392d92b82fa9efad3Eric Anholt if (!prsc) { 5875980389bbf98b8186ba6a06392d92b82fa9efad3Eric Anholt free(so); 5885980389bbf98b8186ba6a06392d92b82fa9efad3Eric Anholt return NULL; 5895980389bbf98b8186ba6a06392d92b82fa9efad3Eric Anholt } 5900f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt rsc = vc4_resource(prsc); 591572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt clone = vc4_resource(prsc); 592572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt clone->shadow_parent = &shadow_parent->base.b; 593572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt /* Flag it as needing update of the contents from the parent. */ 594572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt clone->writes = shadow_parent->writes - 1; 595b0edc19a521853371a63e9ffbc519424c8f82942Eric Anholt 596b0edc19a521853371a63e9ffbc519424c8f82942Eric Anholt assert(clone->vc4_format != VC4_TEXTURE_TYPE_RGBA32R); 5973bcd0f1912a60cc9d3813923d18d29465e41ff56Eric Anholt } else if (cso->u.tex.first_level) { 5983bcd0f1912a60cc9d3813923d18d29465e41ff56Eric Anholt so->force_first_level = true; 599572fba95e4cd85aebdde9bd757c17f719af2af04Eric Anholt } 6000f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt so->base.texture = prsc; 6010f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt so->base.reference.count = 1; 6020f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt so->base.context = pctx; 6030f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt 6040f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt so->texture_p0 = 6050f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt (VC4_SET_FIELD(rsc->slices[0].offset >> 12, VC4_TEX_P0_OFFSET) | 6060f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt VC4_SET_FIELD(rsc->vc4_format & 15, VC4_TEX_P0_TYPE) | 6073bcd0f1912a60cc9d3813923d18d29465e41ff56Eric Anholt VC4_SET_FIELD(so->force_first_level ? 6083bcd0f1912a60cc9d3813923d18d29465e41ff56Eric Anholt cso->u.tex.last_level : 6093bcd0f1912a60cc9d3813923d18d29465e41ff56Eric Anholt cso->u.tex.last_level - 6100f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt cso->u.tex.first_level, VC4_TEX_P0_MIPLVLS) | 6110f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt VC4_SET_FIELD(cso->target == PIPE_TEXTURE_CUBE, 6120f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt VC4_TEX_P0_CMMODE)); 6130f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt so->texture_p1 = 6140f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt (VC4_SET_FIELD(rsc->vc4_format >> 4, VC4_TEX_P1_TYPE4) | 6150f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt VC4_SET_FIELD(prsc->height0 & 2047, VC4_TEX_P1_HEIGHT) | 6160f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt VC4_SET_FIELD(prsc->width0 & 2047, VC4_TEX_P1_WIDTH)); 6170f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt 61880157466cd56bfaeadbdcac497b04c16c2732a3bEric Anholt if (prsc->format == PIPE_FORMAT_ETC1_RGB8) 61980157466cd56bfaeadbdcac497b04c16c2732a3bEric Anholt so->texture_p1 |= VC4_TEX_P1_ETCFLIP_MASK; 62080157466cd56bfaeadbdcac497b04c16c2732a3bEric Anholt 6210f4d2b0a2dd3fa39426f2789bf2a8fc939adf001Eric Anholt return &so->base; 6221850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 6231850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6241850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 6251850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_sampler_view_destroy(struct pipe_context *pctx, 6261850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_sampler_view *view) 6271850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 6281850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pipe_resource_reference(&view->texture, NULL); 6291850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt free(view); 6301850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 6311850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6321850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtstatic void 633532db3b7881f3dfcd299320cbf44443d06b88373Kai Wasserbächvc4_set_sampler_views(struct pipe_context *pctx, 634532db3b7881f3dfcd299320cbf44443d06b88373Kai Wasserbäch enum pipe_shader_type shader, 6351850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned start, unsigned nr, 6361850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct pipe_sampler_view **views) 6371850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 6381850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_context *vc4 = vc4_context(pctx); 6391850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt struct vc4_texture_stateobj *stage_tex = vc4_get_stage_tex(vc4, shader); 6401850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned i; 6411850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt unsigned new_nr = 0; 6421850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6431850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt assert(start == 0); 6441850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6451850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt for (i = 0; i < nr; i++) { 6463a728d4dfbd727c30f36116772803674beffcbb6Eric Anholt if (views[i]) 6471850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt new_nr = i + 1; 6481850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pipe_sampler_view_reference(&stage_tex->textures[i], views[i]); 6491850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt } 6501850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6511850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt for (; i < stage_tex->num_textures; i++) { 6521850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pipe_sampler_view_reference(&stage_tex->textures[i], NULL); 6531850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt } 6541850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6551850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt stage_tex->num_textures = new_nr; 6561850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 6571850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6581850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvoid 6591850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholtvc4_state_init(struct pipe_context *pctx) 6601850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt{ 6611850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_blend_color = vc4_set_blend_color; 6621850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_stencil_ref = vc4_set_stencil_ref; 6631850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_clip_state = vc4_set_clip_state; 6641850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_sample_mask = vc4_set_sample_mask; 6651850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_constant_buffer = vc4_set_constant_buffer; 6661850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_framebuffer_state = vc4_set_framebuffer_state; 6671850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_polygon_stipple = vc4_set_polygon_stipple; 6681850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_scissor_states = vc4_set_scissor_states; 6691850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_viewport_states = vc4_set_viewport_states; 6701850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6711850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_vertex_buffers = vc4_set_vertex_buffers; 6721850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_index_buffer = vc4_set_index_buffer; 6731850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6741850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->create_blend_state = vc4_create_blend_state; 6751850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->bind_blend_state = vc4_blend_state_bind; 6761850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->delete_blend_state = vc4_generic_cso_state_delete; 6771850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6781850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->create_rasterizer_state = vc4_create_rasterizer_state; 6791850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->bind_rasterizer_state = vc4_rasterizer_state_bind; 6801850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->delete_rasterizer_state = vc4_generic_cso_state_delete; 6811850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6821850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->create_depth_stencil_alpha_state = vc4_create_depth_stencil_alpha_state; 6831850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->bind_depth_stencil_alpha_state = vc4_zsa_state_bind; 6841850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->delete_depth_stencil_alpha_state = vc4_generic_cso_state_delete; 6851850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6861850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->create_vertex_elements_state = vc4_vertex_state_create; 6871850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->delete_vertex_elements_state = vc4_generic_cso_state_delete; 6881850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->bind_vertex_elements_state = vc4_vertex_state_bind; 6891850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6901850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->create_sampler_state = vc4_create_sampler_state; 6911850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->delete_sampler_state = vc4_generic_cso_state_delete; 6921850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->bind_sampler_states = vc4_sampler_states_bind; 6931850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt 6941850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->create_sampler_view = vc4_create_sampler_view; 6951850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->sampler_view_destroy = vc4_sampler_view_destroy; 6961850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt pctx->set_sampler_views = vc4_set_sampler_views; 6971850d0a1cbf044dc4d29b7a9ede2c634f667d853Eric Anholt} 698