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_RENDERPASS_H 25 #define ZINK_RENDERPASS_H 26 27 #include <vulkan/vulkan.h> 28 29 #include "pipe/p_state.h" 30 #include "util/u_inlines.h" 31 32 struct zink_screen; 33 34 struct zink_rt_attrib { 35 VkFormat format; 36 VkSampleCountFlagBits samples; 37 bool clear_color; 38 union { 39 bool clear_stencil; 40 bool fbfetch; 41 }; 42 union { 43 bool swapchain; 44 bool needs_write; 45 }; 46 bool resolve; 47 }; 48 49 struct zink_render_pass_state { 50 uint8_t num_cbufs : 5; /* PIPE_MAX_COLOR_BUFS = 8 */ 51 uint8_t have_zsbuf : 1; 52 uint8_t samples:1; //for fs samplemask 53 uint8_t swapchain_init:1; 54 uint32_t num_zsresolves : 1; 55 uint32_t num_cresolves : 23; /* PIPE_MAX_COLOR_BUFS, but this is a struct hole */ 56 struct zink_rt_attrib rts[PIPE_MAX_COLOR_BUFS + 1]; 57 unsigned num_rts; 58 uint32_t clears; //for extra verification and update flagging 59 uint32_t msaa_expand_mask; 60 }; 61 62 struct zink_pipeline_rt { 63 VkFormat format; 64 VkSampleCountFlagBits samples; 65 }; 66 67 struct zink_render_pass_pipeline_state { 68 uint32_t num_attachments:26; 69 uint32_t num_cresolves:4; 70 uint32_t num_zsresolves:1; 71 bool samples:1; //for fs samplemask 72 struct zink_pipeline_rt attachments[PIPE_MAX_COLOR_BUFS + 1]; 73 unsigned id; 74 }; 75 76 struct zink_render_pass { 77 VkRenderPass render_pass; 78 struct zink_render_pass_state state; 79 unsigned pipeline_state; 80 }; 81 82 struct zink_render_pass * 83 zink_create_render_pass(struct zink_screen *screen, 84 struct zink_render_pass_state *state, 85 struct zink_render_pass_pipeline_state *pstate); 86 87 void 88 zink_destroy_render_pass(struct zink_screen *screen, 89 struct zink_render_pass *rp); 90 91 VkImageLayout 92 zink_render_pass_attachment_get_barrier_info(const struct zink_render_pass *rp, unsigned idx, VkPipelineStageFlags *pipeline, VkAccessFlags *access); 93 #endif 94