Merge branch 'master' into mesh_loader
This commit is contained in:
16
meson.build
16
meson.build
@@ -1,12 +1,15 @@
|
|||||||
project('evol-mod-assetmanager', 'c',
|
project('evol-mod-assetmanager', ['c', 'cpp'],
|
||||||
version : '0.1',
|
version : '0.1',
|
||||||
default_options : ['warning_level=3', 'c_std=c11'])
|
default_options : ['warning_level=3', 'c_std=c11', 'default_library=shared'])
|
||||||
|
|
||||||
src = subproject('evol').get_variable('evolmod_subdir') + '/meson.build'
|
src = subproject('evol').get_variable('evolmod_subdir') + '/meson.build'
|
||||||
dst = meson.current_source_dir() + '/import/'
|
dst = meson.current_source_dir() + '/import/'
|
||||||
run_command( 'python3', meson.source_root() + '/subprojects/evol/buildscripts/copy.py', src, dst)
|
run_command( 'python3', meson.source_root() + '/subprojects/evol/buildscripts/copy.py', src, dst)
|
||||||
subdir('import')
|
subdir('import')
|
||||||
|
|
||||||
|
cc = meson.get_compiler('c')
|
||||||
|
cc_id = cc.get_id()
|
||||||
|
|
||||||
subproject('evmod_ecs')
|
subproject('evmod_ecs')
|
||||||
|
|
||||||
mod_src = [
|
mod_src = [
|
||||||
@@ -16,6 +19,7 @@ mod_src = [
|
|||||||
'src/loaders/TextLoader/TextLoader.c',
|
'src/loaders/TextLoader/TextLoader.c',
|
||||||
'src/loaders/JSONLoader/JSONLoader.c',
|
'src/loaders/JSONLoader/JSONLoader.c',
|
||||||
'src/loaders/MeshLoader/MeshLoader.c',
|
'src/loaders/MeshLoader/MeshLoader.c',
|
||||||
|
'src/loaders/ShaderLoader/ShaderLoader.c',
|
||||||
]
|
]
|
||||||
|
|
||||||
mod_incdir = [
|
mod_incdir = [
|
||||||
@@ -25,10 +29,18 @@ mod_incdir = [
|
|||||||
mod_deps = [
|
mod_deps = [
|
||||||
evmod_deps,
|
evmod_deps,
|
||||||
|
|
||||||
|
dependency('threads'),
|
||||||
|
|
||||||
dependency('assetsys'),
|
dependency('assetsys'),
|
||||||
dependency('evmod_ecs'),
|
dependency('evmod_ecs'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if cc_id == 'msvc'
|
||||||
|
mod_deps += dependency('shaderc_msvc')
|
||||||
|
else
|
||||||
|
mod_deps += dependency('shaderc_clang')
|
||||||
|
endif
|
||||||
|
|
||||||
module = shared_module(
|
module = shared_module(
|
||||||
'evmodassetmanager', mod_src,
|
'evmodassetmanager', mod_src,
|
||||||
include_directories: mod_incdir,
|
include_directories: mod_incdir,
|
||||||
|
|||||||
@@ -30,3 +30,10 @@ EV_NS_DEF_BEGIN(MeshLoader)
|
|||||||
EV_NS_DEF_FN(MeshAsset, loadAsset, (AssetHandle, handle))
|
EV_NS_DEF_FN(MeshAsset, loadAsset, (AssetHandle, handle))
|
||||||
|
|
||||||
EV_NS_DEF_END(MeshLoader)
|
EV_NS_DEF_END(MeshLoader)
|
||||||
|
|
||||||
|
|
||||||
|
EV_NS_DEF_BEGIN(ShaderLoader)
|
||||||
|
|
||||||
|
EV_NS_DEF_FN(ShaderAsset, loadAsset, (AssetHandle, handle), (ShaderAssetStage, stage), (CONST_STR, shader_name), (CONST_STR, entrypoint), (CompiledShaderType, type))
|
||||||
|
|
||||||
|
EV_NS_DEF_END(ShaderLoader)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ TYPE(JSONAsset, struct {
|
|||||||
PTR json_data;
|
PTR json_data;
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
TYPE(MeshAsset, struct {
|
TYPE(MeshAsset, struct {
|
||||||
uint32_t vertexBuferSize;
|
uint32_t vertexBuferSize;
|
||||||
uint32_t vertexCount;
|
uint32_t vertexCount;
|
||||||
@@ -18,4 +19,26 @@ TYPE(MeshAsset, struct {
|
|||||||
uint32_t indexBuferSize;
|
uint32_t indexBuferSize;
|
||||||
uint32_t indexCount;
|
uint32_t indexCount;
|
||||||
uint32_t *indexData;
|
uint32_t *indexData;
|
||||||
|
|
||||||
|
TYPE(ShaderAssetStage, enum {
|
||||||
|
EV_SHADERASSETSTAGE_VERTEX,
|
||||||
|
EV_SHADERASSETSTAGE_FRAGMENT,
|
||||||
|
EV_SHADERASSETSTAGE_COMPUTE,
|
||||||
|
EV_SHADERASSETSTAGE_GEOMETRY,
|
||||||
|
|
||||||
|
EV_SHADERASSETSTAGE_DETECT,
|
||||||
|
|
||||||
|
EV_SHADERASSETSTAGE_COUNT
|
||||||
|
})
|
||||||
|
|
||||||
|
TYPE(CompiledShaderType, enum {
|
||||||
|
EV_SHADER_ASM,
|
||||||
|
EV_SHADER_BIN
|
||||||
|
})
|
||||||
|
|
||||||
|
TYPE(ShaderAsset, struct {
|
||||||
|
PTR binary;
|
||||||
|
U64 len;
|
||||||
|
GenericHandle internal_handle;
|
||||||
|
CompiledShaderType type;
|
||||||
})
|
})
|
||||||
|
|||||||
105
src/loaders/ShaderLoader/ShaderLoader.c
Normal file
105
src/loaders/ShaderLoader/ShaderLoader.c
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
#define TYPE_MODULE evmod_assets
|
||||||
|
#include <evol/meta/type_import.h>
|
||||||
|
#include <evol/common/ev_log.h>
|
||||||
|
|
||||||
|
#include "../LoaderCommon.h"
|
||||||
|
#include "ShaderLoader.h"
|
||||||
|
|
||||||
|
#include <shaderc/shaderc.h>
|
||||||
|
|
||||||
|
struct {
|
||||||
|
shaderc_compiler_t compiler;
|
||||||
|
shaderc_compile_options_t compile_options;
|
||||||
|
} ShaderLoaderData = {NULL,NULL};
|
||||||
|
|
||||||
|
void
|
||||||
|
ev_shaderloader_init()
|
||||||
|
{
|
||||||
|
ShaderLoaderData.compiler = shaderc_compiler_initialize();
|
||||||
|
ShaderLoaderData.compile_options = shaderc_compile_options_initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ev_shaderloader_deinit()
|
||||||
|
{
|
||||||
|
shaderc_compile_options_release(ShaderLoaderData.compile_options);
|
||||||
|
shaderc_compiler_release(ShaderLoaderData.compiler);
|
||||||
|
}
|
||||||
|
|
||||||
|
shaderc_shader_kind
|
||||||
|
shader_kind_from_ShaderAssetStage(
|
||||||
|
ShaderAssetStage asset)
|
||||||
|
{
|
||||||
|
switch(asset) {
|
||||||
|
case EV_SHADERASSETSTAGE_VERTEX:
|
||||||
|
return shaderc_glsl_vertex_shader;
|
||||||
|
case EV_SHADERASSETSTAGE_FRAGMENT:
|
||||||
|
return shaderc_glsl_fragment_shader;
|
||||||
|
case EV_SHADERASSETSTAGE_COMPUTE:
|
||||||
|
return shaderc_glsl_compute_shader;
|
||||||
|
case EV_SHADERASSETSTAGE_GEOMETRY:
|
||||||
|
return shaderc_glsl_geometry_shader;
|
||||||
|
case EV_SHADERASSETSTAGE_DETECT:
|
||||||
|
return shaderc_glsl_infer_from_source;
|
||||||
|
default:
|
||||||
|
ev_log_warn("Invalid ShaderAssetStage. Trying to infer stage from source.");
|
||||||
|
return shaderc_glsl_infer_from_source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
typedef shaderc_compilation_result_t (*ShaderCompilationFn)();
|
||||||
|
ShaderAsset
|
||||||
|
ev_shaderloader_loadasset(
|
||||||
|
AssetHandle handle,
|
||||||
|
ShaderAssetStage stage,
|
||||||
|
CONST_STR shader_name,
|
||||||
|
CONST_STR entrypoint,
|
||||||
|
CompiledShaderType type)
|
||||||
|
{
|
||||||
|
const Asset *asset = ev_asset_getfromhandle(handle);
|
||||||
|
ShaderCompilationFn compilation_fn =
|
||||||
|
(type == EV_SHADER_BIN)
|
||||||
|
?(ShaderCompilationFn)shaderc_compile_into_spv:
|
||||||
|
(type == EV_SHADER_ASM)
|
||||||
|
?(ShaderCompilationFn)shaderc_compile_into_spv_assembly
|
||||||
|
:NULL;
|
||||||
|
|
||||||
|
shaderc_compilation_result_t result = compilation_fn(
|
||||||
|
ShaderLoaderData.compiler,
|
||||||
|
asset->data, asset->size,
|
||||||
|
shader_kind_from_ShaderAssetStage(stage),
|
||||||
|
shader_name, entrypoint?entrypoint:"main",
|
||||||
|
ShaderLoaderData.compile_options);
|
||||||
|
|
||||||
|
if(shaderc_result_get_compilation_status(result) != shaderc_compilation_status_success) {
|
||||||
|
if(shaderc_result_get_num_errors(result) > 0) {
|
||||||
|
ev_log_error(shaderc_result_get_error_message(result));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(shaderc_result_get_num_warnings(result) > 0) {
|
||||||
|
ev_log_warn(shaderc_result_get_error_message(result));
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderAsset inter = (ShaderAsset) {
|
||||||
|
.binary = (PTR)shaderc_result_get_bytes(result),
|
||||||
|
.len = shaderc_result_get_length(result),
|
||||||
|
.internal_handle = (GenericHandle)result
|
||||||
|
};
|
||||||
|
|
||||||
|
ev_asset_markas(handle, LoaderData.assetType, &inter);
|
||||||
|
|
||||||
|
return inter;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ev_shaderloader_shaderasset_destr(
|
||||||
|
ShaderAsset shader)
|
||||||
|
{
|
||||||
|
shaderc_result_release((shaderc_compilation_result_t)shader.internal_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ev_shaderloader_setassettype(
|
||||||
|
GenericHandle type)
|
||||||
|
{
|
||||||
|
LoaderData.assetType = type;
|
||||||
|
}
|
||||||
23
src/loaders/ShaderLoader/ShaderLoader.h
Normal file
23
src/loaders/ShaderLoader/ShaderLoader.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
void
|
||||||
|
ev_shaderloader_init();
|
||||||
|
|
||||||
|
void
|
||||||
|
ev_shaderloader_deinit();
|
||||||
|
|
||||||
|
ShaderAsset
|
||||||
|
ev_shaderloader_loadasset(
|
||||||
|
AssetHandle handle,
|
||||||
|
ShaderAssetStage stage,
|
||||||
|
CONST_STR shader_name,
|
||||||
|
CONST_STR entrypoint,
|
||||||
|
CompiledShaderType type);
|
||||||
|
|
||||||
|
void
|
||||||
|
ev_shaderloader_shaderasset_destr(
|
||||||
|
ShaderAsset shader);
|
||||||
|
|
||||||
|
void
|
||||||
|
ev_shaderloader_setassettype(
|
||||||
|
GenericHandle type);
|
||||||
30
src/mod.c
30
src/mod.c
@@ -10,6 +10,7 @@
|
|||||||
#include "loaders/TextLoader/TextLoader.h"
|
#include "loaders/TextLoader/TextLoader.h"
|
||||||
#include "loaders/JSONLoader/JSONLoader.h"
|
#include "loaders/JSONLoader/JSONLoader.h"
|
||||||
#include "loaders/MeshLoader/MeshLoader.h"
|
#include "loaders/MeshLoader/MeshLoader.h"
|
||||||
|
#include "loaders/ShaderLoader/ShaderLoader.h"
|
||||||
|
|
||||||
#define AssetSysCheck(...) do { \
|
#define AssetSysCheck(...) do { \
|
||||||
assetsys_error_t res = __VA_ARGS__; \
|
assetsys_error_t res = __VA_ARGS__; \
|
||||||
@@ -32,7 +33,7 @@ onRemoveAssetComponent(
|
|||||||
ECSQuery query)
|
ECSQuery query)
|
||||||
{
|
{
|
||||||
Asset *assets = ECS->getQueryColumn(query, sizeof(Asset), 1);
|
Asset *assets = ECS->getQueryColumn(query, sizeof(Asset), 1);
|
||||||
for(int i = 0; i < ECS->getQueryMatchCount(query); i++) {
|
for(U32 i = 0; i < ECS->getQueryMatchCount(query); i++) {
|
||||||
aligned_free(assets[i].data);
|
aligned_free(assets[i].data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,7 +43,7 @@ onRemoveTextAsset(
|
|||||||
ECSQuery query)
|
ECSQuery query)
|
||||||
{
|
{
|
||||||
TextAsset *assets = ECS->getQueryColumn(query, sizeof(TextAsset), 1);
|
TextAsset *assets = ECS->getQueryColumn(query, sizeof(TextAsset), 1);
|
||||||
for(int i = 0; i < ECS->getQueryMatchCount(query); i++) {
|
for(U32 i = 0; i < ECS->getQueryMatchCount(query); i++) {
|
||||||
ev_textloader_textasset_destr(assets[i]);
|
ev_textloader_textasset_destr(assets[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -52,11 +53,12 @@ onRemoveJSONAsset(
|
|||||||
ECSQuery query)
|
ECSQuery query)
|
||||||
{
|
{
|
||||||
JSONAsset *assets = ECS->getQueryColumn(query, sizeof(JSONAsset), 1);
|
JSONAsset *assets = ECS->getQueryColumn(query, sizeof(JSONAsset), 1);
|
||||||
for(int i = 0; i < ECS->getQueryMatchCount(query); i++) {
|
for(U32 i = 0; i < ECS->getQueryMatchCount(query); i++) {
|
||||||
ev_jsonloader_jsonasset_destr(assets[i]);
|
ev_jsonloader_jsonasset_destr(assets[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// void
|
// void
|
||||||
// onRemoveMeshAsset(
|
// onRemoveMeshAsset(
|
||||||
// ECSQuery query)
|
// ECSQuery query)
|
||||||
@@ -67,8 +69,19 @@ onRemoveJSONAsset(
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
void
|
||||||
|
onRemoveShaderAsset(
|
||||||
|
ECSQuery query)
|
||||||
|
{
|
||||||
|
ShaderAsset *assets = ECS->getQueryColumn(query, sizeof(ShaderAsset), 1);
|
||||||
|
for(U32 i = 0; i < ECS->getQueryMatchCount(query); i++) {
|
||||||
|
ev_shaderloader_shaderasset_destr(assets[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EV_CONSTRUCTOR
|
EV_CONSTRUCTOR
|
||||||
{
|
{
|
||||||
|
ev_log_trace("evmod_asset constructor");
|
||||||
static_assert(sizeof(AssetEntityID) == sizeof(AssetHandle), "AssetEntityID not the same size of AssetHandle");
|
static_assert(sizeof(AssetEntityID) == sizeof(AssetHandle), "AssetEntityID not the same size of AssetHandle");
|
||||||
|
|
||||||
AssetManagerData.sys = assetsys_create( 0 );
|
AssetManagerData.sys = assetsys_create( 0 );
|
||||||
@@ -88,11 +101,17 @@ EV_CONSTRUCTOR
|
|||||||
ev_jsonloader_setassettype(AssetECS->registerComponent("JSONAsset", sizeof(JSONAsset), EV_ALIGNOF(JSONAsset)));
|
ev_jsonloader_setassettype(AssetECS->registerComponent("JSONAsset", sizeof(JSONAsset), EV_ALIGNOF(JSONAsset)));
|
||||||
AssetECS->setOnRemoveTrigger("JSONAssetOnRemove", "JSONAsset", onRemoveJSONAsset);
|
AssetECS->setOnRemoveTrigger("JSONAssetOnRemove", "JSONAsset", onRemoveJSONAsset);
|
||||||
|
|
||||||
|
|
||||||
ev_jsonloader_setassettype(AssetECS->registerComponent("MeshAsset", sizeof(MeshAsset), EV_ALIGNOF(MeshAsset)));
|
ev_jsonloader_setassettype(AssetECS->registerComponent("MeshAsset", sizeof(MeshAsset), EV_ALIGNOF(MeshAsset)));
|
||||||
// AssetECS->setOnRemoveTrigger("MeshAssetOnRemove", "MeshAsset", onRemoveMeshAsset);
|
// AssetECS->setOnRemoveTrigger("MeshAssetOnRemove", "MeshAsset", onRemoveMeshAsset);
|
||||||
|
|
||||||
|
ev_shaderloader_setassettype(AssetECS->registerComponent("ShaderAsset", sizeof(ShaderAsset), EV_ALIGNOF(ShaderAsset)));
|
||||||
|
AssetECS->setOnRemoveTrigger("ShaderAssetOnRemove", "ShaderAsset", onRemoveShaderAsset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ev_shaderloader_init();
|
||||||
|
|
||||||
return AssetManagerData.sys == NULL;
|
return AssetManagerData.sys == NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,6 +125,8 @@ EV_DESTRUCTOR
|
|||||||
if(AssetManagerData.ecs_mod) {
|
if(AssetManagerData.ecs_mod) {
|
||||||
evol_unloadmodule(AssetManagerData.ecs_mod);
|
evol_unloadmodule(AssetManagerData.ecs_mod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ev_shaderloader_deinit();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,6 +200,7 @@ ev_asset_markas(
|
|||||||
|
|
||||||
EV_BINDINGS
|
EV_BINDINGS
|
||||||
{
|
{
|
||||||
|
ev_log_debug("Binding functions in evmod_asset");
|
||||||
EV_NS_BIND_FN(AssetManager, mount, ev_assetmanager_mount);
|
EV_NS_BIND_FN(AssetManager, mount, ev_assetmanager_mount);
|
||||||
|
|
||||||
EV_NS_BIND_FN(Asset, load, ev_asset_load);
|
EV_NS_BIND_FN(Asset, load, ev_asset_load);
|
||||||
@@ -191,5 +213,7 @@ EV_BINDINGS
|
|||||||
|
|
||||||
EV_NS_BIND_FN(MeshLoader, loadAsset, ev_meshloader_loadasset);
|
EV_NS_BIND_FN(MeshLoader, loadAsset, ev_meshloader_loadasset);
|
||||||
|
|
||||||
|
EV_NS_BIND_FN(ShaderLoader, loadAsset, ev_shaderloader_loadasset);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
14
subprojects/packagefiles/libshaderc/meson.build
Normal file
14
subprojects/packagefiles/libshaderc/meson.build
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
project('libshaderc', 'cpp')
|
||||||
|
|
||||||
|
fs = import('fs')
|
||||||
|
cxxc = meson.get_compiler('cpp')
|
||||||
|
|
||||||
|
shaderc_inc = include_directories('install/include')
|
||||||
|
|
||||||
|
shaderc_dep = declare_dependency(
|
||||||
|
dependencies: cxxc.find_library('shaderc_combined', dirs: meson.current_source_dir()/'install/lib'),
|
||||||
|
include_directories: shaderc_inc,
|
||||||
|
)
|
||||||
|
|
||||||
|
meson.override_dependency('shaderc_msvc', shaderc_dep)
|
||||||
|
meson.override_dependency('shaderc_clang', shaderc_dep)
|
||||||
12
subprojects/shaderc_clang.wrap
Normal file
12
subprojects/shaderc_clang.wrap
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
[wrap-file]
|
||||||
|
directory = libshaderc
|
||||||
|
|
||||||
|
source_url = https://storage.googleapis.com/shaderc/artifacts/prod/graphics_shader_compiler/shaderc/linux/continuous_clang_release/364/20210607-072233/install.tgz
|
||||||
|
source_filename = libshaderc-upstream-clang.tgz
|
||||||
|
source_hash = f46dd35f6904af2b3330201ffb0f2f1ef5f8b8ede44491fad1a37b4a791772ef
|
||||||
|
lead_directory_missing = libshaderc
|
||||||
|
|
||||||
|
patch_directory = libshaderc
|
||||||
|
|
||||||
|
[provide]
|
||||||
|
dependency_names = shaderc_clang
|
||||||
12
subprojects/shaderc_msvc.wrap
Normal file
12
subprojects/shaderc_msvc.wrap
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
[wrap-file]
|
||||||
|
directory = libshaderc
|
||||||
|
|
||||||
|
source_url = https://storage.googleapis.com/shaderc/artifacts/prod/graphics_shader_compiler/shaderc/windows/continuous_release_2017/368/20210607-072143/install.zip
|
||||||
|
source_filename = libshaderc-upstream-msvc.zip
|
||||||
|
source_hash = 5256f02a11dceb3390edaabd452a23ee48c4fe7b43bca754de87738adea96255
|
||||||
|
lead_directory_missing = libshaderc
|
||||||
|
|
||||||
|
patch_directory = libshaderc
|
||||||
|
|
||||||
|
[provide]
|
||||||
|
dependency_names = shaderc_msvc
|
||||||
Reference in New Issue
Block a user