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
{
MemoryArena* arena;
u32 num_models;
u32 max_models;
model* models;

48
src/main.cpp

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

Loading…
Cancel
Save