Upload changes to an AnimTexture

Blitz3D Forums/Blitz3D Programming/Upload changes to an AnimTexture

_33(Posted 2007) [#1]
I'm looking for the fastest way to upload changes to an AnimTexture which resides in GDDR memory. Since you can't peek and poke GDDR, what do you suggest?

I've tought of keeping a copy of the Animtexture but in RAM, and maybe poking there, and then upload the changes. Other solutions welcome!

We're still talking about rather big textures to upload, 1024x1024 in 32bits every frame is rather heavy on a system IMHO (240 megs data transfer each second, heh).


Dreamora(Posted 2007) [#2]
Toms DX7Test.dll and render to texture usage
Alternatively make sure that the texture is loaded with flag 256 and use the draw commands.


Of what kind of changes are we talking here? stuff that needs writepixelfast or something that could be done by copyrect as well?
If you store the "anim data" in RAM you will most likely hit the indie RAM - VRAM borders, so I would consider as well a usage of 512x512 where 1024x1024 isn't needed (for example at 1024x768 resolution and lower)


240megs each second or each frame? (each second would mean a single 1024x1024 @ 32bit updated 60 times)


_33(Posted 2007) [#3]
Yea, 240megs each second for a 1024x1024 pixel anim texture, which represent in actual fact a 256 character font of 64x64 pixels each character. Actually this would the the worst case scenario, where the font is updated each frame on a 60 fps basis. But, I could be dealing with 15 FPS updates on one 1024x1024 anim texture and it could probably be well enough.

The methods I used in order to create fonts from crude data are too slow right now, just from a creation standpoint, so realtime updating to me is impossible, specially, not even at 10 fps or 15 fps, so you can imagine 60fps. That is why I plea for some help here.

I'll post my font creation routine here (which also has the rem'd out code that I wished worked properly):

http://www.blitzbasic.com/Community/posts.php?topic=30480 (reference)

Function term_build_font(font_id%)
   If term\font[font_id]\name$ <> "" Or term\font[font_id]\texture <> 0 Or term\font[font_id]\image <> 0 Then
      Return TRMRC_already_initialized
   EndIf
   
   Select font_id%
      Case 0 : Restore font_atascii
      Case 1 : Restore font_ascii
      Case 2 : Return TRMRC_invalid_font_id
      Case 3 : Return TRMRC_invalid_font_id
      Case 4 : Restore font_gridscii
      Case 5 : Restore font_petscii
      Case 6 : Restore font_slimscii
      Case 7 : Return TRMRC_invalid_font_id
      Default : Return TRMRC_invalid_font_id
   End Select
   
   Read term\font[font_id]\name$
   term\font[font_id]\bitwidth = 8
   Read term\font[font_id]\bitheight
   term\font[font_id]\width  = TRM_font_char_default_width
   term\font[font_id]\height = TRM_font_char_default_height
   term\font[font_id]\texture = CreateTexture (term\font[font_id]\width, term\font[font_id]\height, 2+256, 256)
   term\font[font_id]\image   = CreateImageEx_(term\font[font_id]\texture, term\font[font_id]\width, term\font[font_id]\height, 1+2+256)

   ; X And Y multiplication factor
   mx% = term\font[font_id]\width / term\font[font_id]\bitwidth
   my% = Ceil (term\font[font_id]\height / term\font[font_id]\bitheight)
   my_float# = term\font[font_id]\height / term\font[font_id]\bitheight

   stepsize% = (Float (term\font[font_id]\bitwidth * term\font[font_id]\bitheight) / 32)
   term\font[font_id]\bitdata = CreateBank (stepsize * 256 * 4)
   bank% = term\font[font_id]\bitdata
   For char% = 0 To 255
      For ints% = 0 To (stepsize - 1)
         Read value%
         disp% = (char * stepsize + ints) * 4
         PokeInt (bank, disp, value)
      Next
   Next
   font% = term\font[font_id]\bitdata
   font_width% = term\font[font_id]\bitwidth
   font_height% = term\font[font_id]\bitheight

;   image_bank% = CreateBank(4)
;   transit_bank% = CreateBank(8) ;new
;   StoreBankInfo(image_bank, transit_bank) ;new
;   For char% = 0 To 255
;      img% = term\font[font_id]\texture
;      ActivateTextureBuffer(img)
;      PointBankToTexturebuffer(image_bank, img)
;      datachar_disp% = stepsize * char * 4
;      For y% = 0 To (font_height - 1)
;         y_start% = Float y * my_float
;         byte% = PeekByte(font, datachar_disp + y)
;         For x% = 0 To (font_width - 1)
;            x_start% = x * mx
;            bit% = byte And (1 Shl x)
;            If bit = False Then
;               term_plot_pixel_block(x_start, y_start, mx, my, TRM_mask_false, image_bank, 64)
;            Else
;               term_plot_pixel_block(x_start, y_start, mx, my, TRM_mask_true, image_bank, 64)
;            EndIf
;         Next
;      Next
;      RestoreBankInfo(image_bank, transit_bank) ;new
;   Next
;   FreeBank image_bank ;new
;   FreeBank transit_bank ;new

   For char% = 0 To 255
      img% = term\font[font_id]\texture
      buffer% = TextureBuffer(img, char)
      LockBuffer buffer
      datachar_disp% = stepsize * char * 4
      For y% = 0 To (font_height - 1)
         y_start% = Float y * my_float
         byte% = PeekByte(font, datachar_disp + y)
         For x% = 0 To (font_width - 1)
            x_start% = x * mx
            bit% = byte And (1 Shl x)
            If bit > False Then
               term_write_pixel_block(x_start, y_start, mx, my, TRM_mask_true, buffer)
            Else
               term_write_pixel_block(x_start, y_start, mx, my, TRM_mask_false, buffer)
            EndIf
         Next
      Next
      UnlockBuffer buffer
   Next

   Return TRMRC_successful
End Function

Function term_plot_pixel_block(px%, py%, sx%, sy%, value%, buffer%, width%)
   For x% = px To (px + sx - 1)
      For y% = py To (py + sy - 1)
         PlotInBuffer(buffer, x, y, value, width)
      Next
   Next
End Function

Function term_write_pixel_block(px%, py%, sx%, sy%, value%, buffer%)
   For x% = px To (px + sx - 1)
      For y% = py To (py + sy - 1)
         WritePixelFast x, y, value, buffer
      Next
   Next
End Function