Skip to content

Commit 4e06838

Browse files
wip: context builder
1 parent 2688f0a commit 4e06838

File tree

3 files changed

+118
-39
lines changed

3 files changed

+118
-39
lines changed

components/vulkan/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ vkb__register_component(
2222
INCLUDE_DIRS
2323
${CMAKE_CURRENT_SOURCE_DIR}/include
2424
SRC
25-
src/instance_builder.cpp
26-
src/context_builder_funcs.cpp
25+
# src/instance_builder.cpp
26+
# src/context_builder_funcs.cpp
2727
)
2828

2929
vkb__register_tests(

components/vulkan/include/components/vulkan/context/context_builder.hpp

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -80,29 +80,21 @@ class InstanceBuilder final
8080
return *this;
8181
}
8282

83-
inline Self &optional_extension(std::string_view layer_name, std::string_view extension_name, EnabledCallback callback = nullptr)
84-
{
85-
_optional_extensions.push_back(extension);
86-
return *this;
87-
}
83+
/**
84+
* @brief A function used to indicate if a feature was enabled or disabled
85+
*
86+
*/
87+
using Callback = std::function<void(bool)>;
8888

89-
inline Self &required_extension(std::string_view layer_name, std::string_view extension_name, EnabledCallback callback = nullptr)
90-
{
91-
_required_extensions.push_back(extension);
92-
return *this;
93-
}
89+
Self &optional_extension(std::string_view extension_name, Callback callback = nullptr);
90+
Self &optional_extension(std::string_view layer_name, std::string_view extension_name, Callback callback = nullptr);
9491

95-
inline Self &optional_layer(std::string_view layer, EnabledCallback callback = nullptr)
96-
{
97-
_optional_layers.push_back(layer);
98-
return *this;
99-
}
92+
Self &required_extension(std::string_view extension_name, Callback callback = nullptr);
93+
Self &required_extension(std::string_view layer_name, std::string_view extension_name, Callback callback = nullptr);
10094

101-
inline Self &required_layer(std::string_view layer, EnabledCallback callback = nullptr)
102-
{
103-
_required_layers.push_back({layer, callback});
104-
return *this;
105-
}
95+
Self &optional_layer(std::string_view layer, Callback callback = nullptr);
96+
97+
Self &required_layer(std::string_view layer, Callback callback = nullptr);
10698

10799
template <typename Type>
108100
using ExtensionFunc = std::function<void(Type &extension)>;
@@ -117,6 +109,14 @@ class InstanceBuilder final
117109
private:
118110
VkInstance Build();
119111

112+
std::vector<std::string_view> _available_layers;
113+
114+
bool layer_available(std::string_view name);
115+
116+
std::unordered_map<std::string_view, std::vector<std::string_view>> _available_extension_layers;
117+
118+
bool extension_available(std::string_view layer, std::string_view name);
119+
120120
VkApplicationInfo _application_info;
121121
std::vector<std::string_view> _optional_extensions;
122122
std::vector<std::string_view> _required_extensions;

components/vulkan/src/instance_builder.cpp

Lines changed: 96 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,102 @@ InstanceBuilder &InstanceBuilder::enable_validation_layers(const std::vector<std
130130
return *this;
131131
}
132132

133+
InstanceBuilder::InstanceBuilder()
134+
{
135+
std::vector<std::string_view> emabled_layers;
136+
uint32_t instance_layer_count;
137+
VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, nullptr));
138+
std::vector<VkLayerProperties> supported_validation_layers(instance_layer_count);
139+
VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, supported_validation_layers.data()));
140+
}
141+
142+
InstanceBuilder &InstanceBuilder::optional_extension(std::string_view extension_name, Callback callback)
143+
{
144+
if (extension_available("", extension_name))
145+
{
146+
_optional_extensions.push_back(extension_name);
147+
callback(true);
148+
}
149+
else
150+
{
151+
callback(false);
152+
}
153+
154+
return *this;
155+
}
156+
157+
InstanceBuilder &InstanceBuilder::optional_extension(std::string_view layer_name, std::string_view extension_name, Callback callback)
158+
{
159+
if (extension_available(layer_name, extension_name))
160+
{
161+
_optional_extensions.push_back(extension_name);
162+
callback(true);
163+
}
164+
else
165+
{
166+
callback(false);
167+
}
168+
169+
return *this;
170+
}
171+
172+
InstanceBuilder &InstanceBuilder::required_extension(std::string_view extension_name)
173+
{
174+
if (extension_available("", extension_name))
175+
{
176+
_required_extensions.push_back(extension_name);
177+
}
178+
else
179+
{
180+
throw "required extension is not available"; // TODO: replace this with better error handling
181+
}
182+
183+
return *this;
184+
}
185+
186+
InstanceBuilder &InstanceBuilder::required_extension(std::string_view layer_name, std::string_view extension_name)
187+
{
188+
if (extension_available(layer_name, extension_name))
189+
{
190+
_required_extensions.push_back(extension_name);
191+
}
192+
else
193+
{
194+
throw "required extension is not available"; // TODO: replace this with better error handling
195+
}
196+
197+
return *this;
198+
}
199+
200+
InstanceBuilder &InstanceBuilder::optional_layer(std::string_view layer, Callback callback)
201+
{
202+
if (layer_available(layer))
203+
{
204+
_optional_layers.push_back(layer);
205+
callback(true);
206+
}
207+
else
208+
{
209+
callback(false);
210+
}
211+
212+
return *this;
213+
}
214+
215+
InstanceBuilder &InstanceBuilder::required_layer(std::string_view layer)
216+
{
217+
if (layer_available(layer))
218+
{
219+
_required_layers.push_back(layer);
220+
}
221+
else
222+
{
223+
throw "required layer is not available"; // TODO: replace this with better error handling
224+
}
225+
226+
return *this;
227+
}
228+
133229
std::vector<std::string_view> InstanceBuilder::collect_enabled_extensions(VkInstanceCreateInfo &info) const
134230
{
135231
std::vector<std::string_view> enabled_extensions;
@@ -205,23 +301,6 @@ std::vector<std::string_view> InstanceBuilder::collect_enabled_extensions(VkInst
205301
return enabled_extensions;
206302
}
207303

208-
std::vector<std::string_view> InstanceBuilder::collect_enabled_layers(VkInstanceCreateInfo &info) const
209-
{
210-
std::vector<std::string_view> emabled_layers;
211-
212-
uint32_t instance_layer_count;
213-
VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, nullptr));
214-
215-
std::vector<VkLayerProperties> supported_validation_layers(instance_layer_count);
216-
VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, supported_validation_layers.data()));
217-
218-
std::vector<const char *> requested_validation_layers(required_validation_layers);
219-
220-
// TODO: process layers
221-
222-
return enabled_layers;
223-
}
224-
225304
InstanceBuilder::Instance InstanceBuilder::Build()
226305
{
227306
VkInstanceCreateInfo instance_info = {VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO};

0 commit comments

Comments
 (0)