Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

27.02.2014, 21:40

vertexbuffer allozieren

Hallo,

Ich verwende directx11 windows7 c++ vs2012.

Ich wollte einen dynamischen Vertexbuffer mit Platz für 100 Vertizes kreieren. Wenn ich dann mehr als 100 Vertizes brauche, hatte ich mir gedacht ich gebe den alten dynamischen Vertexbuffer wieder frei und alloziere einen neuen dynamischen Vertexbuffer für doppelt so viele Vertizes also 200.

Wenn ich dann den neuen Vertexbuffer alloziert hatte, und dies auch funktioniert hatte, stürzte bei mir das Programm ab, sobald ich die ID3D11DeviceContext::Map() methode aufrief.

Warum ist das so und was mache ich falsch?

Da ich versucht habe den Fehler zu finden wird im folgen Code direkt nach der Neuallozierung eines Vertexbuffer dieser wieder gelösch und dann neu alloziert.


failedmessage ist ein Makro, welches den String ausgibt falls hresult0 != S_OK;

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
vertexbufferverwalter::vertexbufferverwalter( void )



void vertexbufferverwalter::update()
{

        size=100;
    this->offset = 0;
    stride = sizeof(vertexrgb);
    memory = (vertexrgb *)calloc(size,sizeof(vertexrgb));
    memoryzeiger = 0;
    this->vertexbuffer = (ID3D11Buffer **)malloc(sizeof(ID3D11Buffer*));



       D3D11_BUFFER_DESC bufferdesc;

    bufferdesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    bufferdesc.ByteWidth = (sizeof(vertexrgb))*size;
    bufferdesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    bufferdesc.MiscFlags = 0;
    bufferdesc.StructureByteStride = 0;
    bufferdesc.Usage = D3D11_USAGE_DYNAMIC;

    HRESULT hresult0;
    globalp->d3dp->contextp->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    hresult0 = globalp->d3dp->devicep->CreateBuffer(&bufferdesc,nullptr,vertexbuffer);

    failedmessage("vertexverwalter init() createBuffer");

    this->memory = (vertexrgb *)realloc(memory,sizeof(vertexrgb)*size);

    globalp->d3dp->contextp->IASetVertexBuffers(0,0,nullptr,nullptr,nullptr);
    (*(this->vertexbuffer))->Release();
    free(this->vertexbuffer);
    this->vertexbuffer = nullptr;
    this->vertexbuffer = (ID3D11Buffer **)malloc(sizeof(ID3D11Buffer*));


    size+=100;

    D3D11_BUFFER_DESC bufferdesc1;

    bufferdesc1.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    bufferdesc1.ByteWidth = (sizeof(vertexrgb))*(size);
    bufferdesc1.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    bufferdesc1.MiscFlags = 0;
    bufferdesc1.StructureByteStride = 0;
    bufferdesc1.Usage = D3D11_USAGE_DYNAMIC;

    globalp->d3dp->contextp->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    hresult0 = globalp->d3dp->devicep->CreateBuffer(&bufferdesc1,nullptr,vertexbuffer);

    failedmessage("vertexverwalter init() createBuffer");

    D3D11_MAPPED_SUBRESOURCE subresource;


    subresource.DepthPitch = 0;
    subresource.RowPitch = 0 ;

    hresult0=globalp->d3dp->contextp->Map(*vertexbuffer,0,D3D11_MAP_WRITE_DISCARD,0,&subresource);

    failedmessage("never ending failure");

    subresource.DepthPitch = 0;
    subresource.RowPitch = 0 ;
    subresource.DepthPitch = 0;
    subresource.RowPitch = 0 ;
    memcpy(subresource.pData,memory,memoryzeiger*sizeof(vertexrgb));
    globalp->d3dp->contextp->Unmap(*vertexbuffer,0);
    globalp->d3dp->contextp->IASetVertexBuffers(0,1,vertexbuffer,&stride,&offset);

    while(!(FAILED(hresult0)))
    {
        globalp->d3dp->contextp->IASetVertexBuffers(0,1,nullptr,nullptr,nullptr);
        (*(this->vertexbuffer))->Release();
        free(this->vertexbuffer);
        this->vertexbuffer = nullptr;
        this->vertexbuffer = (ID3D11Buffer **)malloc(sizeof(ID3D11Buffer*));


        size+=100;

        D3D11_BUFFER_DESC bufferdesc1;

        bufferdesc1.BindFlags = D3D11_BIND_VERTEX_BUFFER;
        bufferdesc1.ByteWidth = (sizeof(vertexrgb))*(size);
        bufferdesc1.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
        bufferdesc1.MiscFlags = 0;
        bufferdesc1.StructureByteStride = 0;
        bufferdesc1.Usage = D3D11_USAGE_DYNAMIC;


        globalp->d3dp->contextp->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
        hresult0 = globalp->d3dp->devicep->CreateBuffer(&bufferdesc1,nullptr,vertexbuffer);

        failedmessage("vertexverwalter init() createBuffer");

        hresult0=globalp->d3dp->contextp->Map(*vertexbuffer,0,D3D11_MAP_WRITE_DISCARD,0,&subresource);

        failedmessage("never ending failure");

        subresource.DepthPitch = 0;
        subresource.RowPitch = 0 ;
        subresource.DepthPitch = 0;
        subresource.RowPitch = 0 ;
        memcpy(subresource.pData,memory,memoryzeiger*sizeof(vertexrgb));
        globalp->d3dp->contextp->Unmap(*vertexbuffer,0);
        globalp->d3dp->contextp->IASetVertexBuffers(0,1,vertexbuffer,&stride,&offset);
    }
    
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

27.02.2014, 22:43

Was genau heißt "stürzt ab"? Was sagt der Debugger genau?

3

06.03.2014, 15:21

gelöst

sorry,

Die Function realloc erweitert manchnmal nicht nur den Speicher, sondern alloziert einen komplett neuen Speicherbereich. Die alten Pointer zeigten somit auf nicht validen Speicher und es wurde eine Menge überschrieben.

Danke für die Aufmerksamkeit dot .

Werbeanzeige