1bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König/*
2bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Copyright 2012 Advanced Micro Devices, Inc.
3bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König *
4bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Permission is hereby granted, free of charge, to any person obtaining a
5bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * copy of this software and associated documentation files (the "Software"),
6bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * to deal in the Software without restriction, including without limitation
7bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * on the rights to use, copy, modify, merge, publish, distribute, sub
8bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * license, and/or sell copies of the Software, and to permit persons to whom
9bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * the Software is furnished to do so, subject to the following conditions:
10bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König *
11bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * The above copyright notice and this permission notice (including the next
12bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * paragraph) shall be included in all copies or substantial portions of the
13bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Software.
14bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König *
15bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * USE OR OTHER DEALINGS IN THE SOFTWARE.
22bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König *
23bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Authors:
24bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König *      Christian König <christian.koenig@amd.com>
25bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König */
26bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König
27bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#ifndef SI_STATE_H
28bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#define SI_STATE_H
29bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König
30bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#include "radeonsi_pm4.h"
31bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König
3263636ae52aefc275115d1f3daac4e75285583485Christian Königstruct si_state_blend {
3363636ae52aefc275115d1f3daac4e75285583485Christian König	struct si_pm4_state	pm4;
3463636ae52aefc275115d1f3daac4e75285583485Christian König	uint32_t		cb_target_mask;
3563636ae52aefc275115d1f3daac4e75285583485Christian König	uint32_t		cb_color_control;
3663636ae52aefc275115d1f3daac4e75285583485Christian König};
3763636ae52aefc275115d1f3daac4e75285583485Christian König
387e011d92c9746ba4050890442db6e504fa42c4adChristian Königstruct si_state_viewport {
397e011d92c9746ba4050890442db6e504fa42c4adChristian König	struct si_pm4_state		pm4;
407e011d92c9746ba4050890442db6e504fa42c4adChristian König	struct pipe_viewport_state	viewport;
417e011d92c9746ba4050890442db6e504fa42c4adChristian König};
427e011d92c9746ba4050890442db6e504fa42c4adChristian König
43f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstruct si_state_rasterizer {
44f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	struct si_pm4_state	pm4;
45f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	bool			flatshade;
46f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	unsigned		sprite_coord_enable;
47f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	unsigned		pa_sc_line_stipple;
48f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	unsigned		pa_su_sc_mode_cntl;
49f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	unsigned		pa_cl_clip_cntl;
50f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	unsigned		pa_cl_vs_out_cntl;
51f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	float			offset_units;
52f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	float			offset_scale;
53f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König};
54f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
55b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstruct si_state_dsa {
56b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	struct si_pm4_state	pm4;
57b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	unsigned		alpha_ref;
58b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	unsigned		db_render_override;
59b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	unsigned		db_render_control;
60b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	uint8_t			valuemask[2];
61b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	uint8_t			writemask[2];
62b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König};
63b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
643c09f11e5cefd437bb8185539430786dc245c96fChristian Königstruct si_vertex_element
653c09f11e5cefd437bb8185539430786dc245c96fChristian König{
66b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	unsigned			count;
67b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	uint32_t			rsrc_word3[PIPE_MAX_ATTRIBS];
68b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	struct pipe_vertex_element	elements[PIPE_MAX_ATTRIBS];
693c09f11e5cefd437bb8185539430786dc245c96fChristian König};
703c09f11e5cefd437bb8185539430786dc245c96fChristian König
71bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian Königunion si_state {
72bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König	struct {
73583c212115795bef65da92761180ce830fafc927Christian König		struct si_pm4_state		*sync;
74840f05da6b92ba5266385836533842b9a9fc5da9Christian König		struct si_pm4_state		*init;
757e011d92c9746ba4050890442db6e504fa42c4adChristian König		struct si_state_blend		*blend;
767e011d92c9746ba4050890442db6e504fa42c4adChristian König		struct si_pm4_state		*blend_color;
777e011d92c9746ba4050890442db6e504fa42c4adChristian König		struct si_pm4_state		*clip;
787e011d92c9746ba4050890442db6e504fa42c4adChristian König		struct si_pm4_state		*scissor;
797e011d92c9746ba4050890442db6e504fa42c4adChristian König		struct si_state_viewport	*viewport;
80835098a5290e59bb7b468eb987db67b0e1913c67Christian König		struct si_pm4_state		*framebuffer;
81f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		struct si_state_rasterizer	*rasterizer;
82b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		struct si_state_dsa		*dsa;
83bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		struct si_pm4_state		*fb_rs;
8476660dfccede74782ac0d409da171ddbd61fae41Christian König		struct si_pm4_state		*fb_blend;
85e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		struct si_pm4_state		*dsa_stencil_ref;
863c09f11e5cefd437bb8185539430786dc245c96fChristian König		struct si_pm4_state		*vs;
870d6b0b512acadbc5d64039063b5649fc401b3367Christian König		struct si_pm4_state		*vs_const;
880d6b0b512acadbc5d64039063b5649fc401b3367Christian König		struct si_pm4_state		*ps;
89baf20397569fb499f736e5ad2350b008b8207fadChristian König		struct si_pm4_state		*ps_sampler_views;
900d6b0b512acadbc5d64039063b5649fc401b3367Christian König		struct si_pm4_state		*ps_sampler;
910d6b0b512acadbc5d64039063b5649fc401b3367Christian König		struct si_pm4_state		*ps_const;
92bd2a5cf328c21f2d5b243442ee2eac73a996b15cChristian König		struct si_pm4_state		*spi;
93ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		struct si_pm4_state		*vertex_buffers;
949b213c871a080472660eff271c72a3fcc5d3f578Christian König		struct si_pm4_state		*texture_barrier;
95e4e6f954ae8c83251c39da4327c29ba12fca8236Christian König		struct si_pm4_state		*draw_info;
969f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		struct si_pm4_state		*draw;
97bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König	} named;
98bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König	struct si_pm4_state	*array[0];
99bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König};
100bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König
101bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#define si_pm4_block_idx(member) \
102bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König	(offsetof(union si_state, named.member) / sizeof(struct si_pm4_state *))
103bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König
104bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#define si_pm4_bind_state(rctx, member, value) \
105bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König	do { \
106bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König		(rctx)->queued.named.member = (value); \
10784fdda280f4361add3802476ce9a30ac1c0b4c69Michel Dänzer	} while(0)
108bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König
109bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#define si_pm4_delete_state(rctx, member, value) \
110bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König	do { \
111bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König		if ((rctx)->queued.named.member == (value)) { \
112bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König			(rctx)->queued.named.member = NULL; \
113bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König		} \
114bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König		si_pm4_free_state(rctx, (struct si_pm4_state *)(value), \
115bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König				  si_pm4_block_idx(member)); \
11684fdda280f4361add3802476ce9a30ac1c0b4c69Michel Dänzer	} while(0)
117bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König
118bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#define si_pm4_set_state(rctx, member, value) \
119bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König	do { \
120bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König		if ((rctx)->queued.named.member != (value)) { \
121bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König			si_pm4_free_state(rctx, \
122bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König				(struct si_pm4_state *)(rctx)->queued.named.member, \
123bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König				si_pm4_block_idx(member)); \
124bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König			(rctx)->queued.named.member = (value); \
125bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König		} \
12684fdda280f4361add3802476ce9a30ac1c0b4c69Michel Dänzer	} while(0)
127bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König
128ca9cf611b63e5576b596c21b73b1b639d250d649Christian König/* si_state.c */
129d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstruct si_pipe_shader_selector;
130d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
13153d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königbool si_is_format_supported(struct pipe_screen *screen,
13253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    enum pipe_format format,
13353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    enum pipe_texture_target target,
13453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    unsigned sample_count,
13553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    unsigned usage);
136d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerint si_shader_select(struct pipe_context *ctx,
137d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		     struct si_pipe_shader_selector *sel,
138d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		     unsigned *dirty);
13963636ae52aefc275115d1f3daac4e75285583485Christian Königvoid si_init_state_functions(struct r600_context *rctx);
140840f05da6b92ba5266385836533842b9a9fc5da9Christian Königvoid si_init_config(struct r600_context *rctx);
141ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
142303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König/* si_state_streamout.c */
143303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königstruct pipe_stream_output_target *
144303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königsi_create_so_target(struct pipe_context *ctx,
145303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		    struct pipe_resource *buffer,
146303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		    unsigned buffer_offset,
147303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		    unsigned buffer_size);
148303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königvoid si_so_target_destroy(struct pipe_context *ctx,
149303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			  struct pipe_stream_output_target *target);
150303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königvoid si_set_so_targets(struct pipe_context *ctx,
151303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		       unsigned num_targets,
152303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		       struct pipe_stream_output_target **targets,
153303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		       unsigned append_bitmask);
154303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
155ca9cf611b63e5576b596c21b73b1b639d250d649Christian König/* si_state_draw.c */
156ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königvoid si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo);
15763636ae52aefc275115d1f3daac4e75285583485Christian König
158583c212115795bef65da92761180ce830fafc927Christian König/* si_commands.c */
159583c212115795bef65da92761180ce830fafc927Christian Königvoid si_cmd_surface_sync(struct si_pm4_state *pm4, uint32_t cp_coher_cntl);
160583c212115795bef65da92761180ce830fafc927Christian König
161bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#endif
162