xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_render_pass.c (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1 /*
2  * Copyright 2020 Google LLC
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #include "vkr_render_pass.h"
7 
8 #include "vkr_render_pass_gen.h"
9 
10 static void
vkr_dispatch_vkCreateRenderPass(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateRenderPass * args)11 vkr_dispatch_vkCreateRenderPass(struct vn_dispatch_context *dispatch,
12                                 struct vn_command_vkCreateRenderPass *args)
13 {
14    vkr_render_pass_create_and_add(dispatch->data, args);
15 }
16 
17 static void
vkr_dispatch_vkCreateRenderPass2(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateRenderPass2 * args)18 vkr_dispatch_vkCreateRenderPass2(struct vn_dispatch_context *dispatch,
19                                  struct vn_command_vkCreateRenderPass2 *args)
20 {
21    struct vkr_context *ctx = dispatch->data;
22    struct vkr_device *dev = vkr_device_from_handle(args->device);
23    struct vn_device_proc_table *vk = &dev->proc_table;
24 
25    struct vkr_render_pass *pass = vkr_context_alloc_object(
26       ctx, sizeof(*pass), VK_OBJECT_TYPE_RENDER_PASS, args->pRenderPass);
27    if (!pass) {
28       args->ret = VK_ERROR_OUT_OF_HOST_MEMORY;
29       return;
30    }
31 
32    vn_replace_vkCreateRenderPass2_args_handle(args);
33    args->ret = vk->CreateRenderPass2(args->device, args->pCreateInfo, NULL,
34                                      &pass->base.handle.render_pass);
35    if (args->ret != VK_SUCCESS) {
36       free(pass);
37       return;
38    }
39 
40    vkr_device_add_object(ctx, dev, &pass->base);
41 }
42 
43 static void
vkr_dispatch_vkDestroyRenderPass(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyRenderPass * args)44 vkr_dispatch_vkDestroyRenderPass(struct vn_dispatch_context *dispatch,
45                                  struct vn_command_vkDestroyRenderPass *args)
46 {
47    vkr_render_pass_destroy_and_remove(dispatch->data, args);
48 }
49 
50 static void
vkr_dispatch_vkGetRenderAreaGranularity(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetRenderAreaGranularity * args)51 vkr_dispatch_vkGetRenderAreaGranularity(UNUSED struct vn_dispatch_context *dispatch,
52                                         struct vn_command_vkGetRenderAreaGranularity *args)
53 {
54    struct vkr_device *dev = vkr_device_from_handle(args->device);
55    struct vn_device_proc_table *vk = &dev->proc_table;
56 
57    vn_replace_vkGetRenderAreaGranularity_args_handle(args);
58    vk->GetRenderAreaGranularity(args->device, args->renderPass, args->pGranularity);
59 }
60 
61 static void
vkr_dispatch_vkCreateFramebuffer(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateFramebuffer * args)62 vkr_dispatch_vkCreateFramebuffer(struct vn_dispatch_context *dispatch,
63                                  struct vn_command_vkCreateFramebuffer *args)
64 {
65    vkr_framebuffer_create_and_add(dispatch->data, args);
66 }
67 
68 static void
vkr_dispatch_vkDestroyFramebuffer(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyFramebuffer * args)69 vkr_dispatch_vkDestroyFramebuffer(struct vn_dispatch_context *dispatch,
70                                   struct vn_command_vkDestroyFramebuffer *args)
71 {
72    vkr_framebuffer_destroy_and_remove(dispatch->data, args);
73 }
74 
75 void
vkr_context_init_render_pass_dispatch(struct vkr_context * ctx)76 vkr_context_init_render_pass_dispatch(struct vkr_context *ctx)
77 {
78    struct vn_dispatch_context *dispatch = &ctx->dispatch;
79 
80    dispatch->dispatch_vkCreateRenderPass = vkr_dispatch_vkCreateRenderPass;
81    dispatch->dispatch_vkCreateRenderPass2 = vkr_dispatch_vkCreateRenderPass2;
82    dispatch->dispatch_vkDestroyRenderPass = vkr_dispatch_vkDestroyRenderPass;
83    dispatch->dispatch_vkGetRenderAreaGranularity =
84       vkr_dispatch_vkGetRenderAreaGranularity;
85 }
86 
87 void
vkr_context_init_framebuffer_dispatch(struct vkr_context * ctx)88 vkr_context_init_framebuffer_dispatch(struct vkr_context *ctx)
89 {
90    struct vn_dispatch_context *dispatch = &ctx->dispatch;
91 
92    dispatch->dispatch_vkCreateFramebuffer = vkr_dispatch_vkCreateFramebuffer;
93    dispatch->dispatch_vkDestroyFramebuffer = vkr_dispatch_vkDestroyFramebuffer;
94 }
95