llvmpipe: pass color and depth sample strides into fragment shader.
[mesa.git] / src / gallium / drivers / zink / zink_framebuffer.c
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 #include "zink_framebuffer.h"
25
26 #include "zink_render_pass.h"
27 #include "zink_screen.h"
28 #include "zink_surface.h"
29
30 #include "util/u_memory.h"
31 #include "util/u_string.h"
32
33 void
34 zink_destroy_framebuffer(struct zink_screen *screen,
35 struct zink_framebuffer *fbuf)
36 {
37 vkDestroyFramebuffer(screen->dev, fbuf->fb, NULL);
38 for (int i = 0; i < ARRAY_SIZE(fbuf->surfaces); ++i)
39 pipe_surface_reference(fbuf->surfaces + i, NULL);
40
41 zink_render_pass_reference(screen, &fbuf->rp, NULL);
42
43 FREE(fbuf);
44 }
45
46 struct zink_framebuffer *
47 zink_create_framebuffer(struct zink_screen *screen,
48 struct zink_framebuffer_state *fb)
49 {
50 struct zink_framebuffer *fbuf = CALLOC_STRUCT(zink_framebuffer);
51 if (!fbuf)
52 return NULL;
53
54 pipe_reference_init(&fbuf->reference, 1);
55
56 VkImageView attachments[ARRAY_SIZE(fb->attachments)];
57 for (int i = 0; i < fb->num_attachments; i++) {
58 struct zink_surface *surf = fb->attachments[i];
59 pipe_surface_reference(fbuf->surfaces + i, &surf->base);
60 attachments[i] = surf->image_view;
61 }
62
63 zink_render_pass_reference(screen, &fbuf->rp, fb->rp);
64
65 VkFramebufferCreateInfo fci = {};
66 fci.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
67 fci.renderPass = fbuf->rp->render_pass;
68 fci.attachmentCount = fb->num_attachments;
69 fci.pAttachments = attachments;
70 fci.width = fb->width;
71 fci.height = fb->height;
72 fci.layers = fb->layers;
73
74 if (vkCreateFramebuffer(screen->dev, &fci, NULL, &fbuf->fb) != VK_SUCCESS) {
75 zink_destroy_framebuffer(screen, fbuf);
76 return NULL;
77 }
78
79 return fbuf;
80 }
81
82 void
83 debug_describe_zink_framebuffer(char* buf, const struct zink_framebuffer *ptr)
84 {
85 sprintf(buf, "zink_framebuffer");
86 }