1 /*
2  * Copyright 2018 Collabora Ltd.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * on the rights to use, copy, modify, merge, publish, distribute, sub
8  * license, and/or sell copies of the Software, and to permit persons to whom
9  * the Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21  * USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 
24 #ifndef ZINK_PIPELINE_H
25 #define ZINK_PIPELINE_H
26 
27 #include <vulkan/vulkan.h>
28 
29 #include "pipe/p_state.h"
30 #include "zink_shader_keys.h"
31 #include "zink_state.h"
32 
33 struct zink_blend_state;
34 struct zink_depth_stencil_alpha_state;
35 struct zink_gfx_program;
36 struct zink_compute_program;
37 struct zink_rasterizer_state;
38 struct zink_render_pass;
39 struct zink_screen;
40 struct zink_vertex_elements_state;
41 
42 struct zink_gfx_pipeline_state {
43    uint32_t rast_state : ZINK_RAST_HW_STATE_SIZE; //zink_rasterizer_hw_state
44    uint32_t vertices_per_patch:5;
45    uint32_t rast_samples:7;
46    uint32_t void_alpha_attachments:PIPE_MAX_COLOR_BUFS;
47    VkSampleMask sample_mask;
48 
49    unsigned rp_state;
50    uint32_t blend_id;
51 
52    /* Pre-hashed value for table lookup, invalid when zero.
53     * Members after this point are not included in pipeline state hash key */
54    uint32_t hash;
55    bool dirty;
56 
57    struct {
58       struct zink_depth_stencil_alpha_hw_state *depth_stencil_alpha_state; //non-dynamic state
59       VkFrontFace front_face;
60       unsigned num_viewports;
61    } dyn_state1;
62 
63    bool primitive_restart; //dynamic state2
64 
65    VkShaderModule modules[PIPE_SHADER_TYPES - 1];
66    bool modules_changed;
67 
68    struct zink_vertex_elements_hw_state *element_state;
69    uint32_t vertex_hash;
70 
71    uint32_t final_hash;
72 
73    uint32_t vertex_buffers_enabled_mask;
74    uint32_t vertex_strides[PIPE_MAX_ATTRIBS];
75    bool sample_locations_enabled;
76    bool have_EXT_extended_dynamic_state;
77    bool have_EXT_extended_dynamic_state2;
78    uint8_t has_points; //either gs outputs points or prim type is points
79    struct {
80       struct zink_shader_key key[5];
81       struct zink_shader_key last_vertex;
82    } shader_keys;
83    struct zink_blend_state *blend_state;
84    struct zink_render_pass *render_pass;
85    VkPipeline pipeline;
86    uint8_t patch_vertices;
87    unsigned idx : 8;
88    enum pipe_prim_type gfx_prim_mode; //pending mode
89 };
90 
91 struct zink_compute_pipeline_state {
92    /* Pre-hashed value for table lookup, invalid when zero.
93     * Members after this point are not included in pipeline state hash key */
94    uint32_t hash;
95    bool dirty;
96    bool use_local_size;
97    uint32_t local_size[3];
98 
99    VkPipeline pipeline;
100 };
101 
102 VkPipeline
103 zink_create_gfx_pipeline(struct zink_screen *screen,
104                          struct zink_gfx_program *prog,
105                          struct zink_gfx_pipeline_state *state,
106                          VkPrimitiveTopology primitive_topology);
107 
108 VkPipeline
109 zink_create_compute_pipeline(struct zink_screen *screen, struct zink_compute_program *comp, struct zink_compute_pipeline_state *state);
110 #endif
111