merge:latest mipmap changes to master
This commit is contained in:
commit
8d111d0536
19
GL/draw.c
19
GL/draw.c
|
@ -1031,7 +1031,8 @@ static void submitVertices(GLenum mode, GLsizei first, GLuint count, GLenum type
|
|||
}
|
||||
|
||||
/* No vertices? Do nothing */
|
||||
if(!count) {
|
||||
//changed check
|
||||
if(count < 3) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1085,9 +1086,15 @@ static void submitVertices(GLenum mode, GLsizei first, GLuint count, GLenum type
|
|||
|
||||
target->output = _glActivePolyList();
|
||||
target->count = (mode == GL_TRIANGLE_FAN) ? ((count - 2) * 3) : count;
|
||||
if(target->count < 3 || count < 3){
|
||||
printf("%s: %d = %u verts\n",__func__,count,target->count);
|
||||
}
|
||||
target->header_offset = target->output->vector.size;
|
||||
target->start_offset = target->header_offset + 1;
|
||||
|
||||
if(target-count == 0){
|
||||
return;
|
||||
}
|
||||
assert(target->count);
|
||||
|
||||
/* Make sure we have enough room for all the "extra" data */
|
||||
|
@ -1207,8 +1214,8 @@ static void submitVertices(GLenum mode, GLsizei first, GLuint count, GLenum type
|
|||
|
||||
glDepthFunc(GL_EQUAL);
|
||||
glEnable(GL_BLEND);
|
||||
|
||||
/* This is modulation, we need to switch depending on the texture env mode! */
|
||||
|
||||
/* This is modulation, we need to switch depending on the texture env mode! */
|
||||
glBlendFunc(GL_DST_COLOR, GL_ZERO);
|
||||
|
||||
/* Send the buffer again to the transparent list */
|
||||
|
@ -1229,6 +1236,9 @@ void APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvo
|
|||
if(_glCheckImmediateModeInactive(__func__)) {
|
||||
return;
|
||||
}
|
||||
if(count < 3){
|
||||
return;
|
||||
}
|
||||
|
||||
submitVertices(mode, 0, count, type, indices);
|
||||
}
|
||||
|
@ -1239,6 +1249,9 @@ void APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count) {
|
|||
if(_glCheckImmediateModeInactive(__func__)) {
|
||||
return;
|
||||
}
|
||||
if(count < 3){
|
||||
return;
|
||||
}
|
||||
|
||||
submitVertices(mode, first, count, GL_UNSIGNED_INT, NULL);
|
||||
}
|
||||
|
|
75
GL/state.c
75
GL/state.c
|
@ -18,6 +18,61 @@ pvr_poly_cxt_t* _glGetPVRContext() {
|
|||
return &GL_CONTEXT;
|
||||
}
|
||||
|
||||
static GLubyte mipmap_bias = 4;
|
||||
|
||||
GLAPI void APIENTRY glKOS_INTERNAL_SetMipmapBias(GLubyte level) {
|
||||
switch(level){
|
||||
case 1:
|
||||
mipmap_bias = PVR_MIPBIAS_0_25;
|
||||
break;
|
||||
case 2:
|
||||
mipmap_bias = PVR_MIPBIAS_0_50;
|
||||
break;
|
||||
case 3:
|
||||
mipmap_bias = PVR_MIPBIAS_0_75;
|
||||
break;
|
||||
case 4:
|
||||
mipmap_bias = PVR_MIPBIAS_1_00;
|
||||
break;
|
||||
case 5:
|
||||
mipmap_bias = PVR_MIPBIAS_1_25;
|
||||
break;
|
||||
case 6:
|
||||
mipmap_bias = PVR_MIPBIAS_1_50;
|
||||
break;
|
||||
case 7:
|
||||
mipmap_bias = PVR_MIPBIAS_1_75;
|
||||
break;
|
||||
case 8:
|
||||
mipmap_bias = PVR_MIPBIAS_2_00;
|
||||
break;
|
||||
case 9:
|
||||
mipmap_bias = PVR_MIPBIAS_2_25;
|
||||
break;
|
||||
case 10:
|
||||
mipmap_bias = PVR_MIPBIAS_2_50;
|
||||
break;
|
||||
case 11:
|
||||
mipmap_bias = PVR_MIPBIAS_2_75;
|
||||
break;
|
||||
case 12:
|
||||
mipmap_bias = PVR_MIPBIAS_3_00;
|
||||
break;
|
||||
case 13:
|
||||
mipmap_bias = PVR_MIPBIAS_3_25;
|
||||
break;
|
||||
case 14:
|
||||
mipmap_bias = PVR_MIPBIAS_3_50;
|
||||
break;
|
||||
case 15:
|
||||
mipmap_bias = PVR_MIPBIAS_3_75;
|
||||
break;
|
||||
default:
|
||||
mipmap_bias = PVR_MIPBIAS_1_00;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* We can't just use the GL_CONTEXT for this state as the two
|
||||
* GL states are combined, so we store them separately and then
|
||||
|
@ -180,6 +235,10 @@ void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) {
|
|||
break;
|
||||
}
|
||||
|
||||
if(tx1->height != tx1->width){
|
||||
enableMipmaps = GL_FALSE;
|
||||
}
|
||||
|
||||
/* FIXME: If you disable mipmaps on a compressed mipmapped texture
|
||||
* you get corruption and I don't know why, so we force mipmapping for now */
|
||||
if(tx1->isCompressed && _glIsMipmapComplete(tx1)) {
|
||||
|
@ -216,16 +275,24 @@ void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) {
|
|||
context->txr.enable = PVR_TEXTURE_ENABLE;
|
||||
context->txr.filter = filter;
|
||||
context->txr.mipmap = (enableMipmaps) ? PVR_MIPMAP_ENABLE : PVR_MIPMAP_DISABLE;
|
||||
context->txr.mipmap_bias = PVR_MIPBIAS_NORMAL;
|
||||
context->txr.mipmap_bias = mipmap_bias;
|
||||
context->txr.width = tx1->width;
|
||||
context->txr.height = tx1->height;
|
||||
context->txr.base = tx1->data;
|
||||
if(enableMipmaps){
|
||||
context->txr.base = tx1->data;
|
||||
} else {
|
||||
context->txr.base = _glGetMipmapLocation((TextureObject*)tx1,0);
|
||||
}
|
||||
|
||||
context->txr.format = tx1->color;
|
||||
|
||||
if(tx1->isPaletted) {
|
||||
if(_glIsSharedTexturePaletteEnabled()) {
|
||||
TexturePalette* palette = _glGetSharedPalette(tx1->shared_bank);
|
||||
context->txr.format |= PVR_TXRFMT_8BPP_PAL(palette->bank);
|
||||
//TexturePalette* palette = _glGetSharedPalette(tx1->shared_bank);
|
||||
context->txr.format |= PVR_TXRFMT_8BPP_PAL(tx1->shared_bank);
|
||||
if(tx1->shared_bank != 0){
|
||||
//printf("%s chose bank %d!\n",__func__,tx1->shared_bank);
|
||||
}
|
||||
} else {
|
||||
context->txr.format |= PVR_TXRFMT_8BPP_PAL((tx1->palette) ? tx1->palette->bank : 0);
|
||||
}
|
||||
|
|
117
GL/texture.c
117
GL/texture.c
|
@ -163,21 +163,75 @@ static GLint _determineStride(GLenum format, GLenum type) {
|
|||
|
||||
GLubyte* _glGetMipmapLocation(TextureObject* obj, GLuint level) {
|
||||
GLuint offset = 0;
|
||||
if(obj->width == obj->height){
|
||||
|
||||
GLuint i = 0;
|
||||
GLuint width = obj->width;
|
||||
GLuint height = obj->height;
|
||||
if(obj->isPaletted){
|
||||
GLuint size = obj->height;
|
||||
|
||||
for(; i < level; ++i) {
|
||||
offset += (width * height * obj->dataStride);
|
||||
switch(size >> level){
|
||||
case 256:
|
||||
offset = 0x05558;
|
||||
break;
|
||||
case 128:
|
||||
offset = 0x01558;
|
||||
break;
|
||||
case 64:
|
||||
offset = 0x00558;
|
||||
break;
|
||||
case 32:
|
||||
offset = 0x00158;
|
||||
break;
|
||||
case 16:
|
||||
offset = 0x00058;
|
||||
break;
|
||||
case 8:
|
||||
offset = 0x00018;
|
||||
break;
|
||||
case 4:
|
||||
offset = 0x00008;
|
||||
break;
|
||||
case 2:
|
||||
offset = 0x00004;
|
||||
break;
|
||||
case 1:
|
||||
case 0:
|
||||
offset = 0x00000;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
GLuint size = obj->height;
|
||||
|
||||
if(width > 1) {
|
||||
width /= 2;
|
||||
}
|
||||
|
||||
if(height > 1) {
|
||||
height /= 2;
|
||||
}
|
||||
switch(size >> level){
|
||||
case 256:
|
||||
offset = 0x0AAB0;
|
||||
break;
|
||||
case 128:
|
||||
offset = 0x02AB0;
|
||||
break;
|
||||
case 64:
|
||||
offset = 0x00AB0;
|
||||
break;
|
||||
case 32:
|
||||
offset = 0x002B0;
|
||||
break;
|
||||
case 16:
|
||||
offset = 0x000B0;
|
||||
break;
|
||||
case 8:
|
||||
offset = 0x00030;
|
||||
break;
|
||||
case 4:
|
||||
offset = 0x00010;
|
||||
break;
|
||||
case 2:
|
||||
offset = 0x00008;
|
||||
break;
|
||||
case 1:
|
||||
offset = 0x00006;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return ((GLubyte*) obj->data) + offset;
|
||||
|
@ -194,7 +248,7 @@ static GLuint _glGetMipmapDataSize(TextureObject* obj) {
|
|||
GLuint width = obj->width;
|
||||
GLuint height = obj->height;
|
||||
|
||||
for(; i < _glGetMipmapLevelCount(obj); ++i) {
|
||||
for(; i < _glGetMipmapLevelCount(obj)+1; ++i) {
|
||||
size += (width * height * obj->dataStride);
|
||||
|
||||
if(width > 1) {
|
||||
|
@ -491,6 +545,8 @@ void APIENTRY glCompressedTexImage2DARB(GLenum target,
|
|||
|
||||
static GLint _cleanInternalFormat(GLint internalFormat) {
|
||||
switch (internalFormat) {
|
||||
case GL_COLOR_INDEX4_EXT:
|
||||
return GL_COLOR_INDEX4_EXT;
|
||||
case GL_COLOR_INDEX8_EXT:
|
||||
return GL_COLOR_INDEX8_EXT;
|
||||
case GL_ALPHA:
|
||||
|
@ -613,6 +669,8 @@ static GLuint _determinePVRFormat(GLint internalFormat, GLenum type) {
|
|||
return PVR_TXRFMT_ARGB1555 | PVR_TXRFMT_TWIDDLED | PVR_TXRFMT_VQ_ENABLE;
|
||||
case GL_COLOR_INDEX8_EXT:
|
||||
return PVR_TXRFMT_PAL8BPP | PVR_TXRFMT_TWIDDLED;
|
||||
case GL_COLOR_INDEX4_EXT:
|
||||
return PVR_TXRFMT_PAL4BPP | PVR_TXRFMT_TWIDDLED;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
@ -763,15 +821,15 @@ GLboolean _glIsMipmapComplete(const TextureObject* obj) {
|
|||
if(!obj->mipmap || !obj->mipmapCount) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
GLsizei i = 0;
|
||||
for(; i < obj->mipmapCount; ++i) {
|
||||
if((obj->mipmap & (1 << i)) == 0) {
|
||||
return GL_FALSE;
|
||||
for(; i < obj->mipmapCount-3; ++i) {
|
||||
if((obj->mipmap & (1 << i)) == 1) {
|
||||
return GL_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
#define TWIDTAB(x) ( (x&1)|((x&2)<<1)|((x&4)<<2)|((x&8)<<3)|((x&16)<<4)| \
|
||||
|
@ -812,16 +870,19 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat,
|
|||
}
|
||||
|
||||
GLint w = width;
|
||||
if(w < 8 || (w & -w) != w) {
|
||||
GLint h = height;
|
||||
if(level == 0){
|
||||
if((w < 8 || (w & -w) != w)) {
|
||||
/* Width is not a power of two. Must be!*/
|
||||
_glKosThrowError(GL_INVALID_VALUE, "glTexImage2D");
|
||||
}
|
||||
|
||||
GLint h = height;
|
||||
if(h < 8 || (h & -h) != h) {
|
||||
|
||||
if((h < 8 || (h & -h) != h)) {
|
||||
/* height is not a power of two. Must be!*/
|
||||
_glKosThrowError(GL_INVALID_VALUE, "glTexImage2D");
|
||||
}
|
||||
}
|
||||
|
||||
if(level < 0) {
|
||||
_glKosThrowError(GL_INVALID_VALUE, "glTexImage2D");
|
||||
|
@ -837,11 +898,6 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat,
|
|||
|
||||
GLboolean isPaletted = (internalFormat == GL_COLOR_INDEX8_EXT) ? GL_TRUE : GL_FALSE;
|
||||
|
||||
if(isPaletted && level > 0) {
|
||||
/* Paletted textures can't have mipmaps */
|
||||
_glKosThrowError(GL_INVALID_OPERATION, __func__);
|
||||
}
|
||||
|
||||
if(_glKosHasError()) {
|
||||
_glKosPrintError();
|
||||
return;
|
||||
|
@ -854,7 +910,7 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat,
|
|||
|
||||
assert(active);
|
||||
|
||||
if(active->data) {
|
||||
if(active->data && (level == 0) ) {
|
||||
/* pre-existing texture - check if changed */
|
||||
if(active->width != width ||
|
||||
active->height != height ||
|
||||
|
@ -948,11 +1004,18 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat,
|
|||
min = MIN(w, h);
|
||||
mask = min - 1;
|
||||
|
||||
if(height == 1 || width == 1){
|
||||
targetData[0] = ((GLubyte*)data)[0];
|
||||
targetData[1] = ((GLubyte*)data)[0];
|
||||
targetData[2] = ((GLubyte*)data)[0];
|
||||
targetData[3] = ((GLubyte*)data)[0];
|
||||
} else {
|
||||
for(y = 0; y < h; y += 2) {
|
||||
for(x = 0; x < w; x++) {
|
||||
vtex[TWIDOUT((y & mask) / 2, x & mask) + (x / min + y / min)*min * min / 2] = pixels[y * w + x] | (pixels[(y + 1) * w + x] << 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* No conversion? Just copy the data, and the pvr_format is correct */
|
||||
sq_cpy(targetData, data, bytes);
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
|
||||
#include "named_array.h"
|
||||
|
||||
#define assert__(x) for ( ; !(x) ; assert(x) )
|
||||
|
||||
void named_array_init(NamedArray* array, unsigned int element_size, unsigned int max_elements) {
|
||||
array->element_size = element_size;
|
||||
array->max_element_count = max_elements;
|
||||
|
@ -28,6 +30,7 @@ void named_array_init(NamedArray* array, unsigned int element_size, unsigned int
|
|||
array->used_markers = (unsigned char*) malloc(array->marker_count);
|
||||
#endif
|
||||
memset(array->used_markers, 0, sizeof(unsigned char) * array->marker_count);
|
||||
memset(array->elements, 0, element_size * max_elements);
|
||||
}
|
||||
|
||||
char named_array_used(NamedArray* array, unsigned int id) {
|
||||
|
@ -56,6 +59,17 @@ void* named_array_alloc(NamedArray* array, unsigned int* new_id) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
|
||||
#define BYTE_TO_BINARY(byte) \
|
||||
(byte & 0x80 ? '1' : '0'), \
|
||||
(byte & 0x40 ? '1' : '0'), \
|
||||
(byte & 0x20 ? '1' : '0'), \
|
||||
(byte & 0x10 ? '1' : '0'), \
|
||||
(byte & 0x08 ? '1' : '0'), \
|
||||
(byte & 0x04 ? '1' : '0'), \
|
||||
(byte & 0x02 ? '1' : '0'), \
|
||||
(byte & 0x01 ? '1' : '0')
|
||||
|
||||
void* named_array_reserve(NamedArray* array, unsigned int id) {
|
||||
if(!named_array_used(array, id)) {
|
||||
unsigned int j = (id % 8);
|
||||
|
@ -63,6 +77,11 @@ void* named_array_reserve(NamedArray* array, unsigned int id) {
|
|||
|
||||
assert(!named_array_used(array, id));
|
||||
array->used_markers[i] |= (unsigned char) 1 << j;
|
||||
|
||||
assert__(named_array_used(array, id)) {
|
||||
printf("%s: id %d is not used in [%d,%d] = "BYTE_TO_BINARY_PATTERN"\n",__func__,id,i,j, BYTE_TO_BINARY(array->used_markers[i]));
|
||||
}
|
||||
|
||||
assert(named_array_used(array, id));
|
||||
|
||||
unsigned char* ptr = &array->elements[id * array->element_size];
|
||||
|
|
|
@ -67,6 +67,8 @@ GLAPI void APIENTRY glKosInitConfig(GLdcConfig* config);
|
|||
GLAPI void APIENTRY glKosInitEx(GLdcConfig* config);
|
||||
GLAPI void APIENTRY glKosSwapBuffers();
|
||||
|
||||
GLAPI void APIENTRY glKOS_INTERNAL_SetMipmapBias(GLubyte level);
|
||||
|
||||
/*
|
||||
* CUSTOM EXTENSION multiple_shared_palette_KOS
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue
Block a user