161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */ 261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark/* 461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * Copyright (C) 2014 Rob Clark <robclark@freedesktop.org> 561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * 661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * Permission is hereby granted, free of charge, to any person obtaining a 761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * copy of this software and associated documentation files (the "Software"), 861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * to deal in the Software without restriction, including without limitation 961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * and/or sell copies of the Software, and to permit persons to whom the 1161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * Software is furnished to do so, subject to the following conditions: 1261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * 1361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * The above copyright notice and this permission notice (including the next 1461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * paragraph) shall be included in all copies or substantial portions of the 1561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * Software. 1661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * 1761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 2261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 2361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * SOFTWARE. 2461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * 2561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * Authors: 2661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * Rob Clark <robclark@freedesktop.org> 2761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark */ 2861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 2961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#ifndef FD4_EMIT_H 3061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#define FD4_EMIT_H 3161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 3261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#include "pipe/p_context.h" 3361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 3461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#include "freedreno_context.h" 35e9589a8fcf60f9d04ea31e6f84f43f9d10a636daRob Clark#include "fd4_format.h" 3661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#include "fd4_program.h" 3761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#include "ir3_shader.h" 3861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 3961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkstruct fd_ringbuffer; 4061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 4161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkvoid fd4_emit_gmem_restore_tex(struct fd_ringbuffer *ring, 42054526e49abb5e7fd49fed6f589cff6f1ab4c9f6Rob Clark unsigned nr_bufs, struct pipe_surface **bufs); 4361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 4461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark/* grouped together emit-state for prog/vertex/state emit: */ 4561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkstruct fd4_emit { 462578e3edcb83511d46427591343369b1bdfbcaf3Rob Clark struct pipe_debug_callback *debug; 4761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark const struct fd_vertex_state *vtx; 4861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark const struct fd_program_stateobj *prog; 4961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark const struct pipe_draw_info *info; 5061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark struct ir3_shader_key key; 5161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark uint32_t dirty; 5261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 538885f2befaea68ce7f9d550c9b9ff5ae77524406Rob Clark uint32_t sprite_coord_enable; /* bitmask */ 548885f2befaea68ce7f9d550c9b9ff5ae77524406Rob Clark bool sprite_coord_mode; 558885f2befaea68ce7f9d550c9b9ff5ae77524406Rob Clark bool rasterflat; 56868b66fce7a156efda840c00088f89f4ba6163c9Rob Clark bool no_decode_srgb; 578885f2befaea68ce7f9d550c9b9ff5ae77524406Rob Clark 5861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark /* cached to avoid repeated lookups of same variants: */ 595b955f09f72b2217576ea8980a3d8fd3ba63854aRob Clark const struct ir3_shader_variant *vp, *fp; 6061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark /* TODO: other shader stages.. */ 6161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark}; 6261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 633e698ebf44b443f28badf7443cf9516fc404871dRob Clarkstatic inline enum a4xx_color_fmt fd4_emit_format(struct pipe_surface *surf) 643e698ebf44b443f28badf7443cf9516fc404871dRob Clark{ 653e698ebf44b443f28badf7443cf9516fc404871dRob Clark if (!surf) 663e698ebf44b443f28badf7443cf9516fc404871dRob Clark return 0; 673e698ebf44b443f28badf7443cf9516fc404871dRob Clark return fd4_pipe2color(surf->format); 683e698ebf44b443f28badf7443cf9516fc404871dRob Clark} 693e698ebf44b443f28badf7443cf9516fc404871dRob Clark 705b955f09f72b2217576ea8980a3d8fd3ba63854aRob Clarkstatic inline const struct ir3_shader_variant * 7161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkfd4_emit_get_vp(struct fd4_emit *emit) 7261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark{ 7361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark if (!emit->vp) { 7461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark struct fd4_shader_stateobj *so = emit->prog->vp; 75663c0e5155e9916b10163c102f0ece4eda5c3154Rob Clark emit->vp = ir3_shader_variant(so->shader, emit->key, emit->debug); 7661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark } 7761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark return emit->vp; 7861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark} 7961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 805b955f09f72b2217576ea8980a3d8fd3ba63854aRob Clarkstatic inline const struct ir3_shader_variant * 8161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkfd4_emit_get_fp(struct fd4_emit *emit) 8261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark{ 8361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark if (!emit->fp) { 84dd9135c452a2a457fb6cabf7de573075d22a869aRob Clark if (emit->key.binning_pass) { 85dd9135c452a2a457fb6cabf7de573075d22a869aRob Clark /* use dummy stateobj to simplify binning vs non-binning: */ 86dd9135c452a2a457fb6cabf7de573075d22a869aRob Clark static const struct ir3_shader_variant binning_fp = {}; 87dd9135c452a2a457fb6cabf7de573075d22a869aRob Clark emit->fp = &binning_fp; 88dd9135c452a2a457fb6cabf7de573075d22a869aRob Clark } else { 89dd9135c452a2a457fb6cabf7de573075d22a869aRob Clark struct fd4_shader_stateobj *so = emit->prog->fp; 90663c0e5155e9916b10163c102f0ece4eda5c3154Rob Clark emit->fp = ir3_shader_variant(so->shader, emit->key, emit->debug); 91dd9135c452a2a457fb6cabf7de573075d22a869aRob Clark } 9261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark } 9361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark return emit->fp; 9461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark} 9561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 9661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkvoid fd4_emit_vertex_bufs(struct fd_ringbuffer *ring, struct fd4_emit *emit); 9761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 9861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkvoid fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, 9961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark struct fd4_emit *emit); 10061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 1017f8fd02dc7cad1ddcfb610db10ffbb41e3e34e7dRob Clarkvoid fd4_emit_restore(struct fd_batch *batch, struct fd_ringbuffer *ring); 10261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark 10356462a30080c1f25a81ae566d59a25d2ad6bb809Rob Clarkvoid fd4_emit_init(struct pipe_context *pctx); 10456462a30080c1f25a81ae566d59a25d2ad6bb809Rob Clark 10561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#endif /* FD4_EMIT_H */ 106