mirror of https://github.com/encounter/SDL.git
Don't try to create a vbo if we aren't using any vertices
This commit is contained in:
parent
b7885abc44
commit
b08e57e926
|
@ -1090,46 +1090,48 @@ D3D_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *verti
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* upload the new VBO data for this set of commands. */
|
if (vertices) {
|
||||||
vbo = data->vertexBuffers[vboidx];
|
/* upload the new VBO data for this set of commands. */
|
||||||
if (data->vertexBufferSize[vboidx] < vertsize) {
|
vbo = data->vertexBuffers[vboidx];
|
||||||
const DWORD usage = D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY;
|
if (data->vertexBufferSize[vboidx] < vertsize) {
|
||||||
const DWORD fvf = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;
|
const DWORD usage = D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY;
|
||||||
|
const DWORD fvf = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;
|
||||||
|
if (vbo) {
|
||||||
|
IDirect3DVertexBuffer9_Release(vbo);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FAILED(IDirect3DDevice9_CreateVertexBuffer(data->device, (UINT) vertsize, usage, fvf, D3DPOOL_DEFAULT, &vbo, NULL))) {
|
||||||
|
vbo = NULL;
|
||||||
|
}
|
||||||
|
data->vertexBuffers[vboidx] = vbo;
|
||||||
|
data->vertexBufferSize[vboidx] = vbo ? vertsize : 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (vbo) {
|
if (vbo) {
|
||||||
IDirect3DVertexBuffer9_Release(vbo);
|
void *ptr;
|
||||||
}
|
if (FAILED(IDirect3DVertexBuffer9_Lock(vbo, 0, (UINT) vertsize, &ptr, D3DLOCK_DISCARD))) {
|
||||||
|
|
||||||
if (FAILED(IDirect3DDevice9_CreateVertexBuffer(data->device, (UINT) vertsize, usage, fvf, D3DPOOL_DEFAULT, &vbo, NULL))) {
|
|
||||||
vbo = NULL;
|
|
||||||
}
|
|
||||||
data->vertexBuffers[vboidx] = vbo;
|
|
||||||
data->vertexBufferSize[vboidx] = vbo ? vertsize : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vbo) {
|
|
||||||
void *ptr;
|
|
||||||
if (FAILED(IDirect3DVertexBuffer9_Lock(vbo, 0, (UINT) vertsize, &ptr, D3DLOCK_DISCARD))) {
|
|
||||||
vbo = NULL; /* oh well, we'll do immediate mode drawing. :( */
|
|
||||||
} else {
|
|
||||||
SDL_memcpy(ptr, vertices, vertsize);
|
|
||||||
if (FAILED(IDirect3DVertexBuffer9_Unlock(vbo))) {
|
|
||||||
vbo = NULL; /* oh well, we'll do immediate mode drawing. :( */
|
vbo = NULL; /* oh well, we'll do immediate mode drawing. :( */
|
||||||
|
} else {
|
||||||
|
SDL_memcpy(ptr, vertices, vertsize);
|
||||||
|
if (FAILED(IDirect3DVertexBuffer9_Unlock(vbo))) {
|
||||||
|
vbo = NULL; /* oh well, we'll do immediate mode drawing. :( */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* cycle through a few VBOs so D3D has some time with the data before we replace it. */
|
/* cycle through a few VBOs so D3D has some time with the data before we replace it. */
|
||||||
if (vbo) {
|
if (vbo) {
|
||||||
data->currentVertexBuffer++;
|
data->currentVertexBuffer++;
|
||||||
if (data->currentVertexBuffer >= SDL_arraysize(data->vertexBuffers)) {
|
if (data->currentVertexBuffer >= SDL_arraysize(data->vertexBuffers)) {
|
||||||
data->currentVertexBuffer = 0;
|
data->currentVertexBuffer = 0;
|
||||||
|
}
|
||||||
|
} else if (!data->reportedVboProblem) {
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "SDL failed to get a vertex buffer for this Direct3D 9 rendering batch!");
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Dropping back to a slower method.");
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "This might be a brief hiccup, but if performance is bad, this is probably why.");
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "This error will not be logged again for this renderer.");
|
||||||
|
data->reportedVboProblem = SDL_TRUE;
|
||||||
}
|
}
|
||||||
} else if (!data->reportedVboProblem) {
|
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "SDL failed to get a vertex buffer for this Direct3D 9 rendering batch!");
|
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Dropping back to a slower method.");
|
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "This might be a brief hiccup, but if performance is bad, this is probably why.");
|
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "This error will not be logged again for this renderer.");
|
|
||||||
data->reportedVboProblem = SDL_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IDirect3DDevice9_SetStreamSource(data->device, 0, vbo, 0, sizeof (Vertex));
|
IDirect3DDevice9_SetStreamSource(data->device, 0, vbo, 0, sizeof (Vertex));
|
||||||
|
|
Loading…
Reference in New Issue