Skip to content

Commit

Permalink
Refactor: Dumped material_t block allocator
Browse files Browse the repository at this point in the history
Block allocation of materials can be added back later.
  • Loading branch information
danij-deng committed Jan 5, 2013
1 parent c7ffaa2 commit a52ebe7
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 34 deletions.
8 changes: 3 additions & 5 deletions doomsday/engine/include/resource/material.h
Expand Up @@ -32,13 +32,11 @@ extern "C" {
struct materialvariant_s;

/**
* Initialize. Note that Material expects that initialization is done
* but once during construction and that the owner will not attempt to
* re-initialize later on.
* Construct a new material.
*/
void Material_Initialize(material_t* mat);
material_t* Material_New();

void Material_Destroy(material_t* mat);
void Material_Delete(material_t* mat);

/**
* Process a system tick event.
Expand Down
9 changes: 5 additions & 4 deletions doomsday/engine/src/resource/material.cpp
Expand Up @@ -54,21 +54,22 @@ static void destroyVariants(material_t *mat)
mat->_prepared = 0;
}

void Material_Initialize(material_t *mat)
material_t *Material_New()
{
DENG2_ASSERT(mat);
std::memset(mat, 0, sizeof *mat);
material_t *mat = (material_t *) M_Calloc(sizeof(*mat));
mat->header.type = DMU_MATERIAL;
mat->_envClass = MEC_UNKNOWN;
mat->_size = Size2_New();
return mat;
}

void Material_Destroy(material_t *mat)
void Material_Delete(material_t *mat)
{
DENG2_ASSERT(mat);
Material_DestroyVariants(mat);
Size2_Delete(mat->_size);
mat->_size = 0;
M_Free(mat);
}

void Material_Ticker(material_t *mat, timespan_t time)
Expand Down
35 changes: 10 additions & 25 deletions doomsday/engine/src/resource/materials.cpp
Expand Up @@ -43,7 +43,6 @@
#include <de/Log>
#include <de/PathTree>
#include <de/memory.h>
#include <de/memoryblockset.h>
#include <de/memoryzone.h>

#include <cstring>
Expand All @@ -52,9 +51,6 @@
#include "resource/materials.h"
#include "resource/materialsnapshot.h"

/// Number of materials to block-allocate.
#define MATERIALS_BLOCK_ALLOC (32)

/// Number of elements to block-allocate in the material index to materialbind map.
#define MATERIALS_BINDINGMAP_BLOCK_ALLOC (32)

Expand Down Expand Up @@ -180,7 +176,6 @@ struct Materials::Instance
* 5) Super-fast look up by public material identifier.
* 6) Fast look up by material name (hashing is used).
*/
blockset_t *materialsBlockSet;
MaterialList *materials;
uint materialCount;

Expand All @@ -195,7 +190,6 @@ struct Materials::Instance

Instance()
: numgroups(0), groups(0), variantSpecs(0), variantCacheQueue(0),
materialsBlockSet(BlockSet_New(sizeof(material_t), MATERIALS_BLOCK_ALLOC)),
materials(0), materialCount(0),
bindingCount(0), bindingIdMapSize(0), bindingIdMap(0)
{}
Expand Down Expand Up @@ -223,16 +217,11 @@ struct Materials::Instance
while(materials)
{
MaterialListNode *next = materials->next;
Material_Destroy(materials->mat);
Material_Delete(materials->mat);
M_Free(materials);
materials = next;
}

if(materialsBlockSet)
{
BlockSet_Delete(materialsBlockSet); materialsBlockSet = 0;
}

materialCount = 0;
}

Expand Down Expand Up @@ -357,14 +346,6 @@ struct Materials::Instance
return bindingIdMap[id-1];
}

material_t *allocMaterial()
{
material_t *mat = (material_t *)BlockSet_Allocate(materialsBlockSet);
Material_Initialize(mat);
materialCount++;
return mat;
}

/**
* Link the material into the global list of materials.
* @pre material is NOT already present in the global list.
Expand Down Expand Up @@ -718,12 +699,16 @@ material_t *Materials::newFromDef(ded_material_t *def)
if(!tex) return 0;

// A new Material.
material_t *mat = d->linkMaterialToGlobalList(d->allocMaterial());
mat->_flags = def->flags;
mat->_isCustom = tex->flags().testFlag(Texture::Custom);
mat->_def = def;
d->materialCount++;
material_t *mat = Material_New();

d->linkMaterialToGlobalList(mat);

mat->_flags = def->flags;
mat->_isCustom = tex->flags().testFlag(Texture::Custom);
mat->_def = def;
Size2_SetWidthHeight(mat->_size, MAX_OF(0, def->width), MAX_OF(0, def->height));
mat->_envClass = S_MaterialEnvClassForUri(reinterpret_cast<struct uri_s const *>(&uri));
mat->_envClass = S_MaterialEnvClassForUri(reinterpret_cast<struct uri_s const *>(&uri));

if(!bind)
{
Expand Down

0 comments on commit a52ebe7

Please sign in to comment.