started work on discovery

This commit is contained in:
Kevin Trogant 2023-12-11 00:09:52 +01:00
parent 19f7e29215
commit 361436ee46
12 changed files with 148 additions and 4 deletions

View File

@ -58,6 +58,11 @@ enum {
* VY_INSUFFICIENT_BUFFER if the provided output buffer is too small */ * VY_INSUFFICIENT_BUFFER if the provided output buffer is too small */
VY_DLLEXPORT vy_result vyUTF8ToWStr(const char *utf8, wchar_t *wstr, size_t len); VY_DLLEXPORT vy_result vyUTF8ToWStr(const char *utf8, wchar_t *wstr, size_t len);
/* Returns VY_SUCCESS if the string was successfully converted,
* VY_INVALID_UNICODE if invalid unicode characters were encountered or
* VY_INSUFFICIENT_BUFFER if the provided output buffer is too small */
VY_DLLEXPORT vy_result vyWStrToUTF8(const wchar_t *wstr, char *utf8, size_t len);
/* Relative pointer */ /* Relative pointer */
typedef struct { typedef struct {
int32_t off; int32_t off;

View File

@ -35,4 +35,24 @@ VY_DLLEXPORT vy_result vyUTF8ToWStr(const char *utf8, wchar_t *wstr, size_t len)
} }
} }
#endif #endif
}
VY_DLLEXPORT vy_result vyWStrToUTF8(const wchar_t *wstr, char *utf8, size_t len) {
#ifdef _WIN32
int res = WideCharToMultiByte(CP_UTF8, WC_COMPOSITECHECK, wstr, -1, utf8, (int)len, NULL, NULL);
if (res > 0) {
return VY_SUCCESS;
} else {
DWORD err = GetLastError();
if (err == ERROR_INSUFFICIENT_BUFFER)
return VY_INSUFFICIENT_BUFFER;
else if (err == ERROR_NO_UNICODE_TRANSLATION)
return VY_INVALID_UNICODE;
else {
vyReportError("CORE", "Unexpected error in vyWStrToUTF8(): %u", err);
return VY_UNKNOWN_ERROR;
}
}
#endif
} }

View File

@ -25,6 +25,8 @@ extern vy_result vyProcessShaderFile(vy_file_id file,
uint32_t flags, uint32_t flags,
vy_processor_output *output); vy_processor_output *output);
extern void vyDiscoverAssets(void);
vy_assetc_options g_assetc_options = { vy_assetc_options g_assetc_options = {
.root_directory = ".", .root_directory = ".",
.optimization = VY_ASSET_OPTIMIZATION_NONE, .optimization = VY_ASSET_OPTIMIZATION_NONE,
@ -121,12 +123,11 @@ int main(int argc, char **argv) {
return 1; return 1;
} }
vyAddFileToProcessingQueue(vyAddFile("shader\\cell.pipeline"), 0); vyDiscoverAssets();
vyWaitUntilProcessingIsFinished(); vyWaitUntilProcessingIsFinished();
vyStopProcessing(); vyStopProcessing();
vySaveAssetMeta(); vySaveAssetMeta();
vyShutdownBufferManager(); vyShutdownBufferManager();

View File

@ -1,5 +1,78 @@
#include "utils.h"
#include "assetmeta.h"
#include "processing.h"
void DiscoverAssets(void) { #include <string.h>
typedef struct {
char path_scratch[1024];
unsigned int path_end;
} vy_discovery_data;
static vy_result DirectoryHandler(const char *name, vyIterateDirElementType type, void *user) {
vy_discovery_data *data = user;
size_t name_len = strlen(name);
if (type == VY_DIR_ELEMENT_TYPE_FILE) {
/* Don't parse .as files */
if (name_len >= 3) {
if (memcmp(&name[name_len - 3], ".as", 3) == 0) {
/* Skip */
return VY_SUCCESS;
}
}
/* Check if we know that file */
data->path_scratch[data->path_end] = '/';
memcpy(data->path_scratch + data->path_end + 1, name, name_len);
data->path_scratch[data->path_end + 1 + name_len] = '\0';
vy_file_id fid = vyAddFile(data->path_scratch);
if (vyLookupUID(fid) != VY_INVALID_UID) {
vy_assetmeta meta;
if (!vyGetAssetMeta(fid, &meta) || (meta.last_changed >= meta.compiled_ts)) {
/* The file (may have) changed */
vy_result res = vyAddFileToProcessingQueue(fid, 0);
if (res != VY_SUCCESS)
return res;
}
else {
/* The file is unchanged, we just need to add it to the output again. */
vyLog("ASSETC", "File %s is unchanged.", data->path_scratch);
}
} else {
/* Process it */
vy_result res = vyAddFileToProcessingQueue(fid, 0);
if (res != VY_SUCCESS)
return res;
}
} else if (type == VY_DIR_ELEMENT_TYPE_DIRECTORY) {
if (strcmp(name, ".") == 0)
return VY_SUCCESS;
if (strcmp(name, "..") == 0)
return VY_SUCCESS;
unsigned int path_end_before = data->path_end;
data->path_scratch[data->path_end++] = '/';
memcpy(data->path_scratch + data->path_end, name, name_len);
data->path_scratch[data->path_end + name_len] = '\0';
data->path_end += name_len;
vy_result res = vyIterateDirectory(data->path_scratch, user, DirectoryHandler);
if (res != VY_SUCCESS)
return res;
data->path_end = path_end_before;
}
return VY_SUCCESS;
}
void vyDiscoverAssets(void) {
vy_discovery_data data;
data.path_scratch[0] = '.';
data.path_scratch[1] = '\0';
data.path_end = 1;
vyIterateDirectory(".", &data, DirectoryHandler);
} }

View File

@ -50,4 +50,40 @@ uint64_t vyGetFileModificationTimestamp(vy_file_id fid) {
ts |= (uint64_t)attribs.ftLastWriteTime.dwHighDateTime << 32; ts |= (uint64_t)attribs.ftLastWriteTime.dwHighDateTime << 32;
return ts; return ts;
#endif #endif
}
vy_result vyIterateDirectory(const char *path, void *user, vy_iterate_directory_cb_func iterate_cb) {
#ifdef _WIN32
vy_result res;
WCHAR wpath[MAX_PATH];
char wildcard_path[MAX_PATH];
strncpy(wildcard_path, path, MAX_PATH);
strncat(wildcard_path, "\\*", MAX_PATH - strlen(path));
res = vyUTF8ToWStr(wildcard_path, wpath, MAX_PATH);
if (res != VY_SUCCESS)
return res;
WIN32_FIND_DATAW find;
HANDLE h = FindFirstFileW(wpath, &find);
if (h == INVALID_HANDLE_VALUE)
return VY_UNKNOWN_ERROR;
do {
char utf8_file[MAX_PATH];
res = vyWStrToUTF8(find.cFileName, utf8_file, MAX_PATH);
if (res != VY_SUCCESS)
break;
vyIterateDirElementType type;
if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
type = VY_DIR_ELEMENT_TYPE_DIRECTORY;
else
type = VY_DIR_ELEMENT_TYPE_FILE;
res = iterate_cb(utf8_file, type, user);
if (res != VY_SUCCESS)
break;
} while (FindNextFileW(h, &find) != 0);
FindClose(h);
return res;
#endif
} }

View File

@ -13,4 +13,13 @@ uint64_t vyGetCurrentTimestamp(void);
uint64_t vyGetFileModificationTimestamp(vy_file_id fid); uint64_t vyGetFileModificationTimestamp(vy_file_id fid);
typedef enum {
VY_DIR_ELEMENT_TYPE_FILE,
VY_DIR_ELEMENT_TYPE_DIRECTORY,
} vyIterateDirElementType;
typedef vy_result vy_iterate_directory_cb_func(const char *name, vyIterateDirElementType type, void *user);
vy_result vyIterateDirectory(const char *path, void *user, vy_iterate_directory_cb_func iterate_cb);
#endif #endif