Two changes here:

1) Consolidated the Loggers so that we only have one in JGE.  Added a helper constructor/destructor to the JLogger class so that you can instantiate one at the top of a function, it'll trace out a 'start' and 'end' message when it goes in & out of scope.
2) Fixed the crash part of a bug I've been chasing down where, on the psp, after saturating the cache, the game dies when trying to reload the background PNG image of the deck menu. We still need to fix the root cause of the failure (not enough memory to allocate a temporary buffer for the swizzle operation), but at least the psp doesn't lock up anymore.  I've also left behind all the log traces I inserted into the LoadPNG code, since we'll probably need them again.
This commit is contained in:
wrenczes@gmail.com
2010-11-10 02:24:39 +00:00
parent 2c3e1b551b
commit eea91e9a1a
11 changed files with 202 additions and 208 deletions

View File

@@ -705,6 +705,10 @@
Name="Header Files"
Filter="h;hpp;hxx;hm;inl"
>
<File
RelativePath=".\include\DebugRoutines.h"
>
</File>
<File
RelativePath=".\include\decoder_prx.h"
>

View File

@@ -4,8 +4,6 @@
// dirty, but I get OS header includes this way
#include "JGE.h"
#include "config.h"
#include <iostream>
#include <stdio.h>
#include <string>

View File

@@ -1,19 +1,27 @@
#ifndef _JLOGGER_H_
#define _JLOGGER_H_
//logging facility
//#define DOJLOG
//#define DOLOG
#ifdef DOJLOG
#define JLOG(x) JLogger::Log(x);
#ifdef DOLOG
#define LOG(x) JLogger::Log(x);
#else
#define JLOG(x) {};
#define LOG(x) {};
#endif
#define JGE_LOG_FILE "jge_debug.txt"
// saving myself the pain of search/replace
#define JLOG(x) LOG(x)
#define LOG_FILE "debug.txt"
class JLogger{
public:
static void Log(const char * text);
JLogger(const char* text);
~JLogger();
const char* mText;
};
#endif

View File

@@ -21,6 +21,8 @@
#include "../include/vram.h"
#include "../include/JLogger.h"
#include <sstream>
#ifdef __cplusplus
extern "C" {
#endif
@@ -853,7 +855,8 @@ void JRenderer::ScreenShot(const char* filename)
static void PNGCustomWarningFn(png_structp png_ptr, png_const_charp warning_msg)
{
// ignore PNG warnings
JLOG("PNG error callback fired!");
JLOG(warning_msg);
}
static void PNGCustomReadDataFn(png_structp png_ptr, png_bytep data, png_size_t length)
@@ -1195,6 +1198,7 @@ JTexture* JRenderer::LoadTexture(const char* filename, int mode, int textureMode
bool done = false;
JLOG("Allocating Texture");
JTexture* tex = new JTexture();
if (tex)
{
@@ -1233,159 +1237,179 @@ JTexture* JRenderer::LoadTexture(const char* filename, int mode, int textureMode
int JRenderer::LoadPNG(TextureInfo &textureInfo, const char* filename, int mode, int textureMode)
{
JLOG("JRenderer::LoadPNG");
textureInfo.mBits = NULL;
textureInfo.mBits = NULL;
bool useVideoRAM = (mode == TEX_TYPE_USE_VRAM);
int pixelformat = PIXEL_FORMAT;
bool useVideoRAM = (mode == TEX_TYPE_USE_VRAM);
int pixelformat = PIXEL_FORMAT;
u32* p32;
u16* p16;
png_structp png_ptr;
png_infop info_ptr;
unsigned int sig_read = 0;
png_uint_32 width, height;
int bit_depth, color_type, interlace_type, x, y;
u32* line;
u32* p32;
u16* p16;
png_structp png_ptr;
png_infop info_ptr;
unsigned int sig_read = 0;
png_uint_32 width, height;
int bit_depth, color_type, interlace_type, x, y;
u32* line;
JFileSystem* fileSystem = JFileSystem::GetInstance();
if (!fileSystem->OpenFile(filename)) return JGE_ERR_CANT_OPEN_FILE;
JFileSystem* fileSystem = JFileSystem::GetInstance();
if (!fileSystem->OpenFile(filename)) return JGE_ERR_CANT_OPEN_FILE;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
fileSystem->CloseFile();
return JGE_ERR_PNG;
}
png_set_error_fn(png_ptr, (png_voidp) NULL, (png_error_ptr) NULL, PNGCustomWarningFn);
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
fileSystem->CloseFile();
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return JGE_ERR_PNG;
}
png_init_io(png_ptr, NULL);
png_set_read_fn(png_ptr, (png_voidp)fileSystem, PNGCustomReadDataFn);
JLOG("PNG opened - creating read struct");
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
fileSystem->CloseFile();
return JGE_ERR_PNG;
}
JLOG("Setting error callback func");
png_set_error_fn(png_ptr, (png_voidp) NULL, (png_error_ptr) NULL, PNGCustomWarningFn);
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
fileSystem->CloseFile();
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return JGE_ERR_PNG;
}
png_init_io(png_ptr, NULL);
png_set_read_fn(png_ptr, (png_voidp)fileSystem, PNGCustomReadDataFn);
png_set_sig_bytes(png_ptr, sig_read);
png_read_info(png_ptr, info_ptr);
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, int_p_NULL, int_p_NULL);
png_set_strip_16(png_ptr);
png_set_packing(png_ptr);
if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr);
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_gray_1_2_4_to_8(png_ptr);
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
line = (u32*) malloc(width * 4);
if (!line) {
fileSystem->CloseFile();
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return JGE_ERR_MALLOC_FAILED;
}
png_set_sig_bytes(png_ptr, sig_read);
png_read_info(png_ptr, info_ptr);
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, int_p_NULL, int_p_NULL);
png_set_strip_16(png_ptr);
png_set_packing(png_ptr);
if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr);
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_gray_1_2_4_to_8(png_ptr);
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
line = (u32*) malloc(width * 4);
if (!line) {
fileSystem->CloseFile();
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return JGE_ERR_MALLOC_FAILED;
}
int texWidth = getNextPower2(width);
int texHeight = getNextPower2(height);
int texWidth = getNextPower2(width);
int texHeight = getNextPower2(height);
bool done = false;
PIXEL_TYPE* bits = NULL;
bool videoRAMUsed = false;
int size = texWidth * texHeight * sizeof(PIXEL_TYPE);
bool done = false;
PIXEL_TYPE* bits = NULL;
bool videoRAMUsed = false;
int size = texWidth * texHeight * sizeof(PIXEL_TYPE);
{
if (useVideoRAM)
{
if (useVideoRAM)
{
bits = (PIXEL_TYPE*) valloc(size);
videoRAMUsed = true;
}
if (bits == NULL)
{
videoRAMUsed = false;
bits = (PIXEL_TYPE*) memalign(16, size);
}
PIXEL_TYPE* buffer = bits;
if (mSwizzle)
buffer = (PIXEL_TYPE*) memalign(16, texWidth * texHeight * sizeof(PIXEL_TYPE));
if (buffer)
{
p32 = (u32*) buffer;
p16 = (u16*) p32;
for (y = 0; y < (int)height; y++)
{
png_read_row(png_ptr, (u8*) line, png_bytep_NULL);
for (x = 0; x < (int)width; x++)
{
u32 color32 = line[x];
u16 color16;
int a = (color32 >> 24) & 0xff;
int r = color32 & 0xff;
int g = (color32 >> 8) & 0xff;
int b = (color32 >> 16) & 0xff;
switch (pixelformat) {
case PSP_DISPLAY_PIXEL_FORMAT_565:
color16 = (r >> 3) | ((g >> 2) << 5) | ((b >> 3) << 11);
*(p16+x) = color16;
break;
case PSP_DISPLAY_PIXEL_FORMAT_5551:
color16 = (r >> 3) | ((g >> 3) << 5) | ((b >> 3) << 10) | ((a >> 7) << 15);
*(p16+x) = color16;
break;
case PSP_DISPLAY_PIXEL_FORMAT_4444:
color16 = (r >> 4) | ((g >> 4) << 4) | ((b >> 4) << 8) | ((a >> 4) << 12);
*(p16+x) = color16;
break;
case PSP_DISPLAY_PIXEL_FORMAT_8888:
color32 = r | (g << 8) | (b << 16) | (a << 24);
*(p32+x) = color32;
break;
}
}
p32 += texWidth;
p16 += texWidth;
}
if (mSwizzle)
{
swizzle_fast((u8*)bits, (const u8*)buffer, texWidth*sizeof(PIXEL_TYPE), texHeight);
free (buffer);
}
done = true;
}
bits = (PIXEL_TYPE*) valloc(size);
videoRAMUsed = true;
}
free (line);
png_read_end(png_ptr, info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
if (bits == NULL)
{
videoRAMUsed = false;
bits = (PIXEL_TYPE*) memalign(16, size);
}
fileSystem->CloseFile();
PIXEL_TYPE* buffer = bits;
if (done)
{
textureInfo.mBits = (u8 *)bits;
textureInfo.mWidth = width;
textureInfo.mHeight = height;
textureInfo.mTexWidth = texWidth;
textureInfo.mTexHeight = texHeight;
textureInfo.mVRAM = videoRAMUsed;
if (mSwizzle)
{
JLOG("allocating swizzle buffer");
buffer = (PIXEL_TYPE*) memalign(16, texWidth * texHeight * sizeof(PIXEL_TYPE));
if (!buffer)
{
JLOG("failed to allocate destination swizzle buffer!");
std::ostringstream stream;
stream << "Alloc failed for: Tex Width: " << texWidth << " Tex Height: " << texHeight << ", total bytes: " << texWidth * texHeight * sizeof(PIXEL_TYPE);
JLOG(stream.str().c_str());
fileSystem->CloseFile();
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return JGE_ERR_MALLOC_FAILED;
}
}
if (buffer)
{
JLOG("buffer allocated");
p32 = (u32*) buffer;
p16 = (u16*) p32;
for (y = 0; y < (int)height; y++)
{
png_read_row(png_ptr, (u8*) line, png_bytep_NULL);
for (x = 0; x < (int)width; x++)
{
u32 color32 = line[x];
u16 color16;
int a = (color32 >> 24) & 0xff;
int r = color32 & 0xff;
int g = (color32 >> 8) & 0xff;
int b = (color32 >> 16) & 0xff;
switch (pixelformat) {
case PSP_DISPLAY_PIXEL_FORMAT_565:
color16 = (r >> 3) | ((g >> 2) << 5) | ((b >> 3) << 11);
*(p16+x) = color16;
break;
case PSP_DISPLAY_PIXEL_FORMAT_5551:
color16 = (r >> 3) | ((g >> 3) << 5) | ((b >> 3) << 10) | ((a >> 7) << 15);
*(p16+x) = color16;
break;
case PSP_DISPLAY_PIXEL_FORMAT_4444:
color16 = (r >> 4) | ((g >> 4) << 4) | ((b >> 4) << 8) | ((a >> 4) << 12);
*(p16+x) = color16;
break;
case PSP_DISPLAY_PIXEL_FORMAT_8888:
color32 = r | (g << 8) | (b << 16) | (a << 24);
*(p32+x) = color32;
break;
}
}
p32 += texWidth;
p16 += texWidth;
}
if (mSwizzle)
{
JLOG("performing swizzle");
swizzle_fast((u8*)bits, (const u8*)buffer, texWidth*sizeof(PIXEL_TYPE), texHeight);
free (buffer);
}
done = true;
}
}
JLOG("Freeing line");
free (line);
JLOG("Reading end");
png_read_end(png_ptr, info_ptr);
JLOG("Destroying read struct");
png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
JLOG("Closing PNG");
fileSystem->CloseFile();
if (done)
{
textureInfo.mBits = (u8 *)bits;
textureInfo.mWidth = width;
textureInfo.mHeight = height;
textureInfo.mTexWidth = texWidth;
textureInfo.mTexHeight = texHeight;
textureInfo.mVRAM = videoRAMUsed;
JLOG("-- OK -- JRenderer::LoadPNG");
return 1;
}
else
{
}
else
{
JLOG("LoadPNG failure - deallocating bits");
textureInfo.mBits = NULL;
textureInfo.mBits = NULL;
if (videoRAMUsed)
vfree(bits);
else
free(bits);
if (videoRAMUsed)
vfree(bits);
else
free(bits);
return JGE_ERR_GENERIC;
}
}
}

View File

@@ -1,25 +1,34 @@
#include "../include/JLogger.h"
#include <iostream>
#include <fstream>
using namespace std;
#include "../include/DebugRoutines.h"
#if defined (WIN32)
#include <windows.h>
#endif
#include <fstream>
void JLogger::Log(const char * text){
ofstream file (JGE_LOG_FILE,ios_base::app);
std::ofstream file(LOG_FILE, std::ios_base::app);
if (file){
file << text;
file << "\n";
file.close();
}
#if defined (WIN32) && !defined(QT_CONFIG)
OutputDebugString(text);
OutputDebugString("\n");
#else
printf("%s", text);
printf("\n");
#endif
DebugTrace(text);
}
JLogger::JLogger(const char* text) : mText(text)
{
#ifdef DOLOG
std::ostringstream stream;
stream << mText << ": Start";
JLogger::Log(stream.str().c_str());
#endif
}
JLogger::~JLogger()
{
#ifdef DOLOG
std::ostringstream stream;
stream << mText << ": End";
JLogger::Log(stream.str().c_str());
#endif
}

View File

@@ -1,4 +1,4 @@
OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/AllAbilities.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardPrimitive.o objs/CardSelector.o objs/CardSelectorSingleton.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckEditorMenu.o objs/DeckMenu.o objs/DeckMenuItem.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o objs/DeckManager.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GameStateStory.o objs/GameStateTransitions.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/Logger.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGPack.o objs/MTGRules.o objs/Navigator.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/Pos.o objs/PrecompiledHeader.o objs/PriceList.o objs/ReplacementEffects.o objs/Rules.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/SimplePad.o objs/StoryFlow.o objs/StyleManager.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/ThisDescriptor.o objs/Token.o objs/Translate.o objs/TranslateKeys.o objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o objs/WFont.o
OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/AllAbilities.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardPrimitive.o objs/CardSelector.o objs/CardSelectorSingleton.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckEditorMenu.o objs/DeckMenu.o objs/DeckMenuItem.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o objs/DeckManager.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GameStateStory.o objs/GameStateTransitions.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGPack.o objs/MTGRules.o objs/Navigator.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/Pos.o objs/PrecompiledHeader.o objs/PriceList.o objs/ReplacementEffects.o objs/Rules.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/SimplePad.o objs/StoryFlow.o objs/StyleManager.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/ThisDescriptor.o objs/Token.o objs/Translate.o objs/TranslateKeys.o objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o objs/WFont.o
DEPS = $(patsubst objs/%.o, deps/%.d, $(OBJS))
RESULT = $(shell psp-config --psp-prefix 2> Makefile.cache)

View File

@@ -11,10 +11,6 @@
#ifndef _GAMEAPP_H_
#define _GAMEAPP_H_
#include "Logger.h"
#include <JApp.h>
#include <JGE.h>
#include <JSprite.h>

View File

@@ -1,19 +0,0 @@
#ifndef _LOGGER_H
#define _LOGGER_H_
//TODO Remove this and use the jge logging facility (same system)
//#define DOLOG
#ifdef DOLOG
#define LOG_FILE "debug.txt"
class Logger{
public:
static void Log(const char * text);
};
#define LOG(x) Logger::Log(x);
#else
#define LOG(x)
#endif
#endif

View File

@@ -17,5 +17,6 @@
#include "JGE.h"
#include "JFileSystem.h"
#include "JLogger.h"
#endif //PRECOMPILEDHEADER_H

View File

@@ -1,19 +0,0 @@
#include "PrecompiledHeader.h"
#include "Logger.h"
#ifdef DOLOG
using namespace std;
void Logger::Log(const char * text){
ofstream file (LOG_FILE,ios_base::app);
if (file){
file << text;
file << "\n";
file.close();
}
DebugTrace(text);
}
#endif

View File

@@ -693,10 +693,6 @@
RelativePath=".\src\GuiStatic.cpp"
>
</File>
<File
RelativePath=".\src\Logger.cpp"
>
</File>
<File
RelativePath=".\src\ManaCost.cpp"
>
@@ -1158,10 +1154,6 @@
RelativePath=".\include\GuiStatic.h"
>
</File>
<File
RelativePath=".\include\Logger.h"
>
</File>
<File
RelativePath=".\include\Manacost.h"
>