diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index e231c3538..e46bf8ef7 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -15,6 +15,7 @@ along with this program. If not, see . ******************************************************************************/ +#include #include #include #include @@ -1439,24 +1440,28 @@ void gs_device::LoadVertexBufferData() curVertexShader == lastVertexShader) return; - vector buffers; - vector strides; - vector offsets; + ID3D11Buffer *buffers[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; + uint32_t strides[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; + uint32_t offsets[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; + UINT numBuffers{}; + + assert(curVertexShader->NumBuffersExpected() <= _countof(buffers)); + assert(curVertexShader->NumBuffersExpected() <= _countof(strides)); + assert(curVertexShader->NumBuffersExpected() <= _countof(offsets)); if (curVertexBuffer && curVertexShader) { - curVertexBuffer->MakeBufferList(curVertexShader, buffers, - strides); + numBuffers = curVertexBuffer->MakeBufferList(curVertexShader, + buffers, strides); } else { - size_t buffersToClear = - curVertexShader ? curVertexShader->NumBuffersExpected() - : 0; - buffers.resize(buffersToClear); - strides.resize(buffersToClear); + numBuffers = curVertexShader + ? curVertexShader->NumBuffersExpected() + : 0; + std::fill_n(buffers, numBuffers, nullptr); + std::fill_n(strides, numBuffers, 0); } - offsets.resize(buffers.size()); - context->IASetVertexBuffers(0, (UINT)buffers.size(), buffers.data(), - strides.data(), offsets.data()); + std::fill_n(offsets, numBuffers, 0); + context->IASetVertexBuffers(0, numBuffers, buffers, strides, offsets); lastVertexBuffer = curVertexBuffer; lastVertexShader = curVertexShader; diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 86f42fe06..75e71658e 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -364,9 +364,8 @@ struct gs_vertex_buffer : gs_obj { void FlushBuffer(ID3D11Buffer *buffer, void *array, size_t elementSize); - void MakeBufferList(gs_vertex_shader *shader, - vector &buffers, - vector &strides); + UINT MakeBufferList(gs_vertex_shader *shader, ID3D11Buffer **buffers, + uint32_t *strides); void InitBuffer(const size_t elementSize, const size_t numVerts, void *array, ID3D11Buffer **buffer); diff --git a/libobs-d3d11/d3d11-vertexbuffer.cpp b/libobs-d3d11/d3d11-vertexbuffer.cpp index 70a68a9d3..c37769acd 100644 --- a/libobs-d3d11/d3d11-vertexbuffer.cpp +++ b/libobs-d3d11/d3d11-vertexbuffer.cpp @@ -19,13 +19,15 @@ #include #include "d3d11-subsystem.hpp" -static inline void PushBuffer(vector &buffers, - vector &strides, ID3D11Buffer *buffer, +static inline void PushBuffer(UINT *refNumBuffers, ID3D11Buffer **buffers, + uint32_t *strides, ID3D11Buffer *buffer, size_t elementSize, const char *name) { + const UINT numBuffers = *refNumBuffers; if (buffer) { - buffers.push_back(buffer); - strides.push_back((uint32_t)elementSize); + buffers[numBuffers] = buffer; + strides[numBuffers] = (uint32_t)elementSize; + *refNumBuffers = numBuffers + 1; } else { blog(LOG_ERROR, "This vertex shader requires a %s buffer", name); @@ -46,25 +48,27 @@ void gs_vertex_buffer::FlushBuffer(ID3D11Buffer *buffer, void *array, device->context->Unmap(buffer, 0); } -void gs_vertex_buffer::MakeBufferList(gs_vertex_shader *shader, - vector &buffers, - vector &strides) +UINT gs_vertex_buffer::MakeBufferList(gs_vertex_shader *shader, + ID3D11Buffer **buffers, uint32_t *strides) { - PushBuffer(buffers, strides, vertexBuffer, sizeof(vec3), "point"); + UINT numBuffers = 0; + PushBuffer(&numBuffers, buffers, strides, vertexBuffer, sizeof(vec3), + "point"); if (shader->hasNormals) - PushBuffer(buffers, strides, normalBuffer, sizeof(vec3), - "normal"); + PushBuffer(&numBuffers, buffers, strides, normalBuffer, + sizeof(vec3), "normal"); if (shader->hasColors) - PushBuffer(buffers, strides, colorBuffer, sizeof(uint32_t), - "color"); + PushBuffer(&numBuffers, buffers, strides, colorBuffer, + sizeof(uint32_t), "color"); if (shader->hasTangents) - PushBuffer(buffers, strides, tangentBuffer, sizeof(vec3), - "tangent"); + PushBuffer(&numBuffers, buffers, strides, tangentBuffer, + sizeof(vec3), "tangent"); if (shader->nTexUnits <= uvBuffers.size()) { for (size_t i = 0; i < shader->nTexUnits; i++) { - buffers.push_back(uvBuffers[i]); - strides.push_back((uint32_t)uvSizes[i]); + buffers[numBuffers] = uvBuffers[i]; + strides[numBuffers] = (uint32_t)uvSizes[i]; + ++numBuffers; } } else { blog(LOG_ERROR, @@ -72,6 +76,8 @@ void gs_vertex_buffer::MakeBufferList(gs_vertex_shader *shader, "texture buffers.", (uint32_t)shader->nTexUnits); } + + return numBuffers; } void gs_vertex_buffer::InitBuffer(const size_t elementSize,