mirror of
https://github.com/libretro/RetroArch
synced 2025-03-28 08:37:41 +00:00
Vulkan: Add #include support to slang shaders.
This commit is contained in:
parent
5dcb78ea21
commit
72cdd37ad2
@ -24,14 +24,16 @@
|
|||||||
#include "glslang.hpp"
|
#include "glslang.hpp"
|
||||||
|
|
||||||
#include "../../general.h"
|
#include "../../general.h"
|
||||||
|
#include "../../libretro-common/include/file/file_path.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
bool read_file(const char *path, vector<string> *output)
|
static bool read_shader_file(const char *path, vector<string> *output)
|
||||||
{
|
{
|
||||||
char *buf = nullptr;
|
char *buf = nullptr;
|
||||||
ssize_t len = 0;
|
ssize_t len = 0;
|
||||||
struct string_list *list = NULL;
|
struct string_list *list = NULL;
|
||||||
|
char include_path[PATH_MAX];
|
||||||
|
|
||||||
if (retro_read_file(path, (void**)&buf, &len) < 0)
|
if (retro_read_file(path, (void**)&buf, &len) < 0)
|
||||||
{
|
{
|
||||||
@ -54,15 +56,39 @@ bool read_file(const char *path, vector<string> *output)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
output->clear();
|
|
||||||
for (size_t i = 0; i < list->size; i++)
|
for (size_t i = 0; i < list->size; i++)
|
||||||
output->push_back(list->elems[i].data);
|
{
|
||||||
|
const char *line = list->elems[i].data;
|
||||||
|
if (strstr(line, "#include ") == line)
|
||||||
|
{
|
||||||
|
char *c = (char*)strchr(line, '"');
|
||||||
|
if (!c)
|
||||||
|
{
|
||||||
|
RARCH_ERR("Invalid include statement \"%s\".\n", line);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
c++;
|
||||||
|
char *closing = (char*)strchr(c, '"');
|
||||||
|
if (!closing)
|
||||||
|
{
|
||||||
|
RARCH_ERR("Invalid include statement \"%s\".\n", line);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*closing = '\0';
|
||||||
|
fill_pathname_resolve_relative(include_path, path, c, sizeof(include_path));
|
||||||
|
|
||||||
|
if (!read_shader_file(include_path, output))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
output->push_back(line);
|
||||||
|
}
|
||||||
|
|
||||||
string_list_free(list);
|
string_list_free(list);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
string build_stage_source(const vector<string> &lines, const char *stage)
|
static string build_stage_source(const vector<string> &lines, const char *stage)
|
||||||
{
|
{
|
||||||
ostringstream str;
|
ostringstream str;
|
||||||
bool active = true;
|
bool active = true;
|
||||||
@ -99,7 +125,7 @@ bool glslang_compile_shader(const char *shader_path, glslang_output *output)
|
|||||||
vector<string> lines;
|
vector<string> lines;
|
||||||
|
|
||||||
RARCH_LOG("Compiling shader \"%s\".\n", shader_path);
|
RARCH_LOG("Compiling shader \"%s\".\n", shader_path);
|
||||||
if (!read_file(shader_path, &lines))
|
if (!read_shader_file(shader_path, &lines))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto &header = lines.front();
|
auto &header = lines.front();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user