1 /*
2 * Copyright 2021 Google LLC
3 * SPDX-License-Identifier: MIT
4 */
5
6 #include "vkr_common.h"
7
8 #include <stdarg.h>
9 #include <stdio.h>
10
11 #include "vkr_context.h"
12 #include "vkr_cs.h"
13
14 void
vkr_log(const char * fmt,...)15 vkr_log(const char *fmt, ...)
16 {
17 const char prefix[] = "vkr: ";
18 char line[1024];
19 size_t len;
20 va_list va;
21 int ret;
22
23 len = ARRAY_SIZE(prefix) - 1;
24 memcpy(line, prefix, len);
25
26 va_start(va, fmt);
27 ret = vsnprintf(line + len, ARRAY_SIZE(line) - len, fmt, va);
28 va_end(va);
29
30 if (ret < 0) {
31 const char log_error[] = "log error";
32 memcpy(line + len, log_error, ARRAY_SIZE(log_error) - 1);
33 len += ARRAY_SIZE(log_error) - 1;
34 } else if ((size_t)ret < ARRAY_SIZE(line) - len) {
35 len += ret;
36 } else {
37 len = ARRAY_SIZE(line) - 1;
38 }
39
40 /* make room for newline */
41 if (len + 1 >= ARRAY_SIZE(line))
42 len--;
43
44 line[len++] = '\n';
45 line[len] = '\0';
46
47 virgl_log(line);
48 }
49
50 void
object_array_fini(struct object_array * arr)51 object_array_fini(struct object_array *arr)
52 {
53 if (!arr->objects_stolen) {
54 for (uint32_t i = 0; i < arr->count; i++)
55 free(arr->objects[i]);
56 }
57
58 free(arr->objects);
59 free(arr->handle_storage);
60 }
61
62 bool
object_array_init(struct vkr_context * ctx,struct object_array * arr,uint32_t count,VkObjectType obj_type,size_t obj_size,size_t handle_size,const void * obj_id_handles)63 object_array_init(struct vkr_context *ctx,
64 struct object_array *arr,
65 uint32_t count,
66 VkObjectType obj_type,
67 size_t obj_size,
68 size_t handle_size,
69 const void *obj_id_handles)
70 {
71 arr->count = count;
72
73 arr->objects = malloc(sizeof(*arr->objects) * count);
74 if (!arr->objects)
75 return false;
76
77 arr->handle_storage = malloc(handle_size * count);
78 if (!arr->handle_storage) {
79 free(arr->objects);
80 return false;
81 }
82
83 arr->objects_stolen = false;
84 for (uint32_t i = 0; i < count; i++) {
85 const void *obj_id_handle = (const char *)obj_id_handles + handle_size * i;
86 struct vkr_object *obj =
87 vkr_context_alloc_object(ctx, obj_size, obj_type, obj_id_handle);
88 if (!obj) {
89 arr->count = i;
90 object_array_fini(arr);
91 return false;
92 }
93
94 arr->objects[i] = obj;
95 }
96
97 return arr;
98 }
99