Page 1 of 1
gsKit fontm problem and broken arial.fnt
Posted: Fri Sep 14, 2007 9:12 am
by Mega Man
Hello,
I have a problem with gsKit and fontm. I can't print the following string correctly: "host:initrd.gz".
The character "d" is replaced by a strange letter (I think this is japanese).
On every second frame the character "g" is replaced by a dot.
I used the fontm example in gsKit and changed the main loop to:
Code: Select all
while(1)
{
gsKit_clear(gsGlobal, White);
gsKit_font_print_scaled(gsGlobal, gsFont, 50, 50, 3, 0.85f, TexCol,
"host:initrd.gz");
gsKit_sync_flip(gsGlobal);
gsKit_queue_exec(gsGlobal);
}
When I remove the characters "." and ":", it is working.
There is a second problem:
The font example is not working, because the file "arial.fnt" is broken. When I start it, I get a page fault. When I replace all linux line ends by DOS line ends in "arial.fnt", I got at least a broken font on the display.
Posted: Fri Sep 14, 2007 1:09 pm
by ragnarok2040
I experienced the same issue with arial.fnt and lucida.fnt and fontm. Reverting to an earlier version of gsKit fixed it though, so I don't think the .fnt files are bad, but perhaps converting from the fio* based functions to stdio file functions is giving different output than what the original code expects. I'm not actually sure why it was changed.. since the fio* functions support "pfs#" based paths just as well as "mc#" and "mass". I never did look into it much since I went a different direction. Are you using the latest revision? A patch recently went in that added checks to see if a FILE pointer was NULL before trying to read from it, which fixed the exception I was getting... though it was weird since I was giving the fopen() function a valid path from the very beginning, at least I remember thinking that I was. It was a bit ago, now.
For the fontm bug, I never found a fix for the recent revision, only a workaround for revision 1386, which didn't actually work well for me. Polo35 mentioned that setting "uploaded = 0;" to "uploaded = 1;" in the gsKit_font_print_scaled() function and then copying and pasting an extra gsKit_texture_send_inline() call reduced the glitch significantly but the gsKit code has changed a lot since then so it no longer applies. He thought maybe the prim_sprite() call was a little too fast after the send_inline() call. I noticed the glitch tended to be less noticeable with the more burdens placed on the GS. The problem I was getting involved c/x (ascii 63/78 fontm 3/233) replacement, and . with a small | (ascii 46/124 fontm 4/47, I believe, but I think it wasn't a ascii mapped fontm character) and a few other anomalies.
Posted: Fri Sep 14, 2007 5:32 pm
by ps2devman
Try avoiding any dma activity while displaying font.
Sounds strange, but issue cause is strange anyway.
Posted: Fri Sep 14, 2007 5:48 pm
by Mega Man
Yes, I am using the latest version.
I see that fread is failing. It seems that the calculation for the variable "size" is wrong. When I remove the check for the command "fread(gsFont->Texture->Mem, size, 1, File)", it is working.
I think the code for fontm is very strange. It is very difficult to understand, how the textures are uploaded. I believe that the wrong fontm page is selected. Why is "aligned" the key for finding a texture line, "idxoffset" would be make more sense.
Posted: Sat Sep 15, 2007 7:40 am
by Mega Man
I looked over the code and now I am understanding what the code does. There are two pages in the VRAM used for the font. The font is not compeltely uploaded, but uploaded in small blocks. The blocks are stored in the 2 pages. The commands for uploading and drawing a char are put into a DMA queue. The queue is executed in FIFO order. So it is possible to reuse each page after a char is drawn. But I remember that I read somewhere that the GS has something like a cache. In the manual is written that a cache is used at least for the palette (CLUT is for every char the same). The chars are very small and would fit into the smallest cache and when memory is reused, we need a cache flush.
So my solution is to use the page which is not recently used for the last char. My patch is as follows:
Code: Select all
--- ee/gs/src/gsFont.c.orig
+++ ee/gs/src/gsFont.c
@@ -708,6 +708,7 @@ void gsKit_font_print_scaled(GSGLOBAL *g
if (gsFont->FontM_LastPage[pgindx] == aligned)
{
gsFont->Texture->Vram = gsFont->FontM_Vram[pgindx];
+ gsFont->FontM_VramIdx = (pgindx + 1) % GS_FONT_PAGE_COUNT;
break;
}
}
I patched the place where it looks if there is already a block uploaded including the current char. The code part which uploads a font block, already includes the added line. Now I see that "aligned" can be used as a key detect this situation, because it is unique for each block as "idxoffset" is.
I don't know if this really fix the problem, but it seems to work.
Posted: Sat Sep 15, 2007 1:43 pm
by ooPo
I've added this fix to the repository.
Code: Select all
Sending ee/gs/src/gsFont.c
Transmitting file data .
Committed revision 1449.
Posted: Sun Sep 16, 2007 6:46 pm
by ps2devman
Wow! Nice brain, Mega man! Grats on finding that fix!
Posted: Mon Sep 17, 2007 6:58 am
by Neovanglist
Thanks!
Yea, I added this vram page feature later for fontm and didn't do extensive testing with other fonts... thus creating this timing issue.
I really appreciate the patch :)
Posted: Tue Nov 06, 2007 10:43 am
by Mega Man
I detected that the texture cache is bigger and my patch didn't fix it. It just reduces the error rate.
So I was looking at the GS manual. There must be a flush function and I found it. We need just to access TEXFLUSH register.
I was suprised as I saw that this is already done in the texture uploading function, but I was still sure that the error must be here.
So I checked the access against the other GS register accesses and I saw the order is incorrect.
The original code does:
*p_data++ = GS_TEXFLUSH;
*p_data++ = 0;
Other code put first the value in and then the register, so I changed it to:
*p_data++ = 0;
*p_data++ = GS_TEXFLUSH;
This solves the problem!
The bug is in 2 functions:
gsKit_texture_send
gsKit_texture_send_inline
We should leave my old patch in the code, because an LRU algorithm should lead to less uploads.
Posted: Wed Nov 07, 2007 10:39 am
by cosmito
Wow Mega Man
That solved (almost) the glitches I found - see
http://forums.ps2dev.org/viewtopic.php?t=9012.
There is still sometimes a glitch but I was getting also some crazy letters (some charaters changing during display) and that was solved.
Thanks!
Posted: Mon Nov 10, 2008 12:27 am
by cosmito
I guess the changes Mega Man pointed should go into the repository. Anyone with commit rights would like to take the task?
Posted: Mon Nov 10, 2008 1:45 am
by LBGSHI
Agreed; though I don't have commit rights (Oobles was going to create an account for me, but I suppose never got around to it...).
Posted: Mon Nov 10, 2008 4:01 am
by ragnarok2040
Since I've just got done merging ntba2's libjpg interface with dlanor's and Polo's changes with libjpeg 6b-14 (with debian's patches) and a C++ header fix, I need to modify gsKit's Makefile.eeglobal to build with it so I can add the fixes while I'm doing that and make a patch. I'll investigate the reason the arial.fnt example keeps crashing too and see if I can't fix that as well :D.
Found it, division bug in fread...
Code: Select all
ret += _ps2sdk_read(stream->fd, buf, read_len) / r;
but should have been
Code: Select all
ret += _ps2sdk_read(stream->fd, buf, read_len) / n;
which caused the fread() function to return 0 or 1. Before it was number of bytes read divided by the size to be read, and after it's number of bytes read divided by number of records to be read of size r.
The source I just checked out still has all the fio* functions in place of the generic _ps2sdk_* symbols for both fileXio* and fio* functions in stdio.c file functions.
radad released a patch some time ago for fileXio_rpc.c and stdio.c to fix that:
http://forums.ps2dev.org/viewtopic.php?t=4050
I plan on expanding that patch to include _ps2sdk_remove* as well though.
Posted: Mon Nov 10, 2008 7:57 am
by ragnarok2040
I consolidated all of my updates into a single archive at
http://homebrew.thewaffleiron.net/ragnarok2040.The updates.tar.gz package has the _ps2sdk_* stdio symbols for linking against fileXio and fileio, that updated crt0.s that was posted by chp which I've been using extensively, the last fix for gsKit by MegaMan plus a makefile.eeglobal change for libjpeg, libpng-1.2.33, zlib-1.2.3, libjpeg-6b-14 which has debian's patches with ntba2's alignment fix and ntba2's interface functions with Polo and dlanor's additions plus a C++ fix for the libjpg header,
All the gsKit examples work fine for me now :D.
Posted: Mon Nov 10, 2008 11:48 am
by ooPo
Code: Select all
Sending ps2sdk/ee/libc/src/stdio.c
Sending ps2sdk/ee/rpc/filexio/src/fileXio_rpc.c
Sending ps2sdk/ee/startup/src/crt0.s
Transmitting file data ...
Committed revision 1466.
Code: Select all
Sending gsKit/Makefile.global
Sending gsKit/ee/gs/src/gsTexture.c
Transmitting file data ..
Committed revision 1467.
Committed to the repository. Enjoy!
Posted: Mon Nov 10, 2008 7:15 pm
by ragnarok2040
Oops, I had forgotten to add a subdirectory to my local copy of libjpeg using 'svn add' so 'svn diff' didn't include it in the libjpeg patch. I guess I just overlooked the size of the patch. I checked out the latest revision and made a new patch for it with the full update this time called libjpeg.diff.tar.gz. I also included it in updates.tar.gz. Sorry about that :/.
Edit:
fread() actually was fine, so I'll submit a patch to revert my change.I thought it was a division precision error but I guess it wasn't :D. gsKit_texture_fnt() tries to read in 262144 bytes of data (the size of the texture) but there's only 262143 bytes to be read, so fread() returns 0 like it ought have.
Code: Select all
Index: ps2sdk/ee/libc/src/stdio.c
===================================================================
--- ps2sdk/ee/libc/src/stdio.c (revision 1467)
+++ ps2sdk/ee/libc/src/stdio.c (working copy)
@@ -752,7 +752,7 @@
read_len--;
}
//ret += fioRead(stream->fd, buf, read_len) / r;
- ret += _ps2sdk_read(stream->fd, buf, read_len) / n;
+ ret += _ps2sdk_read(stream->fd, buf, read_len) / r;
}
return (ret);
}
As a side note, does anyone know what type of font those .fnt files are? The way gsKit_texture_fnt() reads the header on them doesn't conform to the spec of windows .fnts. I can't get fontforge to recognize the file type either and it supports a good range. From the looks of it, it seems to be something like this
http://giesler.biz/bjoern/downloads/dsg ... format.txt.
This patch just lets gsKit work with the bad font read until a better fix is made.
Code: Select all
Index: gsKit/ee/gs/src/gsTexture.c
===================================================================
--- gsKit/ee/gs/src/gsTexture.c (revision 1467)
+++ gsKit/ee/gs/src/gsTexture.c (working copy)
@@ -774,8 +774,7 @@
if(fread(gsFont->Texture->Mem, size, 1, File) <= 0)
{
- printf("Could not load font: %s\n", gsFont->Path);
- return -1;
+ printf("Font might be bad: %s\n", gsFont->Path);
}
fclose(File);
Posted: Tue Nov 11, 2008 12:12 am
by ooPo
Code: Select all
Sending libjpeg/src/Makefile
Adding libjpeg/src/jpeg-6b
Adding libjpeg/src/jpeg-6b/debian
Adding libjpeg/src/jpeg-6b/debian/changelog
Adding libjpeg/src/jpeg-6b/debian/copyright
Adding libjpeg/src/jpeg-6b/debian/libjpeg62-dev.README.Debian
Adding libjpeg/src/jpeg-6b/docs
Adding libjpeg/src/jpeg-6b/docs/jconfig.doc
Adding libjpeg/src/jpeg-6b/docs/libjpeg.doc
Adding libjpeg/src/jpeg-6b/docs/structure.doc
Adding libjpeg/src/jpeg-6b/jcapimin.c
Adding libjpeg/src/jpeg-6b/jcapistd.c
Adding libjpeg/src/jpeg-6b/jccoefct.c
Adding libjpeg/src/jpeg-6b/jccolor.c
Adding libjpeg/src/jpeg-6b/jcdctmgr.c
Adding libjpeg/src/jpeg-6b/jchuff.c
Adding libjpeg/src/jpeg-6b/jchuff.h
Adding libjpeg/src/jpeg-6b/jcinit.c
Adding libjpeg/src/jpeg-6b/jcmainct.c
Adding libjpeg/src/jpeg-6b/jcmarker.c
Adding libjpeg/src/jpeg-6b/jcmaster.c
Adding libjpeg/src/jpeg-6b/jcomapi.c
Adding libjpeg/src/jpeg-6b/jcparam.c
Adding libjpeg/src/jpeg-6b/jcphuff.c
Adding libjpeg/src/jpeg-6b/jcprepct.c
Adding libjpeg/src/jpeg-6b/jcsample.c
Adding libjpeg/src/jpeg-6b/jctrans.c
Adding libjpeg/src/jpeg-6b/jdapimin.c
Adding libjpeg/src/jpeg-6b/jdapistd.c
Adding libjpeg/src/jpeg-6b/jdatadst.c
Adding libjpeg/src/jpeg-6b/jdatasrc.c
Adding libjpeg/src/jpeg-6b/jdcoefct.c
Adding libjpeg/src/jpeg-6b/jdcolor.c
Adding libjpeg/src/jpeg-6b/jdct.h
Adding libjpeg/src/jpeg-6b/jddctmgr.c
Adding libjpeg/src/jpeg-6b/jdhuff.c
Adding libjpeg/src/jpeg-6b/jdhuff.h
Adding libjpeg/src/jpeg-6b/jdinput.c
Adding libjpeg/src/jpeg-6b/jdmainct.c
Adding libjpeg/src/jpeg-6b/jdmarker.c
Adding libjpeg/src/jpeg-6b/jdmaster.c
Adding libjpeg/src/jpeg-6b/jdmerge.c
Adding libjpeg/src/jpeg-6b/jdphuff.c
Adding libjpeg/src/jpeg-6b/jdpostct.c
Adding libjpeg/src/jpeg-6b/jdsample.c
Adding libjpeg/src/jpeg-6b/jdtrans.c
Adding libjpeg/src/jpeg-6b/jerror.c
Adding libjpeg/src/jpeg-6b/jerror.h
Adding libjpeg/src/jpeg-6b/jfdctflt.c
Adding libjpeg/src/jpeg-6b/jfdctfst.c
Adding libjpeg/src/jpeg-6b/jfdctint.c
Adding libjpeg/src/jpeg-6b/jidctflt.c
Adding libjpeg/src/jpeg-6b/jidctfst.c
Adding libjpeg/src/jpeg-6b/jidctint.c
Adding libjpeg/src/jpeg-6b/jidctred.c
Adding libjpeg/src/jpeg-6b/jinclude.h
Adding libjpeg/src/jpeg-6b/jmemmgr.c
Adding libjpeg/src/jpeg-6b/jmemnobs.c
Adding libjpeg/src/jpeg-6b/jmemsys.h
Adding libjpeg/src/jpeg-6b/jpegint.h
Adding libjpeg/src/jpeg-6b/jquant1.c
Adding libjpeg/src/jpeg-6b/jquant2.c
Adding libjpeg/src/jpeg-6b/jutils.c
Adding libjpeg/src/jpeg-6b/jversion.h
Adding libjpeg/src/jpeg-6b/samples
Adding libjpeg/src/jpeg-6b/samples/cderror.h
Adding libjpeg/src/jpeg-6b/samples/cdjpeg.c
Adding libjpeg/src/jpeg-6b/samples/cdjpeg.h
Adding libjpeg/src/jpeg-6b/samples/cjpeg.c
Adding libjpeg/src/jpeg-6b/samples/ckconfig.c
Adding libjpeg/src/jpeg-6b/samples/djpeg.c
Adding libjpeg/src/jpeg-6b/samples/example.c
Adding libjpeg/src/jpeg-6b/samples/jpegtran.c
Adding libjpeg/src/jpeg-6b/samples/rdbmp.c
Adding libjpeg/src/jpeg-6b/samples/rdcolmap.c
Adding libjpeg/src/jpeg-6b/samples/rdgif.c
Adding libjpeg/src/jpeg-6b/samples/rdjpgcom.c
Adding libjpeg/src/jpeg-6b/samples/rdppm.c
Adding libjpeg/src/jpeg-6b/samples/rdrle.c
Adding libjpeg/src/jpeg-6b/samples/rdswitch.c
Adding libjpeg/src/jpeg-6b/samples/rdtarga.c
Adding libjpeg/src/jpeg-6b/samples/transupp.c
Adding libjpeg/src/jpeg-6b/samples/transupp.h
Adding libjpeg/src/jpeg-6b/samples/wrbmp.c
Adding libjpeg/src/jpeg-6b/samples/wrgif.c
Adding libjpeg/src/jpeg-6b/samples/wrjpgcom.c
Adding libjpeg/src/jpeg-6b/samples/wrppm.c
Adding libjpeg/src/jpeg-6b/samples/wrrle.c
Adding libjpeg/src/jpeg-6b/samples/wrtarga.c
Transmitting file data .....................................................................................
Committed revision 1468.
Code: Select all
Sending ps2sdk/ee/libc/src/stdio.c
Transmitting file data .
Committed revision 1469.
Code: Select all
Sending gsKit/ee/gs/src/gsTexture.c
Transmitting file data .
Committed revision 1470.
All updated. Anything else? :)
Posted: Tue Nov 11, 2008 12:26 am
by ragnarok2040
That should do it. I'll see if I can't fix the font code a bit. :D