Page 2 of 3 FirstFirst 1 2 3 LastLast
Results 16 to 30 of 34

Thread: CreateDIBSection naar eigen memory laten wijzen

  1. #16
    Senior Member EricLang's Avatar
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,377
    Ik dacht het te hebben maar ik krijg een windows last error:

    Code:
    ERROR_MAPPED_ALIGNMENT = 1132;
    Dat betekent (denk ik) dat MyPointer niet op een bepaalde afronding van een adres begint.
    What on earth kan ik hieraan doen? Ik heb zelfs de memorymanager al op 16bit gezet, maar dat moet misschien 64 bit zijn?
    Hoe kan ik er voor zorgen dat die pointer "goed" staat?
    Internet leverde me geen oplossing.

    Code:
    var
      pBuf: Pointer;
    begin
      // hMapFile = CreateFileMapping();
      pBuf := MapViewOfFileEx(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0, MyPointer)
    end;

  2. #17
    die MyPointer moet een bepaalde waarde hebben:

    "This must be a multiple of the system's memory allocation granularity, or the function fails. To determine the memory allocation granularity of the system, use the GetSystemInfo function." https://docs.microsoft.com/en-us/win...apviewoffileex

  3. #18
    Senior Member EricLang's Avatar
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,377
    jah... dat is mijn vraag :-)

  4. #19
    wat is de waarde van mypointer dan? En is die waarde dan een veelvoud van (waarschijnlijk) 64K ?

  5. #20
    Senior Member EricLang's Avatar
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,377
    mypointer is een stuk (door mijn applicatie gereserveerd) geheugen met 32 bits pixels.

  6. #21
    daar gaat het niet om, die pointer mag alleen naar een stuk geheugen wijzen waarvan het adres een waarde heeft die een veelvoud is van (the memory allocation granularity) 64K, als die pointer niet naar zo'n adres wijst dan krijg je die foutmelding.

  7. #22
    Senior Member EricLang's Avatar
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,377
    64K ik zag het. wow ok. dat maakt deze functie speciaal :-)
    dus het pointer adres mod 65536 = 0.
    Dat is volgens mij niet te doen.

  8. #23
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,207
    Normaal is de memory granulariteit de zg pagesize, iow 4k op 32-bit en 8k op 64-bit. Dit is de grootte waar het protected mode deel van de CPU standaard mee werkt.

    BMPs hebben ook zelf een 4 bytes breedte eis. Dit is met name met kleinere pixelsizes (1,2bpp) van belang, want je moet alignment bytes toevoegen als je de pixel data zerocopy in een write naar disk wil kachelen (*)

    Ook b.v. OpenGL (en ik neem aan DirectX, Metal en Vulkan ook) hebben alignment eisen. Soms zijn die absoluut (het moet), en soms niet (niet doen zorgt ervoor dat OpenGL kopieert indien nodig, maar dat is dus wel trager dan gealignde data aanleveren)

    Om een aligned blok te alloceren gebruik ik:

    Delphi Code:
    1. function allocatealigned(nrbytes,nralign:integer;var pold:pbyte):pbyte;
    2. // allocate voldoende extra bytes om te alloceren.
    3. // nralign moet een macht van 2 zijn! pold is de ongealignde pointer, die nodig is om te freeen.
    4. var n:ptruint;
    5. begin
    6.   getmem(pold,ptruint(nrbytes)+ptruint(nralign));
    7.   n:=(ptruint(nralign)-(ptruint(pold) and (ptruint(nralign)-1))) and (ptruint(nralign)-1);   // second "AND" is to transform 1..nralign to 0..nralign-1
    8.   result:=@pold[n];
    9. end;

    (*) wel dan komt ook nog topdown/bottomup ter sprake.
    Last edited by marcov; 23-Oct-20 at 14:16.

  9. #24
    Senior Member EricLang's Avatar
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,377
    Thanks! Handige routine.
    Maar nu krijg ik error 487: ongeldig adres. de pointer (result van allocatealigned) alignment is op 65536 dus krijg niet meer de 1032 error.

  10. #25
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,207
    Laat wat meer van het gebruik zien. Die routine gebruik ik al een kleine 10 jaar, dus die zou ok moeten zijn

  11. #26
    Senior Member EricLang's Avatar
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,377
    De functie heb ik ptruint uint van gemaakt. Adres(a) deugt. freemem gaat ook goed. Als de functie slaagt wil ik daarna CreateDIBSection(....., hSection=hMapfile) aanroepen en dan hopen dat deze GEEN memory alloceert.

    Code:
    procedure Test;
    
        function allocatealigned(nrbytes,nralign:integer;var pold:pbyte):pbyte;
        var n:uint;
        begin
          getmem(pold,uint(nrbytes)+uint(nralign));
          n:=(uint(nralign)-(uint(pold) and (uint(nralign)-1))) and (uint(nralign)-1);   // second "AND" is to transform 1..nralign to 0..nralign-1
          result:=@pold[n];
        end;
    
    const
      k4=4096;
      k8=8192;
      gran=65536; // deze gebruik ik
    var
      hMapFile: THandle;
      pBuf: pointer;
      a,b: PByte;
    begin
      a := allocatealigned(20, gran, b);
      log(NativeInt(a) mod gran);
    
      hMapFile := CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,20,nil);
     pBuf := MapViewOfFileEx(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 20, a);
    
      log('last error ', GetLastError.ToString);
      if pBuf = nil then
        log('buf = nil')
      else
        log('buf = OK!');
    end;

  12. #27
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,207
    Dat is fout op 64-bit. Het moet een integer type zijn dat met pointer grootte schaalt. uintptr of Nativeuint of zo iets.
    Deze code dateert uit 64-bit code voordat Delphi dat ondersteunde, gebruikt de FPC equivalenten ptrint/uint.

    Probeer de grootte van de mapping ook eens een pagesize te maken. Helpt dat?

  13. #28
    Senior Member EricLang's Avatar
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,377
    yep ik weet dat ik een nativeint moet gebruiken.
    getlasterror geeft nu 5 (ERROR_ACCESS_DENIED), wanneer ik 65536 bytes alloceer ipv 20.

  14. #29
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,207
    gaat createfilemapping wel goed? Ik ken mmap functionaliteit onder windows niet zo goed.

  15. #30
    Senior Member EricLang's Avatar
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,377
    Yep die gaat goed. Jammer dat het zo ingewikkeld moet met die filemapping. Er is helaas ook geen alternatief voor CreateDIBSection. Heel internet al afgestroopt.

Page 2 of 3 FirstFirst 1 2 3 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •