rtengine/src/runtime/resources.h
2024-07-15 16:34:39 +02:00

109 lines
3.3 KiB
C

#ifndef RT_RESOURCES_H
#define RT_RESOURCES_H
/* Resource system interface
*
* To differentiate the two ideas, we call processed assets "resources"
* and the source files "assets".
*
* For example a .pipeline file is an asset, while a compiled pipeline in
* a binary file is a resource.
*
* Furthermore, a single asset file might contain multiple resources,
* i.e. a single texture file might be turned into multiple resources for the different mip-levels.
*/
#include <stdint.h>
#include "runtime.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Identifies a single resource
*
* This is a hash of the resource name. */
typedef uint64_t rt_resource_id;
#define RT_INVALID_RESOURCE_ID 0u
typedef enum {
/* Compiled shader code */
RT_RESOURCE_SHADER,
/* A pipeline state object */
RT_RESOURCE_PIPELINE,
RT_RESOURCE_FRAMEGRAPH,
RT_RESOURCE_EFFECT,
RT_RESOURCE_MESH,
RT_RESOURCE_MESHLET,
RT_RESOURCE_TYPE_count,
} rt_resource_type;
#define RT_MAX_SUBRESOURCES 32
#define RT_MAX_RESOURCE_DEPENDENCIES 32
typedef struct {
/* Points to the resource data. The size of which is determined by the type. */
void *data;
rt_resource_type type;
/* Subresources are necessary to complete the resource.
* For example, a texture might contain different mip-levels as sub-resources. */
uint32_t subresource_count;
rt_resource_id subresources[RT_MAX_SUBRESOURCES];
/* Dependencies reference distinct resources that are necessary to use this resource.
* For example, a model file might depend on its materials */
uint32_t dependency_count;
rt_resource_id dependencies[RT_MAX_RESOURCE_DEPENDENCIES];
} rt_resource;
/* Retrieves a resource.
*
* This function will also attempt to pre-cache resources that are likely to be accessed
* in the future. Namely subresources and dependencies of the accessed resource.
*
* The passed destination must point to a buffer large enough to hold the resource.
* You can query the resources size with rtGetResourceSize().
*/
RT_DLLEXPORT rt_result rtGetResource(rt_resource_id id, void *dest);
/* Notifies the system that a resource might be accessed soon.
* Starts a asynchronous prefetch of that resource. */
RT_DLLEXPORT void rtPrefetchResources(const rt_resource_id *ids, uint32_t count);
/* Returns the size of a resource in bytes, or 0 if the resource id is invalid. */
RT_DLLEXPORT size_t rtGetResourceSize(rt_resource_id id);
/* Returns the resource id that maps to a given name.
* Does not check if a resource with that id does exist. */
RT_DLLEXPORT rt_resource_id rtGetResourceID(const char *name);
/* Logs information about a resource. Useful for debugging */
RT_DLLEXPORT void rDebugLogResource(rt_resource_id id, const rt_resource *resource);
RT_DLLEXPORT void rtSaveResourceNamespace(void);
/* Registers resources with the resource manager, making them available to the system.
*
* The runtime will create a standalone file for each resource in the resource directory.
* To package them, you will need to use a separate tool.
*/
RT_DLLEXPORT rt_result rtCreateResources(uint32_t count,
const char **names,
const rt_resource *resources,
rt_resource_id *ids);
#ifdef __cplusplus
}
#endif
#endif