fprintf( stderr, "Couldn't alloc placeholder: heap %u sz %x ofs %x\n", heap->heapId,
(int)size, (int)offset );
mmDumpMemInfo( heap->memory_heap );
+ FREE(t);
return;
}
t->heap = heap;
if (in_use)
- t->bound = 99;
+ t->reserved = 1;
insert_at_head( & heap->texture_objects, t );
}
}
/* The the LRU element. If the texture is bound to one of
* the texture units, then we cannot kick it out.
*/
- if ( cursor->bound /* || cursor->reserved */ ) {
+ if ( cursor->bound || cursor->reserved ) {
continue;
}
do { if ( max_sizes[v] != 0 ) { limits-> f = max_sizes[v]; } } while( 0 )
#define SET_MAX_RECT(f,v) \
- do { if ( max_sizes[v] != 0 ) { limits-> f = 1 << max_sizes[v]; } } while( 0 )
+ do { if ( max_sizes[v] != 0 ) { limits-> f = 1 << (max_sizes[v] - 1); } } while( 0 )
/**
* For hardware that does not support mipmapping, this will be 1.
* \param all_textures_one_heap True if the hardware requires that all
* textures be in a single texture heap for multitexturing.
+ * \param allow_larger_textures 0 conservative, 1 calculate limits
+ * so at least one worst-case texture can fit, 2 just use hw limits.
*/
void
driCalculateMaxTextureLevels( driTexHeap * const * heaps,
unsigned nr_heaps,
struct gl_constants * limits,
- unsigned max_bytes_per_texel,
+ unsigned max_bytes_per_texel,
unsigned max_2D_size,
unsigned max_3D_size,
unsigned max_cube_size,
unsigned max_rect_size,
unsigned mipmaps_at_once,
- int all_textures_one_heap )
+ int all_textures_one_heap,
+ int allow_larger_textures )
{
struct maps_per_heap max_textures[8];
unsigned i;
mipmaps[0] = mipmaps_at_once;
mipmaps[1] = mipmaps_at_once;
- mipmaps[2] = 1;
- mipmaps[3] = mipmaps_at_once;
+ mipmaps[2] = mipmaps_at_once;
+ mipmaps[3] = 1;
/* Calculate the maximum number of texture levels in two passes. The
*/
for ( i = 0 ; i < 4 ; i++ ) {
- if ( max_sizes[ i ] != 0 ) {
- fill_in_maximums( heaps, nr_heaps, max_bytes_per_texel,
+ if ( (allow_larger_textures != 2) && (max_sizes[ i ] != 0) ) {
+ fill_in_maximums( heaps, nr_heaps, max_bytes_per_texel,
max_sizes[ i ], mipmaps[ i ],
dimensions[ i ], faces[ i ],
max_textures );
- max_sizes[ i ] = get_max_size( nr_heaps,
- limits->MaxTextureUnits,
+ max_sizes[ i ] = get_max_size( nr_heaps,
+ allow_larger_textures == 1 ?
+ 1 : limits->MaxTextureUnits,
max_sizes[ i ],
all_textures_one_heap,
max_textures );
}
+ else if (max_sizes[ i ] != 0) {
+ max_sizes[ i ] += 1;
+ }
}
SET_MAX( MaxTextureLevels, 0 );
unsigned textures_in_heap = 0;
unsigned blocks_in_mempool = 0;
const driTexHeap * heap = texture_heaps[i];
- const memHeap_t * p = heap->memory_heap;
+ const struct mem_block *p = heap->memory_heap;
/* Check each texture object has a MemBlock, and is linked into
* the correct heap.