diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 44765d0cb..041fc9d99 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -224,10 +224,12 @@ struct gs_vertex_buffer { vector &buffers, vector &strides); - inline void InitBuffer(const size_t elementSize, + void InitBuffer(const size_t elementSize, const size_t numVerts, void *array, ID3D11Buffer **buffer); + void BuildBuffers(); + gs_vertex_buffer(gs_device_t *device, struct gs_vb_data *data, uint32_t flags); }; diff --git a/libobs-d3d11/d3d11-vertexbuffer.cpp b/libobs-d3d11/d3d11-vertexbuffer.cpp index 4d15a88e0..dfdcac683 100644 --- a/libobs-d3d11/d3d11-vertexbuffer.cpp +++ b/libobs-d3d11/d3d11-vertexbuffer.cpp @@ -72,7 +72,7 @@ void gs_vertex_buffer::MakeBufferList(gs_vertex_shader *shader, } } -inline void gs_vertex_buffer::InitBuffer(const size_t elementSize, +void gs_vertex_buffer::InitBuffer(const size_t elementSize, const size_t numVerts, void *array, ID3D11Buffer **buffer) { D3D11_BUFFER_DESC bd; @@ -93,6 +93,40 @@ inline void gs_vertex_buffer::InitBuffer(const size_t elementSize, throw HRError("Failed to create buffer", hr); } +void gs_vertex_buffer::BuildBuffers() +{ + InitBuffer(sizeof(vec3), vbd.data->num, vbd.data->points, + &vertexBuffer); + + if (vbd.data->normals) + InitBuffer(sizeof(vec3), vbd.data->num, vbd.data->normals, + &normalBuffer); + + if (vbd.data->tangents) + InitBuffer(sizeof(vec3), vbd.data->num, vbd.data->tangents, + &tangentBuffer); + + if (vbd.data->colors) + InitBuffer(sizeof(uint32_t), vbd.data->num, vbd.data->colors, + &colorBuffer); + + for (size_t i = 0; i < vbd.data->num_tex; i++) { + struct gs_tvertarray *tverts = vbd.data->tvarray+i; + + if (tverts->width != 2 && tverts->width != 4) + throw "Invalid texture vertex size specified"; + if (!tverts->array) + throw "No texture vertices specified"; + + ComPtr buffer; + InitBuffer(tverts->width * sizeof(float), vbd.data->num, + tverts->array, &buffer); + + uvBuffers.push_back(buffer); + uvSizes.push_back(tverts->width * sizeof(float)); + } +} + gs_vertex_buffer::gs_vertex_buffer(gs_device_t *device, struct gs_vb_data *data, uint32_t flags) : device (device), @@ -105,37 +139,5 @@ gs_vertex_buffer::gs_vertex_buffer(gs_device_t *device, struct gs_vb_data *data, if (!data->points) throw "No points specified for vertex buffer"; - InitBuffer(sizeof(vec3), data->num, data->points, - vertexBuffer.Assign()); - - if (data->normals) - InitBuffer(sizeof(vec3), data->num, data->normals, - normalBuffer.Assign()); - - if (data->tangents) - InitBuffer(sizeof(vec3), data->num, data->tangents, - tangentBuffer.Assign()); - - if (data->colors) - InitBuffer(sizeof(uint32_t), data->num, data->colors, - colorBuffer.Assign()); - - for (size_t i = 0; i < data->num_tex; i++) { - struct gs_tvertarray *tverts = data->tvarray+i; - - if (tverts->width != 2 && tverts->width != 4) - throw "Invalid texture vertex size specified"; - if (!tverts->array) - throw "No texture vertices specified"; - - ComPtr buffer; - InitBuffer(tverts->width * sizeof(float), data->num, - tverts->array, buffer.Assign()); - - uvBuffers.push_back(buffer); - uvSizes.push_back(tverts->width * sizeof(float)); - } - - if (!dynamic) - vbd.Clear(); + BuildBuffers(); }