Przyspieszanie sprzętowe GDI

Przyspieszanie sprzętowe GDI
wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 678
0

a wiec wiedza jest taka na: https://learn.microsoft.com/pl-pl/windows-hardware/drivers/display/gdi-hardware-acceleration
pomoże mi ktoś to okiełznać Przyspieszanie sprzętowe GDI bo sam sobie nie radze ..na tym przykładzie

Kopiuj
HWND myconsole;
HDC mydc;
myconsole = GetConsoleWindow();
mydc = GetDC(myconsole);
//czy tutaj ma się obyć inicjacja GPU?
hBitmapDC = CreateCompatibleDC(mydc);
HBITMAP hBitmap = CreateBitmap(rx, ry, 1, 32, drawbuffor);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hBitmapDC, hBitmap);
BitBlt(mydc, 0, 0, rx, ry, hBitmapDC, 0, 0, SRCCOPY);//rysowanie z buffora 'drawbuffor'
DeleteObject(hBitmap);
DeleteObject(hOldBitmap);
tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 539
0

ChatGPT

Kopiuj
Dobre pytanie 🙂.

To, co napisałeś, nie inicjuje GPU – to jest czysty GDI (Graphics Device Interface), czyli stara część Windows API do rysowania w oknach.

Jak to działa:

GetConsoleWindow() – pobiera uchwyt okna konsoli.
GetDC(myconsole) – pobiera device context (HDC), czyli uchwyt na powierzchnię do rysowania w tym oknie.
CreateCompatibleDC() – tworzy memory device context (tzw. bufor w pamięci, czyli bitmapa w RAM-ie).
CreateBitmap() – tworzysz bitmapę w RAM-ie i przekazujesz dane (drawbuffor).
BitBlt() – kopiuje piksele z bufora (hBitmapDC) do okna (mydc).

To wszystko jest renderowaniem CPU w pamięci systemowej → a potem kopiowaniem do okna. GPU się tutaj w ogóle nie odpala (chyba że sterownik GDI pod spodem częściowo coś akceleruje, ale w praktyce to czysty software).

Odpowiadając na pytanie:

👉 Nie, tutaj nie ma inicjacji GPU.
Inicjacja GPU odbywa się, gdy używasz bibliotek takich jak:

DirectX (Direct2D, Direct3D, DXGI),
OpenGL / Vulkan,
albo wyższych wrapperów (SFML, SDL, BGFX, itp.).

Uwaga na cleanup:

Masz mały błąd w sprzątaniu:
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hBitmapDC, hBitmap);

// ...

DeleteObject(hBitmap);
DeleteObject(hOldBitmap); // ❌ to NIE JEST poprawne

hOldBitmap to poprzedni obiekt w hBitmapDC. Trzeba go odpiąć z powrotem przed usunięciem nowego:

SelectObject(hBitmapDC, hOldBitmap); // przywróć stary obiekt
DeleteObject(hBitmap);               // usuń bitmapę
DeleteDC(hBitmapDC);                 // usuń memory DC
ReleaseDC(myconsole, mydc);          // zwolnij DC okna

❓Chcesz żebym Ci pokazał, jak zainicjować prawdziwe GPU-rendering w tym samym oknie konsoli (np. OpenGL przez wglCreateContext na HWND konsoli), czy zostajesz przy czystym GDI?
wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 678
0

ja wiem, że OpenGl i Directx są wspomagane gpu, i znam funkcje wglCreateContext , zostaje przy czystym GDI, ale chyba można dodatkowo przyspieszyć działanie renderingu GDI na GPU skoro jest mowa o nim na stronie microsoftu

Usługi KMD obsługujące przyspieszanie sprzętowe GDI muszą implementować następujące funkcje:
DxgkDdiCreateAllocation
DxgkDdiGetStandardAllocationDriverData
DxgkDdiRenderKm

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 678
0
Kopiuj
void WINAPI glCopyTexSubImage2D(
   GLenum  target,
   GLint   level,
   GLint   xoffset,
   GLint   yoffset,
   GLint   x,
   GLint   y,
   GLsizei width,
   GLsizei height
);

to nie to bo nie jest podany buffor do którego ma wczytać obraz renderowany do buffora, to nie to

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 539
0

Bo wczytuje do maszyny stanów OpenGL

Kopiuj
#include <GL/glut.h>   // albo GLFW/GLAD jeśli wolisz
#include <iostream>

GLuint tex;

void init() {
    // Tworzymy pustą teksturę 256x256
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0,
                 GL_RGBA, GL_UNSIGNED_BYTE, nullptr);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glEnable(GL_TEXTURE_2D);
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT);

    // 1. Rysujemy coś (np. kolorowy trójkąt) do ekranu
    glBegin(GL_TRIANGLES);
        glColor3f(1, 0, 0); glVertex2f(-0.5f, -0.5f);
        glColor3f(0, 1, 0); glVertex2f( 0.5f, -0.5f);
        glColor3f(0, 0, 1); glVertex2f( 0.0f,  0.5f);
    glEnd();

    // 2. Kopiujemy fragment ekranu do tekstury
    glBindTexture(GL_TEXTURE_2D, tex);
    glCopyTexSubImage2D(
        GL_TEXTURE_2D,
        0,          // mipmap level
        0, 0,       // offset w teksturze
        50, 50,     // skąd w framebufferze (x,y)
        128, 128    // szer., wys.
    );

    // 3. Rysujemy kwadrat z tą teksturą
    glColor3f(1,1,1);
    glBegin(GL_QUADS);
        glTexCoord2f(0,0); glVertex2f(-0.9f, -0.9f);
        glTexCoord2f(1,0); glVertex2f(-0.2f, -0.9f);
        glTexCoord2f(1,1); glVertex2f(-0.2f, -0.2f);
        glTexCoord2f(0,1); glVertex2f(-0.9f, -0.2f);
    glEnd();

    glutSwapBuffers();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(800, 600);
    glutCreateWindow("glCopyTexSubImage2D example");

    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}
wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 678
0

zapisze sobie tan post na później, dzięki za pomoc, powinno działać

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
2

pomoże mi ktoś to okiełznać Przyspieszanie sprzętowe GDI bo sam sobie nie radze

Ale tu nie ma właściwie nic do radzenia sobie. Jeśli GDI może być przyspieszane sprzętowo (czyli dana wersja Windowsa i sterowniki karty graficznej to obsługują) to jest przyspieszane sprzętowo. Nie trzeba nic specjalnie inicjalizować.
A jeśli nie jest, to nie jest. Windows Vista nie miał akceleracji GDI, ale potem do niej wrócili.

https://learn.microsoft.com/pl-pl/windows-hardware/drivers/display/gdi-hardware-acceleration

Ten link jest dla piszących sterowniki grafiki. Jeśli nie piszesz sterownika, w którym chcesz zaimplementować akcelerację GDI, to nie ma tam nic ciekawego.

ale chyba można dodatkowo przyspieszyć działanie renderingu GDI na GPU skoro jest mowa o nim na stronie microsoftu

Cały czas masz to przyspieszanie aktywne i działa np. podczas takiego BitBlt.

Marius.Maximus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2196
1

@wilkwielki: filozoficzne pytanie: po co grzebiesz w takich historycznych technologiach ?

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 678
0

chciałem zrobić grafikę w konsoli i tak to się zaczęło, a GDI pasuje pod konsole, to tyle ...

Marius.Maximus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2196
0

"chciałem zrobić grafikę w konsoli" i znowu walczysz z wiatrakami wszak konsola nie jest do rysowania

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 678
0

tworzenie własnego renderingu daje wielką przyjemność a na konsoli można to zrobić szkoląc się jeszcze więcej ...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.