1ce40e4726cf30196b87df387255c64ddc2a97638Christian König/*
2ce40e4726cf30196b87df387255c64ddc2a97638Christian König * Copyright 2012 Advanced Micro Devices, Inc.
3ce40e4726cf30196b87df387255c64ddc2a97638Christian König *
4ce40e4726cf30196b87df387255c64ddc2a97638Christian König * Permission is hereby granted, free of charge, to any person obtaining a
5ce40e4726cf30196b87df387255c64ddc2a97638Christian König * copy of this software and associated documentation files (the "Software"),
6ce40e4726cf30196b87df387255c64ddc2a97638Christian König * to deal in the Software without restriction, including without limitation
7ce40e4726cf30196b87df387255c64ddc2a97638Christian König * on the rights to use, copy, modify, merge, publish, distribute, sub
8ce40e4726cf30196b87df387255c64ddc2a97638Christian König * license, and/or sell copies of the Software, and to permit persons to whom
9ce40e4726cf30196b87df387255c64ddc2a97638Christian König * the Software is furnished to do so, subject to the following conditions:
10ce40e4726cf30196b87df387255c64ddc2a97638Christian König *
11ce40e4726cf30196b87df387255c64ddc2a97638Christian König * The above copyright notice and this permission notice (including the next
12ce40e4726cf30196b87df387255c64ddc2a97638Christian König * paragraph) shall be included in all copies or substantial portions of the
13ce40e4726cf30196b87df387255c64ddc2a97638Christian König * Software.
14ce40e4726cf30196b87df387255c64ddc2a97638Christian König *
15ce40e4726cf30196b87df387255c64ddc2a97638Christian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16ce40e4726cf30196b87df387255c64ddc2a97638Christian König * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17ce40e4726cf30196b87df387255c64ddc2a97638Christian König * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18ce40e4726cf30196b87df387255c64ddc2a97638Christian König * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19ce40e4726cf30196b87df387255c64ddc2a97638Christian König * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20ce40e4726cf30196b87df387255c64ddc2a97638Christian König * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21ce40e4726cf30196b87df387255c64ddc2a97638Christian König * USE OR OTHER DEALINGS IN THE SOFTWARE.
22ce40e4726cf30196b87df387255c64ddc2a97638Christian König *
23ce40e4726cf30196b87df387255c64ddc2a97638Christian König * Authors:
24ce40e4726cf30196b87df387255c64ddc2a97638Christian König *	Tom Stellard <thomas.stellard@amd.com>
25ce40e4726cf30196b87df387255c64ddc2a97638Christian König *	Michel Dänzer <michel.daenzer@amd.com>
26ce40e4726cf30196b87df387255c64ddc2a97638Christian König *      Christian König <christian.koenig@amd.com>
27ce40e4726cf30196b87df387255c64ddc2a97638Christian König */
28a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
29ce40e4726cf30196b87df387255c64ddc2a97638Christian König#ifndef RADEONSI_SHADER_H
30ce40e4726cf30196b87df387255c64ddc2a97638Christian König#define RADEONSI_SHADER_H
31a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
32ce40e4726cf30196b87df387255c64ddc2a97638Christian Königstruct si_shader_io {
33ce40e4726cf30196b87df387255c64ddc2a97638Christian König	unsigned		name;
34ce40e4726cf30196b87df387255c64ddc2a97638Christian König	int			sid;
35ce40e4726cf30196b87df387255c64ddc2a97638Christian König	unsigned		param_offset;
36ce40e4726cf30196b87df387255c64ddc2a97638Christian König	unsigned		interpolate;
37ce40e4726cf30196b87df387255c64ddc2a97638Christian König	bool			centroid;
38ce40e4726cf30196b87df387255c64ddc2a97638Christian König};
39ce40e4726cf30196b87df387255c64ddc2a97638Christian König
40d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstruct si_pipe_shader;
41d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
42d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstruct si_pipe_shader_selector {
43d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_pipe_shader *current;
44d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
45d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct tgsi_token       *tokens;
46d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct pipe_stream_output_info  so;
47d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
48d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	unsigned	num_shaders;
49d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
50d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	/* PIPE_SHADER_[VERTEX|FRAGMENT|...] */
51d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	unsigned	type;
52d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
53d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	/* 1 when the shader contains
54d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	 * TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS, otherwise it's 0.
55d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	 * Used to determine whether we need to include nr_cbufs in the key */
56d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	unsigned	fs_write_all;
57d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer};
58d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
59ce40e4726cf30196b87df387255c64ddc2a97638Christian Königstruct si_shader {
60ce40e4726cf30196b87df387255c64ddc2a97638Christian König	unsigned		ninput;
61ce40e4726cf30196b87df387255c64ddc2a97638Christian König	struct si_shader_io	input[32];
62ce40e4726cf30196b87df387255c64ddc2a97638Christian König
63ce40e4726cf30196b87df387255c64ddc2a97638Christian König	unsigned		noutput;
64ce40e4726cf30196b87df387255c64ddc2a97638Christian König	struct si_shader_io	output[32];
65ce40e4726cf30196b87df387255c64ddc2a97638Christian König
66ce40e4726cf30196b87df387255c64ddc2a97638Christian König	bool			uses_kill;
67ce40e4726cf30196b87df387255c64ddc2a97638Christian König	bool			fs_write_all;
68ce40e4726cf30196b87df387255c64ddc2a97638Christian König	unsigned		nr_cbufs;
69ce40e4726cf30196b87df387255c64ddc2a97638Christian König};
70ce40e4726cf30196b87df387255c64ddc2a97638Christian König
71ce40e4726cf30196b87df387255c64ddc2a97638Christian Königstruct si_pipe_shader {
72d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_pipe_shader_selector	*selector;
73d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_pipe_shader		*next_variant;
74ce40e4726cf30196b87df387255c64ddc2a97638Christian König	struct si_shader		shader;
75ce40e4726cf30196b87df387255c64ddc2a97638Christian König	struct si_pm4_state		*pm4;
76ce40e4726cf30196b87df387255c64ddc2a97638Christian König	struct si_resource		*bo;
77ce40e4726cf30196b87df387255c64ddc2a97638Christian König	unsigned			num_sgprs;
78ce40e4726cf30196b87df387255c64ddc2a97638Christian König	unsigned			num_vgprs;
79ce40e4726cf30196b87df387255c64ddc2a97638Christian König	unsigned			spi_ps_input_ena;
80ce40e4726cf30196b87df387255c64ddc2a97638Christian König	unsigned			sprite_coord_enable;
81ce40e4726cf30196b87df387255c64ddc2a97638Christian König	unsigned			so_strides[4];
82d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	unsigned			key;
83ce40e4726cf30196b87df387255c64ddc2a97638Christian König};
84ce40e4726cf30196b87df387255c64ddc2a97638Christian König
85ce40e4726cf30196b87df387255c64ddc2a97638Christian König/* radeonsi_shader.c */
86ce40e4726cf30196b87df387255c64ddc2a97638Christian Königint si_pipe_shader_create(struct pipe_context *ctx, struct si_pipe_shader *shader);
87ce40e4726cf30196b87df387255c64ddc2a97638Christian Königvoid si_pipe_shader_destroy(struct pipe_context *ctx, struct si_pipe_shader *shader);
88ce40e4726cf30196b87df387255c64ddc2a97638Christian König
89ce40e4726cf30196b87df387255c64ddc2a97638Christian König#endif
90