kiba-engine
texture.c
1 #include <kiba/gpu/texture.h>
2 
3 #include <kiba/gpu/device.h>
4 
5 b8 gpu_texture_create(gpu_texture *texture, gpu_device device, struct gpu_texture_descriptor desc) {
6  // TODO check against limits and for invalid usages
7 
8  if (desc.dimension != GPU_TEXTURE_DIMENSION_D2) {
9  // TODO depth textures can also only be 2D
10  if (KB_FLAGS_ANY_SET(desc.usage, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT)) {
11  KB_ERROR("render attachments can only be 2D, but found {u32}", desc.dimension);
12  return false;
13  }
14  }
15  if (desc.sample_count > 1) {
16  // TODO handle all the error cases
17  }
18 
19  // TODO check mip levels
20  // TODO check if usages are allowed
21 
22  if (!gpu_device_resource_texture_create(device, texture)) {
23  KB_ERROR("could not create device-tracked texture");
24  return false;
25  }
26  struct gpu_texture *tex = *texture;
27  tex->desc = desc;
28  return gpu_backend_texture_create(&tex->bt, device->bd, desc);
29 }
30 
31 void gpu_texture_destroy(gpu_texture texture) { gpu_device_resource_texture_enqueue_destroy(texture); }
32 
33 void gpu_texture_destroy_internal(gpu_texture texture) {
34  gpu_backend_texture_destroy(&texture->bt, texture->device->bd);
35 }
36 
37 b8 gpu_texture_view_create(gpu_texture_view *view,
38  gpu_texture texture,
39  struct gpu_texture_view_descriptor desc) {
40  // TODO if view_formats are added, determine aspect specific format for the view
41  // TODO validate descriptor data (e.g. mip levels, array-layer, sample compatibility etc.)
42  // TODO filter usage
43  if (!gpu_device_resource_texture_view_create(texture->device, view)) {
44  KB_ERROR("could not create device-tracked texture");
45  return false;
46  }
47  struct gpu_texture_view *v = *view;
48  v->texture = texture;
49  v->desc = desc;
50  if (!gpu_backend_texture_view_create(&v->btv, v->device->bd, texture->bt, desc)) {
51  KB_ERROR("cannot create backend texture view");
52  return false;
53  }
54  return true;
55 }
56 
57 void gpu_texture_view_destroy(gpu_texture_view view) { gpu_device_resource_texture_view_enqueue_destroy(view); }
58 
59 void gpu_texture_view_destroy_internal(gpu_texture_view view) {
60  gpu_backend_texture_view_destroy(&view->btv, view->device->bd);
61 }
#define KB_FLAGS_ANY_SET(value, flags)
Check if any of the flags are set inside value.
Definition: defines.h:67
#define KB_ERROR(...)
Log entry with error log level.
Definition: log.h:142