made (most of) streaming work on big endian

This commit is contained in:
aap
2020-05-01 08:42:56 +02:00
parent 3010dad0cc
commit e4b4bf9d16
25 changed files with 377 additions and 219 deletions

View File

@@ -101,6 +101,7 @@ destroyNativeData(void *object, int32, int32)
Stream*
readNativeData(Stream *stream, int32, void *object, int32, int32)
{
ASSERTLITTLE;
Geometry *geometry = (Geometry*)object;
uint32 platform;
if(!findChunk(stream, ID_STRUCT, nil, nil)){
@@ -118,7 +119,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
int32 size = stream->readI32();
uint8 *data = rwNewT(uint8, size, MEMDUR_FUNCTION | ID_GEOMETRY);
stream->read(data, size);
stream->read8(data, size);
uint8 *p = data;
header->serialNumber = *(uint16*)p; p += 2;
header->numMeshes = *(uint16*)p; p += 2;
@@ -149,14 +150,14 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
assert(inst->indexBuffer == nil);
inst->indexBuffer = createIndexBuffer(inst->numIndices*2, false);
uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0);
stream->read(indices, 2*inst->numIndices);
stream->read8(indices, 2*inst->numIndices);
unlockIndices(inst->indexBuffer);
inst->managed = 1;
assert(inst->vertexBuffer == nil);
inst->vertexBuffer = createVertexBuffer(inst->stride*inst->numVertices, 0, false);
uint8 *verts = lockVertices(inst->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
stream->read(verts, inst->stride*inst->numVertices);
stream->read8(verts, inst->stride*inst->numVertices);
unlockVertices(inst->vertexBuffer);
inst++;
@@ -167,6 +168,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
Stream*
writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
{
ASSERTLITTLE;
Geometry *geometry = (Geometry*)object;
writeChunkHeader(stream, ID_STRUCT, len-12);
if(geometry->instData == nil ||
@@ -200,17 +202,17 @@ writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
*p++ = inst->remapped;
inst++;
}
stream->write(data, size);
stream->write8(data, size);
rwFree(data);
inst = header->inst;
for(uint32 i = 0; i < header->numMeshes; i++){
uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0);
stream->write(indices, 2*inst->numIndices);
stream->write8(indices, 2*inst->numIndices);
unlockIndices(inst->indexBuffer);
uint8 *verts = lockVertices(inst->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
stream->write(verts, inst->stride*inst->numVertices);
stream->write8(verts, inst->stride*inst->numVertices);
unlockVertices(inst->vertexBuffer);
inst++;
}
@@ -448,10 +450,10 @@ readAsImage(Stream *stream, int32 width, int32 height, int32 depth, int32 format
if(format & Raster::PAL4){
pallen = 16;
stream->read(palette, 4*32);
stream->read8(palette, 4*32);
}else if(format & Raster::PAL8){
pallen = 256;
stream->read(palette, 4*256);
stream->read8(palette, 4*256);
}
if(!Raster::formatHasAlpha(format))
for(int32 i = 0; i < pallen; i++)
@@ -462,7 +464,7 @@ readAsImage(Stream *stream, int32 width, int32 height, int32 depth, int32 format
uint32 size = stream->readU32();
if(i == 0){
data = rwNewT(uint8, size, MEMDUR_FUNCTION | ID_IMAGE);
stream->read(data, size);
stream->read8(data, size);
}else
stream->seek(size);
}
@@ -509,8 +511,8 @@ readNativeTexture(Stream *stream)
// Texture
tex->filterAddressing = stream->readU32();
stream->read(tex->name, 32);
stream->read(tex->mask, 32);
stream->read8(tex->name, 32);
stream->read8(tex->mask, 32);
// Raster
uint32 format = stream->readU32();
@@ -547,7 +549,7 @@ readNativeTexture(Stream *stream)
// TODO: check if format supported and convert if necessary
if(pallength != 0)
stream->read(ras->palette, 4*pallength);
stream->read8(ras->palette, 4*pallength);
uint32 size;
uint8 *data;
@@ -555,7 +557,7 @@ readNativeTexture(Stream *stream)
size = stream->readU32();
if(i < raster->getNumLevels()){
data = raster->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH);
stream->read(data, size);
stream->read8(data, size);
raster->unlock(i);
}else
stream->seek(size);
@@ -572,8 +574,8 @@ writeNativeTexture(Texture *tex, Stream *stream)
// Texture
stream->writeU32(tex->filterAddressing);
stream->write(tex->name, 32);
stream->write(tex->mask, 32);
stream->write8(tex->name, 32);
stream->write8(tex->mask, 32);
// Raster
Raster *raster = tex->raster;
@@ -608,9 +610,9 @@ writeNativeTexture(Texture *tex, Stream *stream)
stream->writeU8(compression);
if(raster->format & Raster::PAL4)
stream->write(ras->palette, 4*32);
stream->write8(ras->palette, 4*32);
else if(raster->format & Raster::PAL8)
stream->write(ras->palette, 4*256);
stream->write8(ras->palette, 4*256);
uint32 size;
uint8 *data;
@@ -618,7 +620,7 @@ writeNativeTexture(Texture *tex, Stream *stream)
size = getLevelSize(raster, i);
stream->writeU32(size);
data = raster->lock(i, Raster::LOCKREAD);
stream->write(data, size);
stream->write8(data, size);
raster->unlock(i);
}
}

View File

@@ -149,6 +149,7 @@ destroyNativeData(void *object, int32, int32)
Stream*
readNativeData(Stream *stream, int32, void *object, int32, int32)
{
ASSERTLITTLE;
Geometry *geometry = (Geometry*)object;
uint32 platform;
if(!findChunk(stream, ID_STRUCT, nil, nil)){
@@ -166,7 +167,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
int32 size = stream->readI32();
uint8 *data = rwNewT(uint8, size, MEMDUR_FUNCTION | ID_GEOMETRY);
stream->read(data, size);
stream->read8(data, size);
uint8 *p = data;
header->serialNumber = *(uint32*)p; p += 4;
header->numMeshes = *(uint32*)p; p += 4;
@@ -196,19 +197,19 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
VertexElement elements[NUMDECLELT];
uint32 numDeclarations = stream->readU32();
stream->read(elements, numDeclarations*8);
stream->read8(elements, numDeclarations*8);
header->vertexDeclaration = createVertexDeclaration(elements);
assert(header->indexBuffer == nil);
header->indexBuffer = createIndexBuffer(header->totalNumIndex*2, false);
uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0);
stream->read(indices, 2*header->totalNumIndex);
stream->read8(indices, 2*header->totalNumIndex);
unlockIndices(header->indexBuffer);
VertexStream *s;
p = data;
for(int i = 0; i < 2; i++){
stream->read(p, 16);
stream->read8(p, 16);
s = &header->vertexStream[i];
s->vertexBuffer = (void*)(uintptr)*(uint32*)p; p += 4;
s->offset = 0; p += 4;
@@ -223,7 +224,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
assert(s->vertexBuffer == nil);
s->vertexBuffer = createVertexBuffer(s->stride*header->totalNumVertex, 0, false);
uint8 *verts = lockVertices(s->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
stream->read(verts, s->stride*header->totalNumVertex);
stream->read8(verts, s->stride*header->totalNumVertex);
unlockVertices(s->vertexBuffer);
}
@@ -241,6 +242,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
Stream*
writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
{
ASSERTLITTLE;
Geometry *geometry = (Geometry*)object;
writeChunkHeader(stream, ID_STRUCT, len-12);
if(geometry->instData == nil ||
@@ -277,15 +279,15 @@ writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
*(uint32*)p = inst->numPrimitives; p += 4;
inst++;
}
stream->write(data, size);
stream->write8(data, size);
VertexElement elements[NUMDECLELT];
uint32 numElt = getDeclaration(header->vertexDeclaration, elements);
stream->writeU32(numElt);
stream->write(elements, 8*numElt);
stream->write8(elements, 8*numElt);
uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0);
stream->write(indices, 2*header->totalNumIndex);
stream->write8(indices, 2*header->totalNumIndex);
unlockIndices(header->indexBuffer);
VertexStream *s;
@@ -298,12 +300,12 @@ writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
*(uint16*)p = s->geometryFlags; p += 2;
*p++ = s->managed;
*p++ = s->dynamicLock;
stream->write(data, 16);
stream->write8(data, 16);
if(s->vertexBuffer == nil)
continue;
uint8 *verts = lockVertices(s->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
stream->write(verts, s->stride*header->totalNumVertex);
stream->write8(verts, s->stride*header->totalNumVertex);
unlockVertices(s->vertexBuffer);
}
@@ -708,8 +710,8 @@ readNativeTexture(Stream *stream)
// Texture
tex->filterAddressing = stream->readU32();
stream->read(tex->name, 32);
stream->read(tex->mask, 32);
stream->read8(tex->name, 32);
stream->read8(tex->mask, 32);
// Raster
int32 format = stream->readI32();
@@ -756,9 +758,9 @@ readNativeTexture(Stream *stream)
// TODO: check if format supported and convert if necessary
if(raster->format & Raster::PAL4)
stream->read(ext->palette, 4*32);
stream->read8(ext->palette, 4*32);
else if(raster->format & Raster::PAL8)
stream->read(ext->palette, 4*256);
stream->read8(ext->palette, 4*256);
uint32 size;
uint8 *data;
@@ -766,7 +768,7 @@ readNativeTexture(Stream *stream)
size = stream->readU32();
if(i < raster->getNumLevels()){
data = raster->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH);
stream->read(data, size);
stream->read8(data, size);
raster->unlock(i);
}else
stream->seek(size);
@@ -783,8 +785,8 @@ writeNativeTexture(Texture *tex, Stream *stream)
// Texture
stream->writeU32(tex->filterAddressing);
stream->write(tex->name, 32);
stream->write(tex->mask, 32);
stream->write8(tex->name, 32);
stream->write8(tex->mask, 32);
// Raster
Raster *raster = tex->raster;
@@ -806,9 +808,9 @@ writeNativeTexture(Texture *tex, Stream *stream)
stream->writeU8(flags);
if(raster->format & Raster::PAL4)
stream->write(ext->palette, 4*32);
stream->write8(ext->palette, 4*32);
else if(raster->format & Raster::PAL8)
stream->write(ext->palette, 4*256);
stream->write8(ext->palette, 4*256);
uint32 size;
uint8 *data;
@@ -816,7 +818,7 @@ writeNativeTexture(Texture *tex, Stream *stream)
size = getLevelSize(raster, i);
stream->writeU32(size);
data = raster->lock(i, Raster::LOCKREAD);
stream->write(data, size);
stream->write8(data, size);
raster->unlock(i);
}
}

View File

@@ -67,6 +67,7 @@ destroyNativeData(void *object, int32, int32)
Stream*
readNativeData(Stream *stream, int32, void *object, int32, int32)
{
ASSERTLITTLE;
Geometry *geometry = (Geometry*)object;
uint32 vers;
uint32 platform;
@@ -92,7 +93,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
// We don't have it but it's used for alignment.
header->data = rwNewT(uint8, size + 0x18, MEMDUR_EVENT | ID_GEOMETRY);
uint8 *p = header->data+0x18+4;
stream->read(p, size-4);
stream->read8(p, size-4);
header->size = size;
header->serialNumber = *(uint16*)p; p += 2;
@@ -120,13 +121,14 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
header->end = inst;
header->vertexBuffer = rwNewT(uint8, header->stride*header->numVertices, MEMDUR_EVENT | ID_GEOMETRY);
stream->read(header->vertexBuffer, header->stride*header->numVertices);
stream->read8(header->vertexBuffer, header->stride*header->numVertices);
return stream;
}
Stream*
writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
{
ASSERTLITTLE;
Geometry *geometry = (Geometry*)object;
writeChunkHeader(stream, ID_STRUCT, len-12);
if(geometry->instData == nil ||
@@ -160,8 +162,8 @@ writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
inst++;
}
stream->write(header->data+0x18, header->size);
stream->write(header->vertexBuffer, header->stride*header->numVertices);
stream->write8(header->data+0x18, header->size);
stream->write8(header->vertexBuffer, header->stride*header->numVertices);
return stream;
}
@@ -823,8 +825,8 @@ readNativeTexture(Stream *stream)
// Texture
tex->filterAddressing = stream->readU32();
stream->read(tex->name, 32);
stream->read(tex->mask, 32);
stream->read8(tex->name, 32);
stream->read8(tex->mask, 32);
// Raster
int32 format = stream->readI32();
@@ -856,13 +858,13 @@ readNativeTexture(Stream *stream)
tex->raster = raster;
if(raster->format & Raster::PAL4)
stream->read(ras->palette, 4*32);
stream->read8(ras->palette, 4*32);
else if(raster->format & Raster::PAL8)
stream->read(ras->palette, 4*256);
stream->read8(ras->palette, 4*256);
// exploit the fact that mipmaps are allocated consecutively
uint8 *data = raster->lock(0, Raster::LOCKWRITE|Raster::LOCKNOFETCH);
stream->read(data, totalSize);
stream->read8(data, totalSize);
raster->unlock(0);
return tex;
@@ -877,8 +879,8 @@ writeNativeTexture(Texture *tex, Stream *stream)
// Texture
stream->writeU32(tex->filterAddressing);
stream->write(tex->name, 32);
stream->write(tex->mask, 32);
stream->write8(tex->name, 32);
stream->write8(tex->mask, 32);
// Raster
Raster *raster = tex->raster;
@@ -901,13 +903,13 @@ writeNativeTexture(Texture *tex, Stream *stream)
stream->writeI32(totalSize);
if(raster->format & Raster::PAL4)
stream->write(ras->palette, 4*32);
stream->write8(ras->palette, 4*32);
else if(raster->format & Raster::PAL8)
stream->write(ras->palette, 4*256);
stream->write8(ras->palette, 4*256);
// exploit the fact that mipmaps are allocated consecutively
uint8 *data = raster->lock(0, Raster::LOCKREAD);
stream->write(data, totalSize);
stream->write8(data, totalSize);
raster->unlock(0);
}

View File

@@ -30,6 +30,7 @@ struct NativeSkin
Stream*
readNativeSkin(Stream *stream, int32, void *object, int32 offset)
{
ASSERTLITTLE;
Geometry *geometry = (Geometry*)object;
uint32 vers, platform;
if(!findChunk(stream, ID_STRUCT, nil, &vers)){
@@ -53,16 +54,16 @@ readNativeSkin(Stream *stream, int32, void *object, int32 offset)
skin->init(numBones, 0, 0);
NativeSkin *natskin = rwNewT(NativeSkin, 1, MEMDUR_EVENT | ID_SKIN);
skin->platformData = natskin;
stream->read(natskin->table1, 256*sizeof(int32));
stream->read(natskin->table2, 256*sizeof(int32));
stream->read32(natskin->table1, 256*sizeof(int32));
stream->read32(natskin->table2, 256*sizeof(int32));
natskin->numUsedBones = stream->readI32();
skin->numWeights = stream->readI32();
stream->seek(4); // skip pointer to vertexBuffer
natskin->stride = stream->readI32();
int32 size = geometry->numVertices*natskin->stride;
natskin->vertexBuffer = rwNewT(uint8, size, MEMDUR_EVENT | ID_SKIN);
stream->read(natskin->vertexBuffer, size);
stream->read(skin->inverseMatrices, skin->numBones*64);
stream->read8(natskin->vertexBuffer, size);
stream->read32(skin->inverseMatrices, skin->numBones*64);
readSkinSplitData(stream, skin);
return stream;
@@ -71,6 +72,7 @@ readNativeSkin(Stream *stream, int32, void *object, int32 offset)
Stream*
writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset)
{
ASSERTLITTLE;
Geometry *geometry = (Geometry*)object;
Skin *skin = *PLUGINOFFSET(Skin*, object, offset);
assert(skin->platformData);
@@ -80,15 +82,15 @@ writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset)
writeChunkHeader(stream, ID_STRUCT, len-12);
stream->writeU32(PLATFORM_XBOX);
stream->writeI32(skin->numBones);
stream->write(natskin->table1, 256*sizeof(int32));
stream->write(natskin->table2, 256*sizeof(int32));
stream->write32(natskin->table1, 256*sizeof(int32));
stream->write32(natskin->table2, 256*sizeof(int32));
stream->writeI32(natskin->numUsedBones);
stream->writeI32(skin->numWeights);
stream->writeU32(0xBADEAFFE); // pointer to vertexBuffer
stream->writeI32(natskin->stride);
stream->write(natskin->vertexBuffer,
stream->write8(natskin->vertexBuffer,
geometry->numVertices*natskin->stride);
stream->write(skin->inverseMatrices, skin->numBones*64);
stream->write32(skin->inverseMatrices, skin->numBones*64);
writeSkinSplitData(stream, skin);
return stream;