Browse Source

allocate Assets structure as part of render state

This lets us move the asset MemoryArena to the Asset structure to be
able to pass it around without needing a reference to RenderState
everywhere.
main
cinnaboot 5 years ago
parent
commit
23318500f6
  1. 1
      src/asset.h
  2. 48
      src/main.cpp

1
src/asset.h

@ -48,6 +48,7 @@ struct model
struct Assets struct Assets
{ {
MemoryArena* arena;
u32 num_models; u32 num_models;
u32 max_models; u32 max_models;
model* models; model* models;

48
src/main.cpp

@ -48,9 +48,7 @@ struct RenderState
transforms* xforms; // NOTE: would be part of camera in libTangerine transforms* xforms; // NOTE: would be part of camera in libTangerine
SDLHandles* handles; SDLHandles* handles;
GLContext* gl_ctx; GLContext* gl_ctx;
Assets assets;
MemoryArena* asset_arena;
Assets* assets;
MemoryArena* rg_arena; MemoryArena* rg_arena;
u32 num_render_groups; u32 num_render_groups;
@ -139,10 +137,10 @@ rotateEntity(Entity* e, glm::vec3 axis, float radians)
model* model*
getModelByPath(RenderState* rs, const char* filepath) getModelByPath(RenderState* rs, const char* filepath)
{ {
model* mdl = assetGetCachedModel(rs->assets, utilFNV64a_str(filepath)); model* mdl = assetGetCachedModel(&rs->assets, utilFNV64a_str(filepath));
if (!mdl) if (!mdl)
mdl = assetLoadFromFile(rs->assets, rs->asset_arena, filepath); mdl = assetLoadFromFile(&rs->assets, rs->assets.arena, filepath);
return mdl; return mdl;
} }
@ -157,21 +155,7 @@ getFreeRenderGroup(RenderState* rs)
return nullptr; return nullptr;
} }
#define DEFAULT_MODEL_COUNT 256
#define DEFAULT_TEXTURE_COUNT 64 #define DEFAULT_TEXTURE_COUNT 64
Assets*
initAssets(MemoryArena* arena,
u32 num_models = DEFAULT_MODEL_COUNT,
u32 num_textures = DEFAULT_TEXTURE_COUNT)
{
Assets* assets = ARENA_ALLOC(arena, Assets, 1);
assets->max_models = num_models;
assets->models = ARENA_ALLOC(arena, model, num_models);
assets->max_textures = num_textures;
assets->textures = ARENA_ALLOC(arena, util_image, num_textures);
return assets;
}
#define DEFAULT_SHADER_COUNT 64 #define DEFAULT_SHADER_COUNT 64
#define DEFAULT_UBO_COUNT 32 #define DEFAULT_UBO_COUNT 32
GLContext* GLContext*
@ -188,23 +172,29 @@ initGLContext(MemoryArena* arena)
return gl_ctx; return gl_ctx;
} }
#define DEFAULT_MODEL_COUNT 256
#define DEFAULT_RENDER_GROUP_COUNT 256 #define DEFAULT_RENDER_GROUP_COUNT 256
RenderState* RenderState*
initRenderState() initRenderState(u32 max_models = DEFAULT_MODEL_COUNT,
u32 max_textures = DEFAULT_TEXTURE_COUNT)
{ {
RenderState* rs = UTIL_ALLOC(1, RenderState); RenderState* rs = UTIL_ALLOC(1, RenderState);
if (rs) { if (rs) {
rs->asset_arena = arenaInit(DEFAULT_ARENA_SIZE); rs->assets.arena = arenaInit(DEFAULT_ARENA_SIZE);
rs->assets = initAssets(rs->asset_arena); rs->assets.max_models = max_models;
rs->assets.models = ARENA_ALLOC(rs->assets.arena, model, max_models);
rs->assets.max_textures = max_textures;
rs->assets.textures =
ARENA_ALLOC(rs->assets.arena, util_image, max_textures);
rs->rg_arena = arenaInit(DEFAULT_ARENA_SIZE); rs->rg_arena = arenaInit(DEFAULT_ARENA_SIZE);
rs->max_render_groups = DEFAULT_RENDER_GROUP_COUNT; rs->max_render_groups = DEFAULT_RENDER_GROUP_COUNT;
rs->render_groups = ARENA_ALLOC(rs->rg_arena, RenderGroup, rs->render_groups = ARENA_ALLOC(rs->rg_arena, RenderGroup,
DEFAULT_RENDER_GROUP_COUNT); DEFAULT_RENDER_GROUP_COUNT);
rs->gl_ctx = initGLContext(rs->asset_arena); rs->gl_ctx = initGLContext(rs->assets.arena);
rs->xforms = ARENA_ALLOC(rs->asset_arena, transforms, 1); rs->xforms = ARENA_ALLOC(rs->assets.arena, transforms, 1);
rs->handles = UTIL_ALLOC(1, SDLHandles); rs->handles = UTIL_ALLOC(1, SDLHandles);
} }
@ -215,7 +205,7 @@ void
freeRenderState(RenderState*& rs) freeRenderState(RenderState*& rs)
{ {
if (rs) { if (rs) {
arenaFree(rs->asset_arena); arenaFree(rs->assets.arena);
utilSafeFree(rs->handles); utilSafeFree(rs->handles);
utilSafeFree(rs); utilSafeFree(rs);
rs = nullptr; rs = nullptr;
@ -279,7 +269,7 @@ initGraphics(SDLHandles* handles)
bool bool
addShaders(RenderState* rs) addShaders(RenderState* rs)
{ {
if (!addShaderProgram(rs->asset_arena, if (!addShaderProgram(rs->assets.arena,
rs->gl_ctx, rs->gl_ctx,
"../data/shader.vert", "../data/shader.vert",
"../data/shader.frag", "../data/shader.frag",
@ -289,7 +279,7 @@ addShaders(RenderState* rs)
return false; return false;
} }
if (!addShaderProgram(rs->asset_arena, if (!addShaderProgram(rs->assets.arena,
rs->gl_ctx, rs->gl_ctx,
"../data/colored_vertices.vert", "../data/colored_vertices.vert",
"../data/colored_vertices.frag", "../data/colored_vertices.frag",
@ -299,7 +289,7 @@ addShaders(RenderState* rs)
return false; return false;
} }
if (!addShaderProgram(rs->asset_arena, if (!addShaderProgram(rs->assets.arena,
rs->gl_ctx, rs->gl_ctx,
"../data/debug.vert", "../data/debug.vert",
"../data/debug.frag", "../data/debug.frag",
@ -439,7 +429,7 @@ main()
// FIXME: need to test this with another shader that has another UBO // FIXME: need to test this with another shader that has another UBO
gl_buffer& ubo = rs->gl_ctx->uniform_buffers[rs->gl_ctx->num_ubos++]; gl_buffer& ubo = rs->gl_ctx->uniform_buffers[rs->gl_ctx->num_ubos++];
initTransforms(rs->asset_arena, rs->xforms, &ubo, rs->gl_ctx); initTransforms(rs->assets.arena, rs->xforms, &ubo, rs->gl_ctx);
if (!addShaders(rs)) { if (!addShaders(rs)) {
LOG(Error) << "error loading shaders\n"; LOG(Error) << "error loading shaders\n";

Loading…
Cancel
Save