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