Blender V4.3
eval_output_gpu.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Foundation
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later
4 *
5 * Author: Sergey Sharybin. */
6
8
10
11using OpenSubdiv::Osd::PatchArray;
12using OpenSubdiv::Osd::PatchArrayVector;
13
14namespace blender::opensubdiv {
15
16static void buildPatchArraysBufferFromVector(const PatchArrayVector &patch_arrays,
17 OpenSubdiv_Buffer *patch_arrays_buffer)
18{
19 const size_t patch_array_size = sizeof(PatchArray);
20 const size_t patch_array_byte_site = patch_array_size * patch_arrays.size();
21 patch_arrays_buffer->device_alloc(patch_arrays_buffer, patch_arrays.size());
22 patch_arrays_buffer->bind_gpu(patch_arrays_buffer);
23 patch_arrays_buffer->device_update(
24 patch_arrays_buffer, 0, patch_array_byte_site, &patch_arrays[0]);
25}
26
27GpuEvalOutput::GpuEvalOutput(const StencilTable *vertex_stencils,
28 const StencilTable *varying_stencils,
29 const std::vector<const StencilTable *> &all_face_varying_stencils,
30 const int face_varying_width,
31 const PatchTable *patch_table,
33 : VolatileEvalOutput<GLVertexBuffer,
34 GLVertexBuffer,
36 GLPatchTable,
37 GLComputeEvaluator>(vertex_stencils,
38 varying_stencils,
39 all_face_varying_stencils,
40 face_varying_width,
41 patch_table,
42 evaluator_cache)
43{
44}
45
47{
48 GLPatchTable *patch_table = getPatchTable();
49 buildPatchArraysBufferFromVector(patch_table->GetPatchArrays(), patch_arrays_buffer);
50}
51
53{
54 GLPatchTable *patch_table = getPatchTable();
55 patch_index_buffer->wrap_device_handle(patch_index_buffer, patch_table->GetPatchIndexBuffer());
56}
57
59{
60 GLPatchTable *patch_table = getPatchTable();
61 patch_param_buffer->wrap_device_handle(patch_param_buffer, patch_table->GetPatchParamBuffer());
62}
63
65{
66 GLVertexBuffer *vertex_buffer = getSrcBuffer();
67 src_buffer->wrap_device_handle(src_buffer, vertex_buffer->BindVBO());
68}
69
71{
72 GLVertexBuffer *vertex_buffer = getSrcVertexDataBuffer();
73 src_buffer->wrap_device_handle(src_buffer, vertex_buffer->BindVBO());
74}
75
76void GpuEvalOutput::fillFVarPatchArraysBuffer(const int face_varying_channel,
77 OpenSubdiv_Buffer *patch_arrays_buffer)
78{
79 GLPatchTable *patch_table = getFVarPatchTable(face_varying_channel);
80 buildPatchArraysBufferFromVector(patch_table->GetFVarPatchArrays(face_varying_channel),
81 patch_arrays_buffer);
82}
83
84void GpuEvalOutput::wrapFVarPatchIndexBuffer(const int face_varying_channel,
85 OpenSubdiv_Buffer *patch_index_buffer)
86{
87 GLPatchTable *patch_table = getFVarPatchTable(face_varying_channel);
88 patch_index_buffer->wrap_device_handle(
89 patch_index_buffer, patch_table->GetFVarPatchIndexBuffer(face_varying_channel));
90}
91
92void GpuEvalOutput::wrapFVarPatchParamBuffer(const int face_varying_channel,
93 OpenSubdiv_Buffer *patch_param_buffer)
94{
95 GLPatchTable *patch_table = getFVarPatchTable(face_varying_channel);
96 patch_param_buffer->wrap_device_handle(
97 patch_param_buffer, patch_table->GetFVarPatchParamBuffer(face_varying_channel));
98}
99
100void GpuEvalOutput::wrapFVarSrcBuffer(const int face_varying_channel,
101 OpenSubdiv_Buffer *src_buffer)
102{
103 GLVertexBuffer *vertex_buffer = getFVarSrcBuffer(face_varying_channel);
104 src_buffer->buffer_offset = getFVarSrcBufferOffset(face_varying_channel);
105 src_buffer->wrap_device_handle(src_buffer, vertex_buffer->BindVBO());
106}
107
108} // namespace blender::opensubdiv
GL stencil table (Shader Storage buffer)
void fillFVarPatchArraysBuffer(const int face_varying_channel, OpenSubdiv_Buffer *patch_arrays_buffer) override
void wrapPatchIndexBuffer(OpenSubdiv_Buffer *patch_index_buffer) override
void wrapSrcBuffer(OpenSubdiv_Buffer *src_buffer) override
void fillPatchArraysBuffer(OpenSubdiv_Buffer *patch_arrays_buffer) override
void wrapPatchParamBuffer(OpenSubdiv_Buffer *patch_param_buffer) override
void wrapFVarPatchIndexBuffer(const int face_varying_channel, OpenSubdiv_Buffer *patch_index_buffer) override
GpuEvalOutput(const StencilTable *vertex_stencils, const StencilTable *varying_stencils, const std::vector< const StencilTable * > &all_face_varying_stencils, const int face_varying_width, const PatchTable *patch_table, EvaluatorCache *evaluator_cache=NULL)
void wrapFVarPatchParamBuffer(const int face_varying_channel, OpenSubdiv_Buffer *patch_param_buffer) override
void wrapFVarSrcBuffer(const int face_varying_channel, OpenSubdiv_Buffer *src_buffer) override
void wrapSrcVertexDataBuffer(OpenSubdiv_Buffer *src_buffer) override
OpenSubdiv::Osd::EvaluatorCacheT< EVALUATOR > EvaluatorCache
static void buildPatchArraysBufferFromVector(const PatchArrayVector &patch_arrays, OpenSubdiv_Buffer *patch_arrays_buffer)
void(* device_update)(const OpenSubdiv_Buffer *buffer, unsigned int start, unsigned int len, const void *data)
void(* bind_gpu)(const OpenSubdiv_Buffer *buffer)
void(* wrap_device_handle)(const OpenSubdiv_Buffer *buffer, uint64_t device_ptr)
void(* device_alloc)(const OpenSubdiv_Buffer *buffer, const unsigned int size)