aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Weissflog <floooh@gmail.com>2026-01-19 14:34:52 +0100
committerAndre Weissflog <floooh@gmail.com>2026-01-19 14:34:52 +0100
commita84dd54fb403d5fdbc395af6318a6a9425af0414 (patch)
tree9d11e1cbb06547d5e8be19cb7bf9031a06c86f4e
parent486d19da7c0e4fd20274ac5ec4e2f0fee358830c (diff)
sokol_gfx.h vk: windows support
-rw-r--r--sokol_app.h14
-rw-r--r--sokol_gfx.h36
2 files changed, 30 insertions, 20 deletions
diff --git a/sokol_app.h b/sokol_app.h
index 99f25d11..c1411f15 100644
--- a/sokol_app.h
+++ b/sokol_app.h
@@ -2307,8 +2307,12 @@ inline void sapp_run(const sapp_desc& desc) { return sapp_run(&desc); }
#elif defined(_WIN32)
// Windows (D3D11 or GL)
#define _SAPP_WIN32 (1)
- #if !defined(SOKOL_D3D11) && !defined(SOKOL_GLCORE) && !defined(SOKOL_WGPU) && !defined(SOKOL_NOAPI)
- #error("sokol_app.h: unknown 3D API selected for Win32, must be SOKOL_D3D11, SOKOL_GLCORE, SOKOL_WGPU or SOKOL_NOAPI")
+ #if !defined(SOKOL_D3D11) && !defined(SOKOL_GLCORE) && !defined(SOKOL_WGPU) && !defined(SOKOL_VULKAN) && !defined(SOKOL_NOAPI)
+ #error("sokol_app.h: unknown 3D API selected for Win32, must be SOKOL_D3D11, SOKOL_GLCORE, SOKOL_WGPU, SOKOL_VULKAN or SOKOL_NOAPI")
+ #endif
+ #if defined(SOKOL_VULKAN)
+ #define VK_USE_PLATFORM_WIN32_KHR
+ #include <vulkan/vulkan.h>
#endif
#elif defined(__ANDROID__)
// Android
@@ -4517,6 +4521,12 @@ _SOKOL_PRIVATE void _sapp_vk_create_surface(void) {
xlib_info.dpy = _sapp.x11.display;
xlib_info.window = _sapp.x11.window;
res = vkCreateXlibSurfaceKHR(_sapp.vk.instance, &xlib_info, 0, &_sapp.vk.surface);
+ #elif defined(_SAPP_WIN32)
+ _SAPP_STRUCT(VkWin32SurfaceCreateInfoKHR, win32_info);
+ win32_info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
+ win32_info.hinstance = GetModuleHandleW(NULL);
+ win32_info.hwnd = _sapp.win32.hwnd;
+ res = vkCreateWin32SurfaceKHR(_sapp.vk.instance, &win32_info, 0, &_sapp.vk.surface);
#else
#error "sokol_app.h: unsupported Vulkan platform"
#endif
diff --git a/sokol_gfx.h b/sokol_gfx.h
index 524de711..8ab90e9e 100644
--- a/sokol_gfx.h
+++ b/sokol_gfx.h
@@ -19126,7 +19126,7 @@ _SOKOL_PRIVATE VkDeviceMemory _sg_vk_mem_alloc_device_memory(_sg_vk_memtype_t me
VkDeviceMemory vk_dev_mem = 0;
VkResult res = vkAllocateMemory(_sg.vk.dev, &alloc_info, 0, &vk_dev_mem);
_sg_stats_inc(vk.num_allocate_memory);
- _sg_stats_add(vk.size_allocate_memory, mem_reqs->size);
+ _sg_stats_add(vk.size_allocate_memory, (uint32_t)mem_reqs->size);
if (res != VK_SUCCESS) {
_SG_ERROR(VULKAN_ALLOCATE_MEMORY_FAILED);
return 0;
@@ -19536,7 +19536,7 @@ _SOKOL_PRIVATE void _sg_vk_staging_copy_buffer_data(_sg_buffer_t* buf, const sg_
bytes_remaining = 0;
}
region.size = bytes_to_copy;
- _sg_vk_staging_map_memcpy_unmap(dst_mem, src_ptr, bytes_to_copy);
+ _sg_vk_staging_map_memcpy_unmap(dst_mem, src_ptr, (uint32_t)bytes_to_copy);
VkCommandBuffer cmd_buf = _sg_vk_staging_copy_begin();
vkCmdCopyBuffer(cmd_buf, src_buf, dst_buf, 1, &region);
_sg_stats_inc(vk.num_cmd_copy_buffer);
@@ -19665,7 +19665,7 @@ _SOKOL_PRIVATE void _sg_vk_staging_stream_buffer_data(_sg_buffer_t* buf, const s
SOKOL_ASSERT(src_data && src_data->ptr && (src_data->size > 0));
SOKOL_ASSERT((src_data->size + dst_offset) <= (size_t)buf->cmn.size);
- const uint32_t src_offset = _sg_vk_shared_buffer_memcpy(&_sg.vk.stage.stream, src_data->ptr, src_data->size);
+ const uint32_t src_offset = (uint32_t)_sg_vk_shared_buffer_memcpy(&_sg.vk.stage.stream, src_data->ptr, (uint32_t)src_data->size);
if (src_offset == _SG_VK_SHARED_BUFFER_OVERFLOW_RESULT) {
_SG_ERROR(VULKAN_STAGING_STREAM_BUFFER_OVERFLOW);
return;
@@ -19700,7 +19700,7 @@ _SOKOL_PRIVATE void _sg_vk_staging_stream_image_data(_sg_image_t* img, const sg_
const sg_range* src_mip = &src_data->mip_levels[mip_index];
SOKOL_ASSERT(src_mip->ptr);
SOKOL_ASSERT(src_mip->size > 0);
- const uint32_t src_offset = _sg_vk_shared_buffer_memcpy(&_sg.vk.stage.stream, src_mip->ptr, src_mip->size);
+ const uint32_t src_offset = (uint32_t)_sg_vk_shared_buffer_memcpy(&_sg.vk.stage.stream, src_mip->ptr, (uint32_t)src_mip->size);
if (src_offset == _SG_VK_SHARED_BUFFER_OVERFLOW_RESULT) {
_SG_ERROR(VULKAN_STAGING_STREAM_BUFFER_OVERFLOW);
_sg_vk_image_barrier(cmd_buf, img, _SG_VK_ACCESS_TEXTURE);
@@ -19731,7 +19731,7 @@ _SOKOL_PRIVATE void _sg_vk_uniform_init(void) {
SOKOL_ASSERT(_sg.desc.uniform_buffer_size > 0);
_sg_vk_shared_buffer_init(&_sg.vk.uniform,
(uint32_t)_sg.desc.uniform_buffer_size,
- _sg.vk.dev_props.properties.limits.minUniformBufferOffsetAlignment,
+ (uint32_t)_sg.vk.dev_props.properties.limits.minUniformBufferOffsetAlignment,
_SG_VK_MEMTYPE_UNIFORMS,
"shared-uniform-buffer");
for (size_t i = 0; i < SG_MAX_UNIFORMBLOCK_BINDSLOTS; i++) {
@@ -19766,7 +19766,7 @@ _SOKOL_PRIVATE void _sg_vk_uniform_before_submit(void) {
// called form _sg_vk_apply_uniforms, returns offset of data snippet into uniform buffer
_SOKOL_PRIVATE uint32_t _sg_vk_uniform_copy(const sg_range* data) {
SOKOL_ASSERT(data && data->ptr && (data->size > 0));
- return _sg_vk_shared_buffer_memcpy(&_sg.vk.uniform, data->ptr, data->size);
+ return (uint32_t)_sg_vk_shared_buffer_memcpy(&_sg.vk.uniform, data->ptr, (uint32_t)data->size);
}
// resource binding system
@@ -19774,7 +19774,7 @@ _SOKOL_PRIVATE void _sg_vk_bind_init(void) {
SOKOL_ASSERT(_sg.desc.vulkan.descriptor_buffer_size > 0);
_sg_vk_shared_buffer_init(&_sg.vk.bind,
(uint32_t)_sg.desc.vulkan.descriptor_buffer_size,
- _sg.vk.descriptor_buffer_props.descriptorBufferOffsetAlignment,
+ (uint32_t)_sg.vk.descriptor_buffer_props.descriptorBufferOffsetAlignment,
_SG_VK_MEMTYPE_DESCRIPTORS,
"shared-descriptor-buffer");
}
@@ -19816,12 +19816,12 @@ _SOKOL_PRIVATE bool _sg_vk_bind_view_smp_descriptor_set(VkCommandBuffer cmd_buf,
// nothing to bind
return true;
}
- const VkDeviceSize dbuf_offset = _sg_vk_shared_buffer_alloc(&_sg.vk.bind, dset_size);
+ const VkDeviceSize dbuf_offset = _sg_vk_shared_buffer_alloc(&_sg.vk.bind, (uint32_t)dset_size);
if (_sg.vk.bind.overflown) {
_SG_ERROR(VULKAN_DESCRIPTOR_BUFFER_OVERFLOW);
return false;
}
- _sg_stats_add(vk.size_descriptor_buffer_writes, dset_size);
+ _sg_stats_add(vk.size_descriptor_buffer_writes, (uint32_t)dset_size);
uint8_t* dbuf_ptr = _sg_vk_shared_buffer_ptr(&_sg.vk.bind, dbuf_offset);
// copy pre-recorded descriptor data into descriptor buffer
@@ -19871,12 +19871,12 @@ _SOKOL_PRIVATE bool _sg_vk_bind_uniform_descriptor_set(VkCommandBuffer cmd_buf)
const _sg_shader_t* shd = _sg_shader_ref_ptr(&pip->cmn.shader);
// get next pointer in descriptor buffer
- const VkDeviceSize dbuf_offset = _sg_vk_shared_buffer_alloc(&_sg.vk.bind, shd->vk.ub_dset_size);
+ const VkDeviceSize dbuf_offset = _sg_vk_shared_buffer_alloc(&_sg.vk.bind, (uint32_t)shd->vk.ub_dset_size);
if (_sg.vk.bind.overflown) {
_SG_ERROR(VULKAN_DESCRIPTOR_BUFFER_OVERFLOW);
return false;
}
- _sg_stats_add(vk.size_descriptor_buffer_writes, shd->vk.ub_dset_size);
+ _sg_stats_add(vk.size_descriptor_buffer_writes, (uint32_t)shd->vk.ub_dset_size);
uint8_t* dbuf_ptr = _sg_vk_shared_buffer_ptr(&_sg.vk.bind, dbuf_offset);
// update descriptor buffer
@@ -20542,7 +20542,7 @@ _SOKOL_PRIVATE void _sg_vk_acquire_frame_command_buffers(void) {
_sg.cur_pass.valid = false;
return;
}
- VkResult res = vkResetFences(_sg.vk.dev, 1, &_sg.vk.frame.slot[_sg.vk.frame_slot].fence);
+ res = vkResetFences(_sg.vk.dev, 1, &_sg.vk.frame.slot[_sg.vk.frame_slot].fence);
SOKOL_ASSERT(res == VK_SUCCESS); _SOKOL_UNUSED(res);
_sg_vk_delete_queue_collect();
@@ -20952,7 +20952,7 @@ _SOKOL_PRIVATE sg_resource_state _sg_vk_create_shader(_sg_shader_t* shd, const s
VkResult res;
_SG_STRUCT(VkDescriptorSetLayoutBinding, dsl_entries[_SG_VK_MAX_VIEW_SMP_DESCRIPTORSET_ENTRIES]);
_SG_STRUCT(VkDescriptorSetLayoutCreateInfo, dsl_create_info);
- size_t dsl_index = 0;
+ uint32_t dsl_index = 0;
for (size_t i = 0; i < SG_MAX_UNIFORMBLOCK_BINDSLOTS; i++) {
if (shd->cmn.uniform_blocks[i].stage == SG_SHADERSTAGE_NONE) {
continue;
@@ -20984,7 +20984,7 @@ _SOKOL_PRIVATE sg_resource_state _sg_vk_create_shader(_sg_shader_t* shd, const s
const uint8_t vk_bnd = shd->vk.ub_set0_bnd_n[i];
VkDeviceSize dset_offset = 0;
_sg.vk.ext.get_descriptor_set_layout_binding_offset(_sg.vk.dev, shd->vk.ub_dsl, vk_bnd, &dset_offset);
- shd->vk.ub_dset_offsets[i] = dset_offset;
+ shd->vk.ub_dset_offsets[i] = (uint16_t)dset_offset;
}
_sg_clear(dsl_entries, sizeof(dsl_entries));
@@ -21045,7 +21045,7 @@ _SOKOL_PRIVATE sg_resource_state _sg_vk_create_shader(_sg_shader_t* shd, const s
const uint8_t vk_bnd = shd->vk.view_set1_bnd_n[i];
VkDeviceSize dset_offset = 0;
_sg.vk.ext.get_descriptor_set_layout_binding_offset(_sg.vk.dev, shd->vk.view_smp_dsl, vk_bnd, &dset_offset);
- shd->vk.view_dset_offsets[i] = dset_offset;
+ shd->vk.view_dset_offsets[i] = (uint16_t)dset_offset;
}
for (size_t i = 0; i < SG_MAX_SAMPLER_BINDSLOTS; i++) {
if (shd->cmn.samplers[i].stage == SG_SHADERSTAGE_NONE) {
@@ -21054,7 +21054,7 @@ _SOKOL_PRIVATE sg_resource_state _sg_vk_create_shader(_sg_shader_t* shd, const s
const uint8_t vk_bnd = shd->vk.smp_set1_bnd_n[i];
VkDeviceSize dset_offset = 0;
_sg.vk.ext.get_descriptor_set_layout_binding_offset(_sg.vk.dev, shd->vk.view_smp_dsl, vk_bnd, &dset_offset);
- shd->vk.smp_dset_offsets[i] = dset_offset;
+ shd->vk.smp_dset_offsets[i] = (uint16_t)dset_offset;
}
VkDescriptorSetLayout set_layouts[_SG_VK_NUM_DESCRIPTORSETS] = {
@@ -21542,7 +21542,7 @@ _SOKOL_PRIVATE void _sg_vk_begin_render_pass(VkCommandBuffer cmd_buf, const sg_p
vkCmdBeginRendering(cmd_buf, &render_info);
_SG_STRUCT(VkViewport, vp);
- vp.y = _sg.cur_pass.dim.height;
+ vp.y = (float)_sg.cur_pass.dim.height;
vp.width = (float)_sg.cur_pass.dim.width;
vp.height = (float)-_sg.cur_pass.dim.height;
vp.maxDepth = 1.0f;
@@ -21609,7 +21609,7 @@ _SOKOL_PRIVATE bool _sg_vk_apply_bindings(_sg_bindings_ptrs_t* bnd) {
// FIXME: could do this in a single call if buffer bindings are guaranteed
// to be continuous (currently that's not checked anywhere), or alternative
// via nullDescriptor robustness feature (which apparently may have performance downsides)
- for (size_t i = 0; i < SG_MAX_VERTEXBUFFER_BINDSLOTS; i++) {
+ for (uint32_t i = 0; i < SG_MAX_VERTEXBUFFER_BINDSLOTS; i++) {
if (bnd->vbs[i]) {
VkBuffer vk_buf = bnd->vbs[i]->vk.buf;
VkDeviceSize vk_offset = (VkDeviceSize)bnd->vb_offsets[i];