1 /*
2  * Copyright (C) 2016 Rob Clark <robclark@freedesktop.org>
3  * Copyright © 2018 Google, Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  *
24  * Authors:
25  *    Rob Clark <robclark@freedesktop.org>
26  */
27 
28 #ifndef FD6_PROGRAM_H_
29 #define FD6_PROGRAM_H_
30 
31 #include "pipe/p_context.h"
32 #include "freedreno_context.h"
33 
34 #include "ir3/ir3_shader.h"
35 #include "ir3_cache.h"
36 
37 struct fd6_emit;
38 
39 struct fd6_program_state {
40    struct ir3_program_state base;
41    struct ir3_shader_variant *bs; /* binning pass vs */
42    struct ir3_shader_variant *vs;
43    struct ir3_shader_variant *hs;
44    struct ir3_shader_variant *ds;
45    struct ir3_shader_variant *gs;
46    struct ir3_shader_variant *fs;
47    struct fd_ringbuffer *config_stateobj;
48    struct fd_ringbuffer *interp_stateobj;
49    struct fd_ringbuffer *binning_stateobj;
50    struct fd_ringbuffer *streamout_stateobj;
51    struct fd_ringbuffer *stateobj;
52 
53    struct ir3_stream_output_info *stream_output;
54 
55    /**
56     * Output components from frag shader.  It is possible to have
57     * a fragment shader that only writes a subset of the bound
58     * render targets.
59     */
60    uint32_t mrt_components;
61 };
62 
63 static inline struct fd6_program_state *
fd6_program_state(struct ir3_program_state * state)64 fd6_program_state(struct ir3_program_state *state)
65 {
66    return (struct fd6_program_state *)state;
67 }
68 
69 static inline const struct ir3_shader_variant *
fd6_last_shader(const struct fd6_program_state * state)70 fd6_last_shader(const struct fd6_program_state *state)
71 {
72    if (state->gs)
73       return state->gs;
74    else if (state->ds)
75       return state->ds;
76    else
77       return state->vs;
78 }
79 
80 void fd6_emit_shader(struct fd_context *ctx, struct fd_ringbuffer *ring,
81                      const struct ir3_shader_variant *so) assert_dt;
82 
83 struct fd_ringbuffer *fd6_program_interp_state(struct fd6_emit *emit) assert_dt;
84 
85 void fd6_prog_init(struct pipe_context *pctx);
86 
87 #endif /* FD6_PROGRAM_H_ */
88