- Revert changes accidentally committed.

This is WIP code using hash tables for texture lookups. Not yet stable.
This commit is contained in:
Couriersud 2010-02-12 22:45:29 +00:00
parent 377fc28f9b
commit a7dea2f6eb

View File

@ -117,12 +117,6 @@ typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuin
#define GL_DEPTH_COMPONENT32 0x81A7
#endif
//#define OLD_CODE 1
#ifndef OLD_CODE
#define HASH_SIZE ((1<<10)+1)
#define OVERFLOW_SIZE (1<<10)
#endif
// OSD headers
#include "osdsdl.h"
@ -169,9 +163,7 @@ typedef void (*texture_copy_func)(texture_info *texture, const render_texinfo *t
/* texture_info holds information about a texture */
struct _texture_info
{
#ifdef OLD_CODE
texture_info * next; // next texture in the list
#endif
HashT hash; // hash value for the texture (must be >= pointer size)
UINT32 flags; // rendering flags
render_texinfo texinfo; // copy of the texture info
@ -228,11 +220,7 @@ struct _sdl_info
int initialized; // is everything well initialized, i.e. all GL stuff etc.
// 3D info (GL mode only)
#ifdef OLD_CODE
texture_info * texlist; // list of active textures
#else
texture_info * texhash[HASH_SIZE + OVERFLOW_SIZE];
#endif
int last_blendmode; // previous blendmode
INT32 texture_max_width; // texture maximum width
INT32 texture_max_height; // texture maximum height
@ -295,19 +283,10 @@ static const line_aa_step line_aa_4step[] =
// INLINES
//============================================================
#ifdef OLD_CODE
INLINE HashT texture_compute_hash(const render_texinfo *texture, UINT32 flags)
{
return (HashT)texture->base ^ (flags & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK));
}
#else
INLINE HashT texture_compute_hash(const render_texinfo *texture, UINT32 flags)
{
HashT h = (HashT)texture ^ (flags & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK));
//printf("hash %d\n", (int) h % HASH_SIZE);
return (h >> 8) % HASH_SIZE;
}
#endif
INLINE void set_blendmode(sdl_info *sdl, int blendmode)
{
@ -2560,24 +2539,9 @@ static texture_info *texture_create(sdl_window_info *window, const render_texinf
}
// add us to the texture list
#ifdef OLD_CODE
texture->next = sdl->texlist;
sdl->texlist = texture;
#else
if (sdl->texhash[texture->hash] == NULL)
sdl->texhash[texture->hash] = texture;
else
{
int i;
for (i = HASH_SIZE; i < HASH_SIZE + OVERFLOW_SIZE; i++)
if (sdl->texhash[i] == NULL)
{
sdl->texhash[i] = texture;
break;
}
assert(i < HASH_SIZE + OVERFLOW_SIZE);
}
#endif
if(sdl->usevbo)
{
// Generate And Bind The Texture Coordinate Buffer
@ -2704,7 +2668,6 @@ static void texture_set_data(texture_info *texture, const render_texinfo *texsou
// texture_find
//============================================================
#ifdef OLD_CODE
static texture_info *texture_find(sdl_info *sdl, const render_primitive *prim)
{
HashT texhash = texture_compute_hash(&prim->texture, prim->flags);
@ -2723,55 +2686,6 @@ static texture_info *texture_find(sdl_info *sdl, const render_primitive *prim)
// nothing found
return NULL;
}
#else
#if 0
static int compare_texinfo(render_texinfo *t1, render_texinfo *t2)
{
if (t1->base == t2->base &&
t1->width == t2->width &&
t1->height == t2->height &&
t1->rowpixels == t2->rowpixels)
return 1;
else
return 0;
}
#endif
static int compare_texture_primitive(const texture_info *texture, const render_primitive *prim)
{
if (texture->texinfo.base == prim->texture.base &&
texture->texinfo.width == prim->texture.width &&
texture->texinfo.height == prim->texture.height &&
texture->texinfo.rowpixels == prim->texture.rowpixels &&
((texture->flags ^ prim->flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) == 0)
return 1;
else
return 0;
}
static texture_info *texture_find(sdl_info *sdl, const render_primitive *prim)
{
HashT texhash = texture_compute_hash(&prim->texture, prim->flags);
texture_info *texture;
texture = sdl->texhash[texhash];
if (texture != NULL)
{
int i;
if (compare_texture_primitive(texture, prim))
return texture;
for (i=HASH_SIZE; i<HASH_SIZE + OVERFLOW_SIZE; i++)
{
texture = sdl->texhash[i];
if (texture != NULL && compare_texture_primitive(texture, prim))
return texture;
}
}
return NULL;
}
#endif
//============================================================
// texture_update
@ -3113,13 +3027,8 @@ static void texture_all_disable(sdl_info *sdl)
static void drawogl_destroy_all_textures(sdl_window_info *window)
{
sdl_info *sdl = (sdl_info *) window->dxdata;
texture_info *texture = NULL;
texture_info *next_texture=NULL, *texture = NULL;
int lock=FALSE;
#ifdef OLD_CODE
texture_info *next_texture=NULL;
#else
int i;
#endif
if (sdl == NULL)
return;
@ -3137,26 +3046,16 @@ static void drawogl_destroy_all_textures(sdl_window_info *window)
osd_lock_acquire(window->primlist->lock);
}
texture = sdl->texlist;
glFinish();
texture_all_disable(sdl);
glFinish();
glDisableClientState(GL_VERTEX_ARRAY);
#ifdef OLD_CODE
texture = sdl->texlist;
while (texture)
{
next_texture = texture->next;
#else
i=0;
while (i<HASH_SIZE+OVERFLOW_SIZE)
{
texture = sdl->texhash[i];
sdl->texhash[i] = NULL;
if (texture != NULL)
{
#endif
if(sdl->usevbo)
{
@ -3195,15 +3094,10 @@ static void drawogl_destroy_all_textures(sdl_window_info *window)
texture->data_own=FALSE;
}
free(texture);
#ifdef OLD_CODE
texture = next_texture;
}
sdl->texlist = NULL;
#else
}
i++;
}
#endif
if ( sdl->useglsl )
{
glsl_shader_free(sdl->glsl);