aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md117
-rw-r--r--README.md3
-rw-r--r--bindgen/gen_nim.py6
-rw-r--r--sokol_app.h94
-rw-r--r--sokol_gfx.h767
-rw-r--r--tests/CMakeLists.txt6
-rw-r--r--tests/CMakePresets.json26
-rw-r--r--tests/functional/force_dummy_backend.h4
-rw-r--r--util/sokol_debugtext.h102
-rw-r--r--util/sokol_fontstash.h118
-rw-r--r--util/sokol_gfx_imgui.h49
-rw-r--r--util/sokol_gl.h115
-rw-r--r--util/sokol_imgui.h102
-rw-r--r--util/sokol_nuklear.h102
-rw-r--r--util/sokol_spine.h122
15 files changed, 1223 insertions, 510 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5e3385be..4817a957 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,118 @@
## Updates
+### 09-May-2024
+
+The 'storage buffer update'. sokol_gfx.h now has (readonly) storage buffer support, providing
+a more flexible way to pass array-like random access data from the CPU to the GPU side.
+
+Please see the following [blog post](https://floooh.github.io/2024/05/06/sokol-storage-buffers.html)
+and the [associated PR #1007](https://github.com/floooh/sokol/pull/1007) for details.
+
+Please also note the new documentation section `ON STORAGE BUFFERS` in sokol_gfx.h.
+
+Also see the related [changes in sokol-shdc](https://github.com/floooh/sokol-tools/blob/master/CHANGELOG.md).
+
+...and finally the following new samples (note that the demo are running on WebGPU and currently
+require a recent Chrome on macOS or Windows):
+
+- rendering without buffer bindings (this sample actually also runs on WebGL2):
+ - WebGPU: https://floooh.github.io/2024/05/06/sokol-storage-buffers.html
+ - C source: https://github.com/floooh/sokol-samples/blob/master/sapp/triangle-bufferless-sapp.c
+ - GLSL source: https://github.com/floooh/sokol-samples/blob/master/sapp/triangle-bufferless-sapp.glsl
+- vertex pulling from a storage buffer:
+ - WebGPU: https://floooh.github.io/sokol-webgpu/vertexpull-sapp.html
+ - C source: https://github.com/floooh/sokol-samples/tree/master/sapp/vertexpull-sapp.c
+ - GLSL source: https://github.com/floooh/sokol-samples/tree/master/sapp/vertexpull-sapp.glsl
+- reading storage buffer content in fragment shader:
+ - WebGPU: https://floooh.github.io/sokol-webgpu/sbuftex-sapp.html
+ - C source: https://github.com/floooh/sokol-samples/tree/master/sapp/sbuftex-sapp.c
+ - GLSL source: https://github.com/floooh/sokol-samples/tree/master/sapp/sbuftex-sapp.glsl
+- instanced rendering via storage buffer:
+ - WebGPU: https://floooh.github.io/sokol-webgpu/instancing-pull-sapp.html
+ - C source: https://github.com/floooh/sokol-samples/tree/master/sapp/instancing-pull.c
+ - GLSL source: https://github.com/floooh/sokol-samples/tree/master/sapp/instancing-pull.glsl
+- skinned character rendering via storage buffers:
+ - WebGPU: https://floooh.github.io/sokol-webgpu/ozz-storagebuffer-sapp.html
+ - C source: https://github.com/floooh/sokol-samples/tree/master/sapp/ozz-storagebuffer-sapp.c
+ - GLSL source: https://github.com/floooh/sokol-samples/tree/master/sapp/ozz-storagebuffer-sapp.glsl
+
+Also see the following backend-specific samples which don't use sokol-shdc:
+
+- D3D11: https://github.com/floooh/sokol-samples/blob/master/d3d11/vertexpulling-d3d11.c
+- Metal: https://github.com/floooh/sokol-samples/blob/master/metal/vertexpulling-metal.c
+- WebGPU: https://github.com/floooh/sokol-samples/blob/master/wgpu/vertexpulling-wgpu.c
+- Desktop GL: https://github.com/floooh/sokol-samples/blob/master/glfw/vertexpulling-glfw.c
+
+Storage support is not available on the following platform/backend combos:
+
+- macOS + GL (stuck at GL 4.1)
+- iOS + GL (stuck at GLES 3.0)
+- WebGL2 (stuck at GLES 3.0)
+- Android (support may be implemented at a later time)
+
+#### **BREAKING CHANGES**
+
+- the config define `SOKOL_GLCORE33` has been renamed to `SOKOL_GLCORE`, this affects
+ the following headers:
+ - sokol_gfx.h
+ - sokol_app.gh
+ - sokol_debugtext.h
+ - sokol_fontstash.h
+ - sokol_gl.h
+ - sokol_imgui.h
+ - sokol_nuklear.h
+ - sokol_spine.h
+- likewise in the sokol_gfx.h enum `sg_backend` the enum item `SG_BACKEND_GLCORE33` has been
+ renamed to `SG_BACKEND_GLCORE`
+- sokol_gfx.h now expects a minimal desktop GL version of 4.1 on macOS, and 4.3 on other
+ platforms (this only matters if you don't use sokol_app.h), storage buffer support is only
+ available on GL 4.3 contexts
+- likewise, shaders passed into sokol_gfx.h when the desktop GL backend is active are now expected
+ to be `#version 410` or `#version 430` (`#version 330` may still work but though but is untested)
+- likewise, by default sokol_app.h now creates a GL 4.1 context on macOS and a GL 4.3 context on other
+ desktop platforms when `SOKOL_GLCORE` is defined
+- if you're passing WGSL shaders directly into sokol_gfx.h (instead of using sokol-shdc), please
+ be aware that the binding offets for the different shader resource types have moved:
+ - vertex shader stage:
+ - textures: `@group(1) @binding(0..15)`
+ - samplers: `@group(1) @binding(16..31)`
+ - storage buffers: `@group(1) @binding(32..37)`
+ - fragment shader stage:
+ - textures: `@group(1) @binding(48..63)`
+ - samplers: `@group(1) @binding(64..79)`
+ - storage buffers `@group(1) @binding(80..95)`
+
+#### **NON-BREAKING CHANGES**
+
+- **sokol_app.h** learned two new functions to get the desktop GL version (note that on GLES
+ these return 0, this behaviour may change at a later time):
+ - `int sapp_gl_get_major_version(void)`
+ - `int sapp_gl_get_minor_version(void)`
+
+- **sokol_gfx.h**:
+ - The enum `sg_buffer_type` has a new member `SG_BUFFERTYPE_STORAGEBUFFER`, used
+ in the `sg_make_buffer()` call to create a storage buffer
+ - The struct `sg_features` has a new member `bool storage_buffer`, used to indicate
+ that the current 3D backend supports storage buffers
+ - The stats struct `sg_frame_stats_metal_bindings` has a new member `num_set_fragment_buffer`
+ - There are various new error codes and validation checks related to storage buffers
+ - A new struct `sg_shader_storage_buffer_desc`, nested in `sg_shader_desc`.
+ This is used in the `sg_make_shader()` call to communicate to sokol_gfx.h
+ what storage buffer bind slots are used in a shader
+
+- **sokol_gfx_imgui.h**: The debug UI panels have been updated to visualize the new
+ storage buffer related state
+
+- in the following headers, the embedded shaders have been updated via the new
+ sokol-shdc version, switching the embedded GLSL shaders to `#version 410`
+ - sokol_debugtext.h
+ - sokol_fontstash.h
+ - sokol_gl.h
+ - sokol_imgui.h
+ - sokol_nuklear.h
+ - sokol_spine.h
+
+
### 03-May-2024:
- sokol_app.h win32: Merged PR https://github.com/floooh/sokol/pull/1034, this adds a NOAPI mode
@@ -1281,8 +1394,8 @@ GLES2/WebGL1 support has been removed from the sokol headers (now that
GLX for the window system glue code and can create a GLES2 or GLES3 context
instead of a 'desktop GL' context.
To get EGL+GLES2/GLES3, just define SOKOL_GLES2 or SOKOL_GLES3 to compile the
- implementation. To get EGL+GL, define SOKOL_GLCORE33 *and* SOKOL_FORCE_EGL.
- By default, defining just SOKOL_GLCORE33 uses GLX for the window system glue
+ implementation. To get EGL+GL, define SOKOL_GLCORE *and* SOKOL_FORCE_EGL.
+ By default, defining just SOKOL_GLCORE uses GLX for the window system glue
(just as before). Many thanks to GH user @billzez for the PR!
- **10-Sep-2022**: sokol_app.h and sokol_args.h has been fixed for Emscripten 3.21, those headers
diff --git a/README.md b/README.md
index f390cf20..43be48a0 100644
--- a/README.md
+++ b/README.md
@@ -6,8 +6,7 @@
# Sokol
-[**See what's new**](https://github.com/floooh/sokol/blob/master/CHANGELOG.md) (**29-Feb-2024**: **BREAKING CHANGES** 'unified render pass'
-cleanup in sokol_gfx.h)
+[**See what's new**](https://github.com/floooh/sokol/blob/master/CHANGELOG.md) (**09-May-2024**: **BREAKING CHANGES** 'storage buffer support' in sokol_gfx.h
[![Build](/../../actions/workflows/main.yml/badge.svg)](/../../actions/workflows/main.yml) [![Bindings](/../../actions/workflows/gen_bindings.yml/badge.svg)](/../../actions/workflows/gen_bindings.yml) [![build](https://github.com/floooh/sokol-zig/actions/workflows/main.yml/badge.svg)](https://github.com/floooh/sokol-zig/actions/workflows/main.yml) [![build](https://github.com/floooh/sokol-nim/actions/workflows/main.yml/badge.svg)](https://github.com/floooh/sokol-nim/actions/workflows/main.yml) [![Odin](https://github.com/floooh/sokol-odin/actions/workflows/main.yml/badge.svg)](https://github.com/floooh/sokol-odin/actions/workflows/main.yml)[![Rust](https://github.com/floooh/sokol-rust/actions/workflows/main.yml/badge.svg)](https://github.com/floooh/sokol-rust/actions/workflows/main.yml)
diff --git a/bindgen/gen_nim.py b/bindgen/gen_nim.py
index 700305ab..0468dfb3 100644
--- a/bindgen/gen_nim.py
+++ b/bindgen/gen_nim.py
@@ -513,7 +513,7 @@ def gen_extra(inp):
l(' when not defined vcc:')
l(' {.passl:"-lkernel32 -luser32 -lshell32 -lgdi32".}')
l(' when defined gl:')
- l(' {.passc:"-DSOKOL_GLCORE33".}')
+ l(' {.passc:"-DSOKOL_GLCORE".}')
l(' else:')
l(' {.passc:"-DSOKOL_D3D11".}')
l(' when not defined vcc:')
@@ -522,13 +522,13 @@ def gen_extra(inp):
l(' {.passc:"-x objective-c".}')
l(' {.passl:"-framework Cocoa -framework QuartzCore".}')
l(' when defined gl:')
- l(' {.passc:"-DSOKOL_GLCORE33".}')
+ l(' {.passc:"-DSOKOL_GLCORE".}')
l(' {.passl:"-framework OpenGL".}')
l(' else:')
l(' {.passc:"-DSOKOL_METAL".}')
l(' {.passl:"-framework Metal -framework MetalKit".}')
l('elif defined linux:')
- l(' {.passc:"-DSOKOL_GLCORE33".}')
+ l(' {.passc:"-DSOKOL_GLCORE".}')
l(' {.passl:"-lX11 -lXi -lXcursor -lGL -lm -ldl -lpthread".}')
l('else:')
l(' error("unsupported platform")')
diff --git a/sokol_app.h b/sokol_app.h
index 06dfe51b..515796a1 100644
--- a/sokol_app.h
+++ b/sokol_app.h
@@ -18,7 +18,7 @@
the backend selected for sokol_gfx.h if both are used in the same
project):
- #define SOKOL_GLCORE33
+ #define SOKOL_GLCORE
#define SOKOL_GLES3
#define SOKOL_D3D11
#define SOKOL_METAL
@@ -48,7 +48,7 @@
On Windows, SOKOL_DLL will define SOKOL_APP_API_DECL as __declspec(dllexport)
or __declspec(dllimport) as needed.
- On Linux, SOKOL_GLCORE33 can use either GLX or EGL.
+ On Linux, SOKOL_GLCORE can use either GLX or EGL.
GLX is default, set SOKOL_FORCE_EGL to override.
For example code, see https://github.com/floooh/sokol-samples/tree/master/sapp
@@ -315,10 +315,15 @@
objects and values required for rendering. If sokol_app.h
is not compiled with SOKOL_WGPU, these functions return null.
- const uint32_t sapp_gl_get_framebuffer(void)
+ uint32_t sapp_gl_get_framebuffer(void)
This returns the 'default framebuffer' of the GL context.
Typically this will be zero.
+ int sapp_gl_get_major_version(void)
+ int sapp_gl_get_minor_version(void)
+ Returns the major and minor version of the GL context
+ (only for SOKOL_GLCORE, all other backends return zero here, including SOKOL_GLES3)
+
const void* sapp_android_get_native_activity(void);
On Android, get the native activity ANativeActivity pointer, otherwise
a null pointer.
@@ -1894,6 +1899,10 @@ SOKOL_APP_API_DECL const void* sapp_wgpu_get_depth_stencil_view(void);
/* GL: get framebuffer object */
SOKOL_APP_API_DECL uint32_t sapp_gl_get_framebuffer(void);
+/* GL: get major version (only valid for desktop GL) */
+SOKOL_APP_API_DECL int sapp_gl_get_major_version(void);
+/* GL: get minor version (only valid for desktop GL) */
+SOKOL_APP_API_DECL int sapp_gl_get_minor_version(void);
/* Android: get native activity handle */
SOKOL_APP_API_DECL const void* sapp_android_get_native_activity(void);
@@ -1961,8 +1970,8 @@ inline void sapp_run(const sapp_desc& desc) { return sapp_run(&desc); }
#if defined(TARGET_OS_IPHONE) && !TARGET_OS_IPHONE
/* MacOS */
#define _SAPP_MACOS (1)
- #if !defined(SOKOL_METAL) && !defined(SOKOL_GLCORE33)
- #error("sokol_app.h: unknown 3D API selected for MacOS, must be SOKOL_METAL or SOKOL_GLCORE33")
+ #if !defined(SOKOL_METAL) && !defined(SOKOL_GLCORE)
+ #error("sokol_app.h: unknown 3D API selected for MacOS, must be SOKOL_METAL or SOKOL_GLCORE")
#endif
#else
/* iOS or iOS Simulator */
@@ -1980,8 +1989,8 @@ 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_GLCORE33) && !defined(SOKOL_NOAPI)
- #error("sokol_app.h: unknown 3D API selected for Win32, must be SOKOL_D3D11, SOKOL_GLCORE33 or SOKOL_NOAPI")
+ #if !defined(SOKOL_D3D11) && !defined(SOKOL_GLCORE) && !defined(SOKOL_NOAPI)
+ #error("sokol_app.h: unknown 3D API selected for Win32, must be SOKOL_D3D11, SOKOL_GLCORE or SOKOL_NOAPI")
#endif
#elif defined(__ANDROID__)
/* Android */
@@ -1995,7 +2004,7 @@ inline void sapp_run(const sapp_desc& desc) { return sapp_run(&desc); }
#elif defined(__linux__) || defined(__unix__)
/* Linux */
#define _SAPP_LINUX (1)
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
#if !defined(SOKOL_FORCE_EGL)
#define _SAPP_GLX (1)
#endif
@@ -2005,13 +2014,13 @@ inline void sapp_run(const sapp_desc& desc) { return sapp_run(&desc); }
#include <GLES3/gl3.h>
#include <GLES3/gl3ext.h>
#else
- #error("sokol_app.h: unknown 3D API selected for Linux, must be SOKOL_GLCORE33, SOKOL_GLES3")
+ #error("sokol_app.h: unknown 3D API selected for Linux, must be SOKOL_GLCORE, SOKOL_GLES3")
#endif
#else
#error "sokol_app.h: Unknown platform"
#endif
-#if defined(SOKOL_GLCORE33) || defined(SOKOL_GLES3)
+#if defined(SOKOL_GLCORE) || defined(SOKOL_GLES3)
#define _SAPP_ANY_GL (1)
#endif
@@ -2401,11 +2410,11 @@ _SOKOL_PRIVATE double _sapp_timing_get_avg(_sapp_timing_t* t) {
#if defined(SOKOL_METAL)
@interface _sapp_macos_view : MTKView
@end
-#elif defined(SOKOL_GLCORE33)
+#elif defined(SOKOL_GLCORE)
@interface _sapp_macos_view : NSOpenGLView
- (void)timerFired:(id)sender;
@end
-#endif // SOKOL_GLCORE33
+#endif // SOKOL_GLCORE
typedef struct {
uint32_t flags_changed_store;
@@ -2547,7 +2556,7 @@ typedef struct {
uint8_t raw_input_data[256];
} _sapp_win32_t;
-#if defined(SOKOL_GLCORE33)
+#if defined(SOKOL_GLCORE)
#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
#define WGL_SUPPORT_OPENGL_ARB 0x2010
#define WGL_DRAW_TO_WINDOW_ARB 0x2001
@@ -2607,7 +2616,7 @@ typedef struct {
HWND msg_hwnd;
HDC msg_dc;
} _sapp_wgl_t;
-#endif // SOKOL_GLCORE33
+#endif // SOKOL_GLCORE
#endif // _SAPP_WIN32
@@ -2878,7 +2887,7 @@ typedef struct {
_sapp_win32_t win32;
#if defined(SOKOL_D3D11)
_sapp_d3d11_t d3d11;
- #elif defined(SOKOL_GLCORE33)
+ #elif defined(SOKOL_GLCORE)
_sapp_wgl_t wgl;
#endif
#elif defined(_SAPP_ANDROID)
@@ -3087,8 +3096,13 @@ _SOKOL_PRIVATE sapp_desc _sapp_desc_defaults(const sapp_desc* desc) {
// (or expressed differently: zero is a valid value for gl_minor_version
// and can't be used to indicate 'default')
if (0 == res.gl_major_version) {
- res.gl_major_version = 3;
- res.gl_minor_version = 2;
+ #if defined(_SAPP_APPLE)
+ res.gl_major_version = 4;
+ res.gl_minor_version = 1;
+ #else
+ res.gl_major_version = 4;
+ res.gl_minor_version = 3;
+ #endif
}
res.html5_canvas_name = _sapp_def(res.html5_canvas_name, "canvas");
res.clipboard_size = _sapp_def(res.clipboard_size, 8192);
@@ -3652,7 +3666,7 @@ _SOKOL_PRIVATE void _sapp_macos_update_dimensions(void) {
const int cur_fb_height = (int)roundf(fb_size.height);
const bool dim_changed = (_sapp.framebuffer_width != cur_fb_width) ||
(_sapp.framebuffer_height != cur_fb_height);
- #elif defined(SOKOL_GLCORE33)
+ #elif defined(SOKOL_GLCORE)
const int cur_fb_width = (int)roundf(bounds.size.width * _sapp.dpi_scale);
const int cur_fb_height = (int)roundf(bounds.size.height * _sapp.dpi_scale);
const bool dim_changed = (_sapp.framebuffer_width != cur_fb_width) ||
@@ -3894,7 +3908,7 @@ _SOKOL_PRIVATE void _sapp_macos_frame(void) {
_sapp.macos.window.contentView = _sapp.macos.view;
[_sapp.macos.window makeFirstResponder:_sapp.macos.view];
_sapp.macos.view.layer.magnificationFilter = kCAFilterNearest;
- #elif defined(SOKOL_GLCORE33)
+ #elif defined(SOKOL_GLCORE)
NSOpenGLPixelFormatAttribute attrs[32];
int i = 0;
attrs[i++] = NSOpenGLPFAAccelerated;
@@ -4126,7 +4140,7 @@ _SOKOL_PRIVATE void _sapp_macos_frame(void) {
@end
@implementation _sapp_macos_view
-#if defined(SOKOL_GLCORE33)
+#if defined(SOKOL_GLCORE)
- (void)timerFired:(id)sender {
_SOKOL_UNUSED(sender);
[self setNeedsDisplay:YES];
@@ -4226,7 +4240,7 @@ _SOKOL_PRIVATE void _sapp_macos_poll_input_events(void) {
// helper function to make GL context active
static void _sapp_gl_make_current(void) {
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
[[_sapp.macos.view openGLContext] makeCurrentContext];
#endif
}
@@ -5947,7 +5961,7 @@ int main(int argc, char* argv[]) {
// ██████ ███████ ██ ██ ███████ ███████ ██ ███████ ██ ██ ███████
//
// >>gl helpers
-#if defined(SOKOL_GLCORE33)
+#if defined(SOKOL_GLCORE)
typedef struct {
int red_bits;
int green_bits;
@@ -6598,7 +6612,7 @@ _SOKOL_PRIVATE void _sapp_d3d11_present(bool do_not_wait) {
#endif /* SOKOL_D3D11 */
-#if defined(SOKOL_GLCORE33)
+#if defined(SOKOL_GLCORE)
_SOKOL_PRIVATE void _sapp_wgl_init(void) {
_sapp.wgl.opengl32 = LoadLibraryA("opengl32.dll");
if (!_sapp.wgl.opengl32) {
@@ -6896,7 +6910,7 @@ _SOKOL_PRIVATE void _sapp_wgl_swap_buffers(void) {
/* FIXME: DwmIsCompositionEnabled? (see GLFW) */
SwapBuffers(_sapp.win32.dc);
}
-#endif /* SOKOL_GLCORE33 */
+#endif /* SOKOL_GLCORE */
_SOKOL_PRIVATE bool _sapp_win32_wide_to_utf8(const wchar_t* src, char* dst, int dst_num_bytes) {
SOKOL_ASSERT(src && dst && (dst_num_bytes > 1));
@@ -7313,7 +7327,7 @@ _SOKOL_PRIVATE void _sapp_win32_timing_measure(void) {
// fallback if swap model isn't "flip-discard" or GetFrameStatistics failed for another reason
_sapp_timing_measure(&_sapp.timing);
#endif
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
_sapp_timing_measure(&_sapp.timing);
#endif
#if defined(SOKOL_NOAPI)
@@ -7518,7 +7532,7 @@ _SOKOL_PRIVATE LRESULT CALLBACK _sapp_win32_wndproc(HWND hWnd, UINT uMsg, WPARAM
// present with DXGI_PRESENT_DO_NOT_WAIT
_sapp_d3d11_present(true);
#endif
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
_sapp_wgl_swap_buffers();
#endif
/* NOTE: resizing the swap-chain during resize leads to a substantial
@@ -7931,7 +7945,7 @@ _SOKOL_PRIVATE void _sapp_win32_run(const sapp_desc* desc) {
_sapp_d3d11_create_device_and_swapchain();
_sapp_d3d11_create_default_render_target();
#endif
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
_sapp_wgl_init();
_sapp_wgl_load_extensions();
_sapp_wgl_create_context();
@@ -7959,7 +7973,7 @@ _SOKOL_PRIVATE void _sapp_win32_run(const sapp_desc* desc) {
Sleep((DWORD)(16 * _sapp.swap_interval));
}
#endif
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
_sapp_wgl_swap_buffers();
#endif
/* check for window resized, this cannot happen in WM_SIZE as it explodes memory usage */
@@ -10952,7 +10966,7 @@ _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) {
#if !defined(_SAPP_GLX)
_SOKOL_PRIVATE void _sapp_egl_init(void) {
-#if defined(SOKOL_GLCORE33)
+#if defined(SOKOL_GLCORE)
if (!eglBindAPI(EGL_OPENGL_API)) {
_SAPP_PANIC(LINUX_EGL_BIND_OPENGL_API_FAILED);
}
@@ -10976,7 +10990,7 @@ _SOKOL_PRIVATE void _sapp_egl_init(void) {
EGLint alpha_size = _sapp.desc.alpha ? 8 : 0;
const EGLint config_attrs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
#elif defined(SOKOL_GLES3)
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT,
@@ -11039,7 +11053,7 @@ _SOKOL_PRIVATE void _sapp_egl_init(void) {
}
EGLint ctx_attrs[] = {
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
EGL_CONTEXT_MAJOR_VERSION, _sapp.desc.gl_major_version,
EGL_CONTEXT_MINOR_VERSION, _sapp.desc.gl_minor_version,
EGL_CONTEXT_OPENGL_PROFILE_MASK, EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
@@ -11758,6 +11772,24 @@ SOKOL_API_IMPL uint32_t sapp_gl_get_framebuffer(void) {
#endif
}
+SOKOL_API_IMPL int sapp_gl_get_major_version(void) {
+ SOKOL_ASSERT(_sapp.valid);
+ #if defined(SOKOL_GLCORE)
+ return _sapp.desc.gl_major_version;
+ #else
+ return 0;
+ #endif
+}
+
+SOKOL_API_IMPL int sapp_gl_get_minor_version(void) {
+ SOKOL_ASSERT(_sapp.valid);
+ #if defined(SOKOL_GLCORE)
+ return _sapp.desc.gl_minor_version;
+ #else
+ return 0;
+ #endif
+}
+
SOKOL_API_IMPL const void* sapp_android_get_native_activity(void) {
// NOTE: _sapp.valid is not asserted here because sapp_android_get_native_activity()
// needs to be callable from within sokol_main() (see: https://github.com/floooh/sokol/issues/708)
diff --git a/sokol_gfx.h b/sokol_gfx.h
index 7bf0454f..54ec4669 100644
--- a/sokol_gfx.h
+++ b/sokol_gfx.h
@@ -17,19 +17,19 @@
In the same place define one of the following to select the rendering
backend:
- #define SOKOL_GLCORE33
+ #define SOKOL_GLCORE
#define SOKOL_GLES3
#define SOKOL_D3D11
#define SOKOL_METAL
#define SOKOL_WGPU
#define SOKOL_DUMMY_BACKEND
- I.e. for the GL 3.3 Core Profile it should look like this:
+ I.e. for the desktop GL it should look like this:
#include ...
#include ...
#define SOKOL_IMPL
- #define SOKOL_GLCORE33
+ #define SOKOL_GLCORE
#include "sokol_gfx.h"
The dummy backend replaces the platform-specific backend code with empty
@@ -148,9 +148,8 @@
sg_apply_pipeline(sg_pipeline pip)
--- fill an sg_bindings struct with the resource bindings for the next
- draw call (1..N vertex buffers, 0 or 1 index buffer, 0..N image objects and
- 0..N sampler objects on the vertex-shader- and fragment-shader-stage
- and then call
+ draw call (0..N vertex buffers, 0 or 1 index buffer, 0..N image-objects,
+ samplers and storage-buffers), and call:
sg_apply_bindings(const sg_bindings* bindings)
@@ -718,7 +717,9 @@
the sg_make_shader() function requires the following information:
- Shader code or shader binary blobs for the vertex- and fragment- shader-stage:
- - for the desktop GL backend, source code must be provided in '#version 330' syntax
+ - for the desktop GL backend, source code can be provided in '#version 410' or
+ '#version 430', version 430 is required for storage buffer support, but note
+ that this is not available on macOS
- for the GLES3 backend, source code must be provided in '#version 300 es' syntax
- for the D3D11 backend, shaders can be provided as source or binary blobs, the
source code should be in HLSL4.0 (for best compatibility) or alternatively
@@ -757,6 +758,12 @@
- please also NOTE the documentation sections about UNIFORM DATA LAYOUT
and CROSS-BACKEND COMMON UNIFORM DATA LAYOUT below!
+ - A description of each storage buffer used in the shader:
+ - a boolean 'readonly' flag, note that currently only
+ readonly storage buffers are supported
+ - note that storage buffers are not supported on all backends
+ and platforms
+
- A description of each texture/image used in the shader:
- the expected image type:
- SG_IMAGETYPE_2D
@@ -773,7 +780,7 @@
(currently it's not supported to fetch data from multisampled
textures in shaders, but this is planned for a later time)
- - A description of each sampler used in the shader:
+ - A description of each texture sampler used in the shader:
- SG_SAMPLERTYPE_FILTERING,
- SG_SAMPLERTYPE_NONFILTERING,
- SG_SAMPLERTYPE_COMPARISON,
@@ -953,6 +960,126 @@
The by far easiest way to tackle the common uniform block layout problem is
to use the sokol-shdc shader cross-compiler tool!
+ ON STORAGE BUFFERS
+ ==================
+ Storage buffers can be used to pass large amounts of random access structured
+ data fromt the CPU side to the shaders. They are similar to data textures, but are
+ more convenient to use both on the CPU and shader side since they can be accessed
+ in shaders as as a 1-dimensional array of struct items.
+
+ Storage buffers are *NOT* supported on the following platform/backend combos:
+
+ - macOS+GL (because storage buffers require GL 4.3, while macOS only goes up to GL 4.1)
+ - all GLES3 platforms (WebGL2, iOS, Android - with the option that support on
+ Android may be added at a later point)
+
+ Currently only 'readonly' storage buffers are supported (meaning it's not possible
+ to write to storage buffers from shaders).
+
+ To use storage buffers, the following steps are required:
+
+ - write a shader which uses storage buffers (also see the example links below)
+ - create one or more storage buffers via sg_make_buffer() with the
+ buffer type SG_BUFFERTYPE_STORAGEBUFFER
+ - when creating a shader via sg_make_shader(), populate the sg_shader_desc
+ struct with binding info (when using sokol-shdc, this step will be taken care
+ of automatically)
+ - which storage buffer bind slots on the vertex- and fragment-stage
+ are occupied
+ - whether the storage buffer on that bind slot is readonly (this is currently required
+ to be true)
+ - when calling sg_apply_bindings(), apply the matching bind slots with the previously
+ created storage buffers
+ - ...and that's it.
+
+ For more details, see the following backend-agnostic sokol samples:
+
+ - simple vertex pulling from a storage buffer:
+ - C code: https://github.com/floooh/sokol-samples/blob/master/sapp/vertexpull-sapp.c
+ - shader: https://github.com/floooh/sokol-samples/blob/master/sapp/vertexpull-sapp.glsl
+ - instanced rendering via storage buffers (vertex- and instance-pulling):
+ - C code: https://github.com/floooh/sokol-samples/blob/master/sapp/instancing-pull-sapp.c
+ - shader: https://github.com/floooh/sokol-samples/blob/master/sapp/instancing-pull-sapp.glsl
+ - storage buffers both on the vertex- and fragment-stage:
+ - C code: https://github.com/floooh/sokol-samples/blob/master/sapp/sbuftex-sapp.c
+ - shader: https://github.com/floooh/sokol-samples/blob/master/sapp/sbuftex-sapp.glsl
+ - the Ozz animation sample rewritten to pull all rendering data from storage buffers:
+ - C code: https://github.com/floooh/sokol-samples/blob/master/sapp/ozz-storagebuffer-sapp.cc
+ - shader: https://github.com/floooh/sokol-samples/blob/master/sapp/ozz-storagebuffer-sapp.glsl
+
+ ...also see the following backend-specific vertex pulling samples (those also don't use sokol-shdc):
+
+ - D3D11: https://github.com/floooh/sokol-samples/blob/master/d3d11/vertexpulling-d3d11.c
+ - desktop GL: https://github.com/floooh/sokol-samples/blob/master/glfw/vertexpulling-glfw.c
+ - Metal: https://github.com/floooh/sokol-samples/blob/master/metal/vertexpulling-metal.c
+ - WebGPU: https://github.com/floooh/sokol-samples/blob/master/wgpu/vertexpulling-wgpu.c
+
+ Storage buffer shader authoring caveats when using sokol-shdc:
+
+ - declare a storage buffer interface block with `readonly buffer [name] { ... }`
+ - do NOT annotate storage buffers with `layout(...)`, sokol-shdc will take care of that
+ - declare a struct which describes a single array item in the storage buffer interface block
+ - only put a single flexible array member into the storage buffer interface block
+
+ E.g. a complete example in 'sokol-shdc GLSL':
+
+ ```glsl
+ // declare a struct:
+ struct sb_vertex {
+ vec3 pos;
+ vec4 color;
+ }
+ // declare a buffer interface block with a single flexible struct array:
+ readonly buffer vertices {
+ sb_vertex vtx[];
+ }
+ // in the shader function, access the storage buffer like this:
+ void main() {
+ vec3 pos = vtx[gl_VertexIndex].pos;
+ ...
+ }
+ ```
+
+ Backend-specific storage-buffer caveats (not relevant when using sokol-shdc):
+
+ D3D11:
+ - storage buffers are created as 'raw' Byte Address Buffers
+ (https://learn.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-intro#raw-views-of-buffers)
+ - in HLSL, use a ByteAddressBuffer to access the buffer content
+ (https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/sm5-object-byteaddressbuffer)
+ - in D3D11, storage buffers and textures share the same bind slots, sokol-gfx reserves
+ shader resource slots 0..15 for textures and 16..23 for storage buffers.
+ - e.g. in HLSL, storage buffer bindings start at register(t16) no matter the shader stage
+
+ Metal:
+ - in Metal there is no internal difference between vertex-, uniform- and
+ storage-buffers, all are bound to the same 'buffer bind slots' with the
+ following reserved ranges:
+ - vertex shader stage:
+ - uniform buffers (internal): slots 0..3
+ - vertex buffers: slots 4..11
+ - storage buffers: slots 12..19
+ - fragment shader stage:
+ - uniform buffers (internal): slots 0..3
+ - storage buffers: slots 4..11
+ - this means in MSL, storage buffer bindings start at [[buffer(12)]] in the vertex
+ shaders, and at [[buffer(4)]] in fragment shaders
+
+ GL:
+ - the GL backend doesn't use name-lookup to find storage buffer bindings, this
+ means you must annotate buffers with `layout(std430, binding=N)` in GLSL
+ - ...where N is 0..7 in the vertex shader, and 8..15 in the fragment shader
+
+ WebGPU:
+ - in WGSL, use the following bind locations for the various shader resource types:
+ - vertex shader stage:
+ - textures `@group(1) @binding(0..15)`
+ - samplers `@group(1) @binding(16..31)`
+ - storage buffers `@group(1) @binding(32..47)`
+ - fragment shader stage:
+ - textures `@group(1) @binding(48..63)`
+ - samplers `@group(1) @binding(64..79)`
+ - storage buffers `@group(1) @binding(80..95)`
TRACE HOOKS:
============
@@ -1334,12 +1461,14 @@
offsets depending on resource type and shader stage.
- Vertex shader textures must start at `@group(1) @binding(0)`
- Vertex shader samplers must start at `@group(1) @binding(16)`
- - Fragment shader textures must start at `@group(1) @binding(32)`
- - Fragment shader samplers must start at `@group(1) @binding(48)`
+ - Vertex shader storage buffers must start at `@group(1) @binding(32)`
+ - Fragment shader textures must start at `@group(1) @binding(48)`
+ - Fragment shader samplers must start at `@group(1) @binding(64)`
+ - Fragment shader storage buffers must start at `@group(1) @binding(80)`
Note that the actual number of allowed per-stage texture- and sampler-bindings
in sokol-gfx is currently lower than the above ranges (currently only up to
- 12 textures and 8 samplers per shader stage are allowed).
+ 12 textures, 8 samplers and 8 storage buffers are allowed per shader stage).
If you use sokol-shdc to generate WGSL shader code, you don't need to worry
about the above binding convention since sokol-shdc assigns bind slots
@@ -1516,6 +1645,7 @@ enum {
SG_MAX_SHADERSTAGE_IMAGES = 12,
SG_MAX_SHADERSTAGE_SAMPLERS = 8,
SG_MAX_SHADERSTAGE_IMAGESAMPLERPAIRS = 12,
+ SG_MAX_SHADERSTAGE_STORAGEBUFFERS = 8,
SG_MAX_SHADERSTAGE_UBS = 4,
SG_MAX_UB_MEMBERS = 16,
SG_MAX_VERTEX_ATTRIBUTES = 16,
@@ -1537,7 +1667,7 @@ typedef struct sg_color { float r, g, b, a; } sg_color;
to get the currently active backend.
*/
typedef enum sg_backend {
- SG_BACKEND_GLCORE33,
+ SG_BACKEND_GLCORE,
SG_BACKEND_GLES3,
SG_BACKEND_D3D11,
SG_BACKEND_METAL_IOS,
@@ -1700,6 +1830,7 @@ typedef struct sg_features {
bool image_clamp_to_border; // border color and clamp-to-border UV-wrap mode is supported
bool mrt_independent_blend_state; // multiple-render-target rendering can use per-render-target blend state
bool mrt_independent_write_mask; // multiple-render-target rendering can use per-render-target color write masks
+ bool storage_buffer; // storage buffers are supported
} sg_features;
/*
@@ -1789,8 +1920,10 @@ typedef enum sg_usage {
/*
sg_buffer_type
- This indicates whether a buffer contains vertex- or index-data,
- used in the sg_buffer_desc.type member when creating a buffer.
+ Indicates whether a buffer will be bound as vertex-,
+ index- or storage-buffer.
+
+ Used in the sg_buffer_desc.type member when creating a buffer.
The default value is SG_BUFFERTYPE_VERTEXBUFFER.
*/
@@ -1798,6 +1931,7 @@ typedef enum sg_buffer_type {
_SG_BUFFERTYPE_DEFAULT, // value 0 reserved for default-init
SG_BUFFERTYPE_VERTEXBUFFER,
SG_BUFFERTYPE_INDEXBUFFER,
+ SG_BUFFERTYPE_STORAGEBUFFER,
_SG_BUFFERTYPE_NUM,
_SG_BUFFERTYPE_FORCE_U32 = 0x7FFFFFFF
} sg_buffer_type;
@@ -1921,12 +2055,12 @@ typedef enum sg_cube_face {
sg_shader_stage
There are 2 shader stages: vertex- and fragment-shader-stage.
- Each shader stage consists of:
+ Each shader stage
- - one slot for a shader function (provided as source- or byte-code)
- - SG_MAX_SHADERSTAGE_UBS slots for uniform blocks
- - SG_MAX_SHADERSTAGE_IMAGES slots for images used as textures by
- the shader function
+ - SG_MAX_SHADERSTAGE_UBS slots for applying uniform data
+ - SG_MAX_SHADERSTAGE_IMAGES slots for images used as textures
+ - SG_MAX_SHADERSTAGE_SAMPLERS slots for texture samplers
+ - SG_MAX_SHADERSTAGE_STORAGEBUFFERS slots for storage buffer bindings
*/
typedef enum sg_shader_stage {
SG_SHADERSTAGE_VS,
@@ -2562,12 +2696,17 @@ typedef struct sg_pass {
- 0..1 index buffer offsets
- 0..N vertex shader stage images
- 0..N vertex shader stage samplers
+ - 0..N vertex shader storage buffers
- 0..N fragment shader stage images
- 0..N fragment shader stage samplers
+ - 0..N fragment shader storage buffers
- The max number of vertex buffer and shader stage images
- are defined by the SG_MAX_VERTEX_BUFFERS and
- SG_MAX_SHADERSTAGE_IMAGES configuration constants.
+ For the max number of bindings, see the constant definitions:
+
+ - SG_MAX_VERTEX_BUFFERS
+ - SG_MAX_SHADERSTAGE_IMAGES
+ - SG_MAX_SHADERSTAGE_SAMPLERS
+ - SG_MAX_SHADERSTAGE_STORAGEBUFFERS
The optional buffer offsets can be used to put different unrelated
chunks of vertex- and/or index-data into the same buffer objects.
@@ -2575,6 +2714,7 @@ typedef struct sg_pass {
typedef struct sg_stage_bindings {
sg_image images[SG_MAX_SHADERSTAGE_IMAGES];
sg_sampler samplers[SG_MAX_SHADERSTAGE_SAMPLERS];
+ sg_buffer storage_buffers[SG_MAX_SHADERSTAGE_STORAGEBUFFERS];
} sg_stage_bindings;
typedef struct sg_bindings {
@@ -2601,11 +2741,7 @@ typedef struct sg_bindings {
.usage: SG_USAGE_IMMUTABLE
.data.ptr 0 (*must* be valid for immutable buffers)
.data.size 0 (*must* be > 0 for immutable buffers)
- .label 0 (optional string label for trace hooks)
-
- The label will be ignored by sokol_gfx.h, it is only useful
- when hooking into sg_make_buffer() or sg_init_buffer() via
- the sg_install_trace_hooks() function.
+ .label 0 (optional string label)
For immutable buffers which are initialized with initial data,
keep the .size item zero-initialized, and set the size together with the
@@ -2818,6 +2954,9 @@ typedef struct sg_sampler_desc {
- the texture slot of the involved texture
- the sampler slot of the involved sampler
- for GLSL only: the name of the combined image-sampler object
+ - reflection info for each storage-buffer used by the shader:
+ - whether the storage buffer is readonly (currently this
+ must be true)
For all GL backends, shader source-code must be provided. For D3D11 and Metal,
either shader source-code or byte-code can be provided.
@@ -2846,6 +2985,11 @@ typedef struct sg_shader_uniform_block_desc {
sg_shader_uniform_desc uniforms[SG_MAX_UB_MEMBERS];
} sg_shader_uniform_block_desc;
+typedef struct sg_shader_storage_buffer_desc {
+ bool used;
+ bool readonly;
+} sg_shader_storage_buffer_desc;
+
typedef struct sg_shader_image_desc {
bool used;
bool multisampled;
@@ -2871,6 +3015,7 @@ typedef struct sg_shader_stage_desc {
const char* entry;
const char* d3d11_target;
sg_shader_uniform_block_desc uniform_blocks[SG_MAX_SHADERSTAGE_UBS];
+ sg_shader_storage_buffer_desc storage_buffers[SG_MAX_SHADERSTAGE_STORAGEBUFFERS];
sg_shader_image_desc images[SG_MAX_SHADERSTAGE_IMAGES];
sg_shader_sampler_desc samplers[SG_MAX_SHADERSTAGE_SAMPLERS];
sg_shader_image_sampler_pair_desc image_sampler_pairs[SG_MAX_SHADERSTAGE_IMAGESAMPLERPAIRS];
@@ -3214,9 +3359,9 @@ typedef struct sg_attachments_info {
/*
sg_frame_stats
- Allows to track generic and backend-specific tracking stats about a
+ Allows to track generic and backend-specific stats about a
render frame. Obtained by calling sg_query_frame_stats(). The returned
- struct will contains information about the *previous* frame.
+ struct contains information about the *previous* frame.
*/
typedef struct sg_frame_stats_gl {
uint32_t num_bind_buffer;
@@ -3301,6 +3446,7 @@ typedef struct sg_frame_stats_metal_bindings {
uint32_t num_set_vertex_buffer;
uint32_t num_set_vertex_texture;
uint32_t num_set_vertex_sampler_state;
+ uint32_t num_set_fragment_buffer;
uint32_t num_set_fragment_texture;
uint32_t num_set_fragment_sampler_state;
} sg_frame_stats_metal_bindings;
@@ -3390,6 +3536,7 @@ typedef struct sg_frame_stats {
_SG_LOGITEM_XMACRO(GL_FRAMEBUFFER_STATUS_INCOMPLETE_MULTISAMPLE, "framebuffer completeness check failed with GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE (gl)") \
_SG_LOGITEM_XMACRO(GL_FRAMEBUFFER_STATUS_UNKNOWN, "framebuffer completeness check failed (unknown reason) (gl)") \
_SG_LOGITEM_XMACRO(D3D11_CREATE_BUFFER_FAILED, "CreateBuffer() failed (d3d11)") \
+ _SG_LOGITEM_XMACRO(D3D11_CREATE_BUFFER_SRV_FAILED, "CreateShaderResourceView() failed for storage buffer (d3d11)") \
_SG_LOGITEM_XMACRO(D3D11_CREATE_DEPTH_TEXTURE_UNSUPPORTED_PIXEL_FORMAT, "pixel format not supported for depth-stencil texture (d3d11)") \
_SG_LOGITEM_XMACRO(D3D11_CREATE_DEPTH_TEXTURE_FAILED, "CreateTexture2D() failed for depth-stencil texture (d3d11)") \
_SG_LOGITEM_XMACRO(D3D11_CREATE_2D_TEXTURE_UNSUPPORTED_PIXEL_FORMAT, "pixel format not supported for 2d-, cube- or array-texture (d3d11)") \
@@ -3436,6 +3583,7 @@ typedef struct sg_frame_stats {
_SG_LOGITEM_XMACRO(WGPU_CREATE_SHADER_MODULE_FAILED, "wgpuDeviceCreateShaderModule() failed") \
_SG_LOGITEM_XMACRO(WGPU_SHADER_TOO_MANY_IMAGES, "shader uses too many sampled images on shader stage (wgpu)") \
_SG_LOGITEM_XMACRO(WGPU_SHADER_TOO_MANY_SAMPLERS, "shader uses too many samplers on shader stage (wgpu)") \
+ _SG_LOGITEM_XMACRO(WGPU_SHADER_TOO_MANY_STORAGEBUFFERS, "shader uses too many storage buffer bindings on shader stage (wgpu)") \
_SG_LOGITEM_XMACRO(WGPU_SHADER_CREATE_BINDGROUP_LAYOUT_FAILED, "wgpuDeviceCreateBindGroupLayout() for shader stage failed") \
_SG_LOGITEM_XMACRO(WGPU_CREATE_PIPELINE_LAYOUT_FAILED, "wgpuDeviceCreatePipelineLayout() failed") \
_SG_LOGITEM_XMACRO(WGPU_CREATE_RENDER_PIPELINE_FAILED, "wgpuDeviceCreateRenderPipeline() failed") \
@@ -3480,6 +3628,8 @@ typedef struct sg_frame_stats {
_SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_DATA, "immutable buffers must be initialized with data (sg_buffer_desc.data.ptr and sg_buffer_desc.data.size)") \
_SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_DATA_SIZE, "immutable buffer data size differs from buffer size") \
_SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_NO_DATA, "dynamic/stream usage buffers cannot be initialized with data") \
+ _SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_STORAGEBUFFER_SUPPORTED, "storage buffers not supported by the backend 3D API (requires OpenGL >= 4.3)") \
+ _SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_STORAGEBUFFER_SIZE_MULTIPLE_4, "size of storage buffers must be a multiple of 4") \
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDATA_NODATA, "sg_image_data: no data (.ptr and/or .size is zero)") \
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDATA_DATA_SIZE, "sg_image_data: data size doesn't match expected surface size") \
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDESC_CANARY, "sg_image_desc not initialized") \
@@ -3513,6 +3663,8 @@ typedef struct sg_frame_stats {
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_UB_SIZE_MISMATCH, "size of uniform block members doesn't match uniform block size") \
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_UB_ARRAY_COUNT, "uniform array count must be >= 1") \
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_UB_STD140_ARRAY_TYPE, "uniform arrays only allowed for FLOAT4, INT4, MAT4 in std140 layout") \
+ _SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_NO_CONT_STORAGEBUFFERS, "shader stage storage buffers must occupy continuous slots (sg_shader_desc.vs|fs.storage_buffers[])") \
+ _SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_STORAGEBUFFER_READONLY, "shader stage storage buffers must be readonly (sg_shader_desc.vs|fs.storage_buffers[].readonly)") \
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_NO_CONT_IMAGES, "shader stage images must occupy continuous slots (sg_shader_desc.vs|fs.images[])") \
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_NO_CONT_SAMPLERS, "shader stage samplers must occupy continuous slots (sg_shader_desc.vs|fs.samplers[])") \
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_IMAGE_SAMPLER_PAIR_IMAGE_SLOT_OUT_OF_RANGE, "shader stage: image-sampler-pair image slot index is out of range (sg_shader_desc.vs|fs.image_sampler_pairs[].image_slot)") \
@@ -3526,11 +3678,10 @@ typedef struct sg_frame_stats {
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_IMAGE_NOT_REFERENCED_BY_IMAGE_SAMPLER_PAIRS, "shader stage: one or more images are note referenced by (sg_shader_desc.vs|fs.image_sampler_pairs[].image_slot)") \
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_SAMPLER_NOT_REFERENCED_BY_IMAGE_SAMPLER_PAIRS, "shader stage: one or more samplers are not referenced by image-sampler-pairs (sg_shader_desc.vs|fs.image_sampler_pairs[].sampler_slot)") \
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_NO_CONT_IMAGE_SAMPLER_PAIRS, "shader stage image-sampler-pairs must occupy continuous slots (sg_shader_desc.vs|fs.image_samplers[])") \
- _SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_ATTR_SEMANTICS, "D3D11 backend requires vertex attribute semantics") \
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_ATTR_STRING_TOO_LONG, "vertex attribute name/semantic string too long (max len 16)") \
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_CANARY, "sg_pipeline_desc not initialized") \
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_SHADER, "sg_pipeline_desc.shader missing or invalid") \
- _SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_NO_ATTRS, "sg_pipeline_desc.layout.attrs is empty or not continuous") \
+ _SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_NO_CONT_ATTRS, "sg_pipeline_desc.layout.attrs is not continuous") \
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_LAYOUT_STRIDE4, "sg_pipeline_desc.layout.buffers[].stride must be multiple of 4") \
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_ATTR_SEMANTICS, "D3D11 missing vertex attribute semantics in shader") \
_SG_LOGITEM_XMACRO(VALIDATE_ATTACHMENTSDESC_CANARY, "sg_attachments_desc not initialized") \
@@ -3634,6 +3785,10 @@ typedef struct sg_frame_stats {
_SG_LOGITEM_XMACRO(VALIDATE_ABND_VS_EXPECTED_NONFILTERING_SAMPLER, "sg_apply_bindings: shader expected SG_SAMPLERTYPE_NONFILTERING on vertex stage, but sampler has SG_FILTER_LINEAR filters") \
_SG_LOGITEM_XMACRO(VALIDATE_ABND_VS_UNEXPECTED_SAMPLER_BINDING, "sg_apply_bindings: unexpected sampler binding on vertex stage") \
_SG_LOGITEM_XMACRO(VALIDATE_ABND_VS_SMP_EXISTS, "sg_apply_bindings: sampler bound to vertex stage no longer alive") \
+ _SG_LOGITEM_XMACRO(VALIDATE_ABND_VS_EXPECTED_STORAGEBUFFER_BINDING, "sg_apply_bindings: storage buffer binding on vertex stage is missing or the buffer handle is invalid") \
+ _SG_LOGITEM_XMACRO(VALIDATE_ABND_VS_STORAGEBUFFER_EXISTS, "sg_apply_bindings: storage buffer bound to vertex stage no longer alive") \
+ _SG_LOGITEM_XMACRO(VALIDATE_ABND_VS_STORAGEBUFFER_BINDING_BUFFERTYPE, "sg_apply_bindings: buffer bound to vertex stage storage buffer slot is not of type storage buffer") \
+ _SG_LOGITEM_XMACRO(VALIDATE_ABND_VS_UNEXPECTED_STORAGEBUFFER_BINDING, "sg_apply_bindings: unexpected storage buffer binding on vertex stage") \
_SG_LOGITEM_XMACRO(VALIDATE_ABND_FS_EXPECTED_IMAGE_BINDING, "sg_apply_bindings: image binding on fragment stage is missing or the image handle is invalid") \
_SG_LOGITEM_XMACRO(VALIDATE_ABND_FS_IMG_EXISTS, "sg_apply_bindings: image bound to fragment stage no longer alive") \
_SG_LOGITEM_XMACRO(VALIDATE_ABND_FS_IMAGE_TYPE_MISMATCH, "sg_apply_bindings: type of image bound to fragment stage doesn't match shader desc") \
@@ -3647,6 +3802,10 @@ typedef struct sg_frame_stats {
_SG_LOGITEM_XMACRO(VALIDATE_ABND_FS_EXPECTED_NONFILTERING_SAMPLER, "sg_apply_bindings: shader expected SG_SAMPLERTYPE_NONFILTERING on fragment stage, but sampler has SG_FILTER_LINEAR filters") \
_SG_LOGITEM_XMACRO(VALIDATE_ABND_FS_UNEXPECTED_SAMPLER_BINDING, "sg_apply_bindings: unexpected sampler binding on fragment stage") \
_SG_LOGITEM_XMACRO(VALIDATE_ABND_FS_SMP_EXISTS, "sg_apply_bindings: sampler bound to fragment stage no longer alive") \
+ _SG_LOGITEM_XMACRO(VALIDATE_ABND_FS_EXPECTED_STORAGEBUFFER_BINDING, "sg_apply_bindings: storage buffer binding on fragment stage is missing or the buffer handle is invalid") \
+ _SG_LOGITEM_XMACRO(VALIDATE_ABND_FS_STORAGEBUFFER_EXISTS, "sg_apply_bindings: storage buffer bound to fragment stage no longer alive") \
+ _SG_LOGITEM_XMACRO(VALIDATE_ABND_FS_STORAGEBUFFER_BINDING_BUFFERTYPE, "sg_apply_bindings: buffer bound to frahment stage storage buffer slot is not of type storage buffer") \
+ _SG_LOGITEM_XMACRO(VALIDATE_ABND_FS_UNEXPECTED_STORAGEBUFFER_BINDING, "sg_apply_bindings: unexpected storage buffer binding on fragment stage") \
_SG_LOGITEM_XMACRO(VALIDATE_AUB_NO_PIPELINE, "sg_apply_uniforms: must be called after sg_apply_pipeline()") \
_SG_LOGITEM_XMACRO(VALIDATE_AUB_NO_UB_AT_SLOT, "sg_apply_uniforms: no uniform block declaration at this shader stage UB slot") \
_SG_LOGITEM_XMACRO(VALIDATE_AUB_SIZE, "sg_apply_uniforms: data size doesn't match declared uniform block size") \
@@ -3673,11 +3832,6 @@ typedef enum sg_log_item {
The sg_desc struct contains configuration values for sokol_gfx,
it is used as parameter to the sg_setup() call.
- NOTE that all callback function pointers come in two versions, one without
- a userdata pointer, and one with a userdata pointer. You would
- either initialize one or the other depending on whether you pass data
- to your callbacks.
-
The default configuration is:
.buffer_pool_size 128
@@ -3771,7 +3925,7 @@ typedef struct sg_d3d11_environment {
} sg_d3d11_environment;
typedef struct sg_wgpu_environment {
- const void* device; // WGPUDevice
+ const void* device;
} sg_wgpu_environment;
typedef struct sg_environment {
@@ -3816,8 +3970,9 @@ typedef struct sg_allocator {
that without logging function, sokol-gfx will be completely
silent, e.g. it will not report errors, warnings and
validation layer messages. For maximum error verbosity,
- compile in debug mode (e.g. NDEBUG *not* defined) and install
- a logger (for instance the standard logging function from sokol_log.h).
+ compile in debug mode (e.g. NDEBUG *not* defined) and provide a
+ compatible logger function in the sg_setup() call
+ (for instance the standard logging function from sokol_log.h).
*/
typedef struct sg_logger {
void (*func)(
@@ -4202,8 +4357,8 @@ inline int sg_append_buffer(sg_buffer buf_id, const sg_range& data) { return sg_
#ifdef SOKOL_GFX_IMPL
#define SOKOL_GFX_IMPL_INCLUDED (1)
-#if !(defined(SOKOL_GLCORE33)||defined(SOKOL_GLES3)||defined(SOKOL_D3D11)||defined(SOKOL_METAL)||defined(SOKOL_WGPU)||defined(SOKOL_DUMMY_BACKEND))
-#error "Please select a backend with SOKOL_GLCORE33, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND"
+#if !(defined(SOKOL_GLCORE)||defined(SOKOL_GLES3)||defined(SOKOL_D3D11)||defined(SOKOL_METAL)||defined(SOKOL_WGPU)||defined(SOKOL_DUMMY_BACKEND))
+#error "Please select a backend with SOKOL_GLCORE, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND"
#endif
#if defined(SOKOL_MALLOC) || defined(SOKOL_CALLOC) || defined(SOKOL_FREE)
#error "SOKOL_MALLOC/CALLOC/FREE macros are no longer supported, please use sg_desc.allocator to override memory allocation functions"
@@ -4320,13 +4475,13 @@ inline int sg_append_buffer(sg_buffer buf_id, const sg_range& data) { return sg_
#if defined(__EMSCRIPTEN__)
#include <emscripten/emscripten.h>
#endif
-#elif defined(SOKOL_GLCORE33) || defined(SOKOL_GLES3)
+#elif defined(SOKOL_GLCORE) || defined(SOKOL_GLES3)
#define _SOKOL_ANY_GL (1)
// include platform specific GL headers (or on Win32: use an embedded GL loader)
#if !defined(SOKOL_EXTERNAL_GL_LOADER)
#if defined(_WIN32)
- #if defined(SOKOL_GLCORE33) && !defined(SOKOL_EXTERNAL_GL_LOADER)
+ #if defined(SOKOL_GLCORE) && !defined(SOKOL_EXTERNAL_GL_LOADER)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
@@ -4353,7 +4508,7 @@ inline int sg_append_buffer(sg_buffer buf_id, const sg_range& data) { return sg_
#include <GLES3/gl3.h>
#endif
#elif defined(__linux__) || defined(__unix__)
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#else
@@ -4610,6 +4765,8 @@ inline int sg_append_buffer(sg_buffer buf_id, const sg_range& data) { return sg_
#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+ #define GL_MAJOR_VERSION 0x821B
+ #define GL_MINOR_VERSION 0x821C
#endif
#ifndef GL_UNSIGNED_INT_2_10_10_10_REV
@@ -4725,6 +4882,12 @@ inline int sg_append_buffer(sg_buffer buf_id, const sg_range& data) { return sg_
#endif
#endif
+// make some GL constants generally available to simplify compilation,
+// use of those constants will be filtered by runtime flags
+#ifndef GL_SHADER_STORAGE_BUFFER
+#define GL_SHADER_STORAGE_BUFFER 0x90D2
+#endif
+
// ███████ ████████ ██████ ██ ██ ██████ ████████ ███████
// ██ ██ ██ ██ ██ ██ ██ ██ ██
// ███████ ██ ██████ ██ ██ ██ ██ ███████
@@ -4877,6 +5040,11 @@ typedef struct {
} _sg_shader_uniform_block_t;
typedef struct {
+ bool used;
+ bool readonly;
+} _sg_shader_storage_buffer_t;
+
+typedef struct {
sg_image_type image_type;
sg_image_sample_type sample_type;
bool multisampled;
@@ -4894,10 +5062,12 @@ typedef struct {
typedef struct {
int num_uniform_blocks;
+ int num_storage_buffers;
int num_images;
int num_samplers;
int num_image_samplers;
_sg_shader_uniform_block_t uniform_blocks[SG_MAX_SHADERSTAGE_UBS];
+ _sg_shader_storage_buffer_t storage_buffers[SG_MAX_SHADERSTAGE_STORAGEBUFFERS];
_sg_shader_image_t images[SG_MAX_SHADERSTAGE_IMAGES];
_sg_shader_sampler_t samplers[SG_MAX_SHADERSTAGE_SAMPLERS];
_sg_shader_image_sampler_t image_samplers[SG_MAX_SHADERSTAGE_IMAGESAMPLERPAIRS];
@@ -4952,6 +5122,16 @@ _SOKOL_PRIVATE void _sg_shader_common_init(_sg_shader_common_t* cmn, const sg_sh
stage->image_samplers[img_smp_index].sampler_slot = img_smp_desc->sampler_slot;
stage->num_image_samplers++;
}
+ SOKOL_ASSERT(stage->num_storage_buffers == 0);
+ for (int sbuf_index = 0; sbuf_index < SG_MAX_SHADERSTAGE_STORAGEBUFFERS; sbuf_index++) {
+ const sg_shader_storage_buffer_desc* sbuf_desc = &stage_desc->storage_buffers[sbuf_index];
+ if (!sbuf_desc->used) {
+ break;
+ }
+ stage->storage_buffers[sbuf_index].used = sbuf_desc->used;
+ stage->storage_buffers[sbuf_index].readonly = sbuf_desc->readonly;
+ stage->num_storage_buffers++;
+ }
}
}
@@ -5081,6 +5261,10 @@ typedef struct {
typedef _sg_dummy_attachments_t _sg_attachments_t;
#elif defined(_SOKOL_ANY_GL)
+
+#define _SG_GL_TEXTURE_SAMPLER_CACHE_SIZE (SG_MAX_SHADERSTAGE_IMAGESAMPLERPAIRS * SG_NUM_SHADER_STAGES)
+#define _SG_GL_STORAGEBUFFER_STAGE_INDEX_PITCH (SG_MAX_SHADERSTAGE_STORAGEBUFFERS)
+
typedef struct {
_sg_slot_t slot;
_sg_buffer_common_t cmn;
@@ -5206,8 +5390,6 @@ typedef struct {
GLuint sampler;
} _sg_gl_cache_texture_sampler_bind_slot;
-#define _SG_GL_TEXTURE_SAMPLER_CACHE_SIZE (SG_MAX_SHADERSTAGE_IMAGESAMPLERPAIRS * SG_NUM_SHADER_STAGES)
-
typedef struct {
sg_depth_state depth;
sg_stencil_state stencil;
@@ -5222,8 +5404,11 @@ typedef struct {
_sg_gl_cache_attr_t attrs[SG_MAX_VERTEX_ATTRIBUTES];
GLuint vertex_buffer;
GLuint index_buffer;
+ GLuint storage_buffer; // general bind point
+ GLuint stage_storage_buffers[SG_NUM_SHADER_STAGES][SG_MAX_SHADERSTAGE_STORAGEBUFFERS];
GLuint stored_vertex_buffer;
GLuint stored_index_buffer;
+ GLuint stored_storage_buffer;
GLuint prog;
_sg_gl_cache_texture_sampler_bind_slot texture_samplers[_SG_GL_TEXTURE_SAMPLER_CACHE_SIZE];
_sg_gl_cache_texture_sampler_bind_slot stored_texture_sampler;
@@ -5256,6 +5441,7 @@ typedef struct {
_sg_buffer_common_t cmn;
struct {
ID3D11Buffer* buf;
+ ID3D11ShaderResourceView* srv;
} d3d11;
} _sg_d3d11_buffer_t;
typedef _sg_d3d11_buffer_t _sg_buffer_t;
@@ -5471,6 +5657,8 @@ typedef struct {
sg_image cur_fs_image_ids[SG_MAX_SHADERSTAGE_IMAGES];
sg_sampler cur_vs_sampler_ids[SG_MAX_SHADERSTAGE_SAMPLERS];
sg_sampler cur_fs_sampler_ids[SG_MAX_SHADERSTAGE_SAMPLERS];
+ sg_buffer cur_vs_storagebuffer_ids[SG_MAX_SHADERSTAGE_STORAGEBUFFERS];
+ sg_buffer cur_fs_storagebuffer_ids[SG_MAX_SHADERSTAGE_STORAGEBUFFERS];
} _sg_mtl_state_cache_t;
typedef struct {
@@ -5498,6 +5686,7 @@ typedef struct {
#define _SG_WGPU_NUM_BINDGROUPS (2) // 0: uniforms, 1: images and sampler on both shader stages
#define _SG_WGPU_UNIFORM_BINDGROUP_INDEX (0)
#define _SG_WGPU_IMAGE_SAMPLER_BINDGROUP_INDEX (1)
+#define _SG_WGPU_MAX_BINDGROUP_ENTRIES (SG_NUM_SHADER_STAGES * (SG_MAX_SHADERSTAGE_IMAGES + SG_MAX_SHADERSTAGE_SAMPLERS + SG_MAX_SHADERSTAGE_STORAGEBUFFERS))
typedef struct {
_sg_slot_t slot;
@@ -5586,7 +5775,7 @@ typedef struct {
uint32_t id;
} _sg_wgpu_bindgroup_handle_t;
-#define _SG_WGPU_BINDGROUPSCACHE_NUM_ITEMS (1 + SG_NUM_SHADER_STAGES * (SG_MAX_SHADERSTAGE_IMAGES + SG_MAX_SHADERSTAGE_SAMPLERS))
+#define _SG_WGPU_BINDGROUPSCACHE_NUM_ITEMS (1 + _SG_WGPU_MAX_BINDGROUP_ENTRIES)
typedef struct {
uint64_t hash;
uint32_t items[_SG_WGPU_BINDGROUPSCACHE_NUM_ITEMS];
@@ -5672,16 +5861,20 @@ typedef struct {
int num_vbs;
int num_vs_imgs;
int num_vs_smps;
+ int num_vs_sbufs;
int num_fs_imgs;
int num_fs_smps;
+ int num_fs_sbufs;
int vb_offsets[SG_MAX_VERTEX_BUFFERS];
int ib_offset;
_sg_buffer_t* vbs[SG_MAX_VERTEX_BUFFERS];
_sg_buffer_t* ib;
_sg_image_t* vs_imgs[SG_MAX_SHADERSTAGE_IMAGES];
_sg_sampler_t* vs_smps[SG_MAX_SHADERSTAGE_SAMPLERS];
+ _sg_buffer_t* vs_sbufs[SG_MAX_SHADERSTAGE_STORAGEBUFFERS];
_sg_image_t* fs_imgs[SG_MAX_SHADERSTAGE_IMAGES];
_sg_sampler_t* fs_smps[SG_MAX_SHADERSTAGE_SAMPLERS];
+ _sg_buffer_t* fs_sbufs[SG_MAX_SHADERSTAGE_STORAGEBUFFERS];
} _sg_bindings_t;
typedef struct {
@@ -5711,7 +5904,6 @@ typedef struct {
} swapchain;
} cur_pass;
sg_pipeline cur_pipeline;
- bool apply_bindings_called;
bool next_draw_valid;
#if defined(SOKOL_DEBUG)
sg_log_item validate_error;
@@ -6700,7 +6892,8 @@ _SOKOL_PRIVATE void _sg_dummy_update_image(_sg_image_t* img, const sg_image_data
_SG_XMACRO(glSamplerParameteri, void, (GLuint sampler, GLenum pname, GLint param)) \
_SG_XMACRO(glSamplerParameterf, void, (GLuint sampler, GLenum pname, GLfloat param)) \
_SG_XMACRO(glSamplerParameterfv, void, (GLuint sampler, GLenum pname, const GLfloat* params)) \
- _SG_XMACRO(glDeleteSamplers, void, (GLsizei n, const GLuint* samplers))
+ _SG_XMACRO(glDeleteSamplers, void, (GLsizei n, const GLuint* samplers)) \
+ _SG_XMACRO(glBindBufferBase, void, (GLenum target, GLuint index, GLuint buffer))
// generate GL function pointer typedefs
#define _SG_XMACRO(name, ret, args) typedef ret (GL_APIENTRY* PFN_ ## name) args;
@@ -6747,6 +6940,7 @@ _SOKOL_PRIVATE GLenum _sg_gl_buffer_target(sg_buffer_type t) {
switch (t) {
case SG_BUFFERTYPE_VERTEXBUFFER: return GL_ARRAY_BUFFER;
case SG_BUFFERTYPE_INDEXBUFFER: return GL_ELEMENT_ARRAY_BUFFER;
+ case SG_BUFFERTYPE_STORAGEBUFFER: return GL_SHADER_STORAGE_BUFFER;
default: SOKOL_UNREACHABLE; return 0;
}
}
@@ -6956,7 +7150,7 @@ _SOKOL_PRIVATE GLenum _sg_gl_mag_filter(sg_filter mag_f) {
_SOKOL_PRIVATE GLenum _sg_gl_wrap(sg_wrap w) {
switch (w) {
case SG_WRAP_CLAMP_TO_EDGE: return GL_CLAMP_TO_EDGE;
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
case SG_WRAP_CLAMP_TO_BORDER: return GL_CLAMP_TO_BORDER;
#else
case SG_WRAP_CLAMP_TO_BORDER: return GL_CLAMP_TO_EDGE;
@@ -7401,14 +7595,20 @@ _SOKOL_PRIVATE void _sg_gl_init_limits(void) {
_sg.limits.gl_max_combined_texture_image_units = gl_int;
}
-#if defined(SOKOL_GLCORE33)
-_SOKOL_PRIVATE void _sg_gl_init_caps_glcore33(void) {
- _sg.backend = SG_BACKEND_GLCORE33;
+#if defined(SOKOL_GLCORE)
+_SOKOL_PRIVATE void _sg_gl_init_caps_glcore(void) {
+ _sg.backend = SG_BACKEND_GLCORE;
+ GLint major_version = 0;
+ GLint minor_version = 0;
+ glGetIntegerv(GL_MAJOR_VERSION, &major_version);
+ glGetIntegerv(GL_MINOR_VERSION, &minor_version);
+ const int version = major_version * 100 + minor_version * 10;
_sg.features.origin_top_left = false;
_sg.features.image_clamp_to_border = true;
_sg.features.mrt_independent_blend_state = false;
_sg.features.mrt_independent_write_mask = true;
+ _sg.features.storage_buffer = version >= 430;
// scan extensions
bool has_s3tc = false; // BC1..BC3
@@ -7481,6 +7681,7 @@ _SOKOL_PRIVATE void _sg_gl_init_caps_gles3(void) {
_sg.features.image_clamp_to_border = false;
_sg.features.mrt_independent_blend_state = false;
_sg.features.mrt_independent_write_mask = false;
+ _sg.features.storage_buffer = false;
bool has_s3tc = false; // BC1..BC3
bool has_rgtc = false; // BC4 and BC5
@@ -7570,6 +7771,12 @@ _SOKOL_PRIVATE void _sg_gl_init_caps_gles3(void) {
#endif
//-- state cache implementation ------------------------------------------------
+_SOKOL_PRIVATE GLuint _sg_gl_storagebuffer_bind_index(int stage, int slot) {
+ SOKOL_ASSERT((stage >= 0) && (stage < SG_NUM_SHADER_STAGES));
+ SOKOL_ASSERT((slot >= 0) && (slot < SG_MAX_SHADERSTAGE_STORAGEBUFFERS));
+ return (GLuint) (stage * _SG_GL_STORAGEBUFFER_STAGE_INDEX_PITCH + slot);
+}
+
_SOKOL_PRIVATE void _sg_gl_cache_clear_buffer_bindings(bool force) {
if (force || (_sg.gl.cache.vertex_buffer != 0)) {
glBindBuffer(GL_ARRAY_BUFFER, 0);
@@ -7581,30 +7788,77 @@ _SOKOL_PRIVATE void _sg_gl_cache_clear_buffer_bindings(bool force) {
_sg.gl.cache.index_buffer = 0;
_sg_stats_add(gl.num_bind_buffer, 1);
}
+ if (force || (_sg.gl.cache.storage_buffer != 0)) {
+ if (_sg.features.storage_buffer) {
+ glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
+ }
+ _sg.gl.cache.storage_buffer = 0;
+ _sg_stats_add(gl.num_bind_buffer, 1);
+ }
+ for (int stage = 0; stage < SG_NUM_SHADER_STAGES; stage++) {
+ for (int i = 0; i < SG_MAX_SHADERSTAGE_STORAGEBUFFERS; i++) {
+ if (force || (_sg.gl.cache.stage_storage_buffers[stage][i] != 0)) {
+ const GLuint bind_index = _sg_gl_storagebuffer_bind_index(stage, i);
+ if (_sg.features.storage_buffer) {
+ glBindBufferBase(GL_SHADER_STORAGE_BUFFER, bind_index, 0);
+ }
+ _sg.gl.cache.stage_storage_buffers[stage][i] = 0;
+ _sg_stats_add(gl.num_bind_buffer, 1);
+ }
+ }
+ }
}
_SOKOL_PRIVATE void _sg_gl_cache_bind_buffer(GLenum target, GLuint buffer) {
- SOKOL_ASSERT((GL_ARRAY_BUFFER == target) || (GL_ELEMENT_ARRAY_BUFFER == target));
+ SOKOL_ASSERT((GL_ARRAY_BUFFER == target) || (GL_ELEMENT_ARRAY_BUFFER == target) || (GL_SHADER_STORAGE_BUFFER == target));
if (target == GL_ARRAY_BUFFER) {
if (_sg.gl.cache.vertex_buffer != buffer) {
_sg.gl.cache.vertex_buffer = buffer;
glBindBuffer(target, buffer);
_sg_stats_add(gl.num_bind_buffer, 1);
}
- } else {
+ } else if (target == GL_ELEMENT_ARRAY_BUFFER) {
if (_sg.gl.cache.index_buffer != buffer) {
_sg.gl.cache.index_buffer = buffer;
glBindBuffer(target, buffer);
_sg_stats_add(gl.num_bind_buffer, 1);
}
+ } else if (target == GL_SHADER_STORAGE_BUFFER) {
+ if (_sg.gl.cache.storage_buffer != buffer) {
+ _sg.gl.cache.storage_buffer = buffer;
+ if (_sg.features.storage_buffer) {
+ glBindBuffer(target, buffer);
+ }
+ _sg_stats_add(gl.num_bind_buffer, 1);
+ }
+ } else {
+ SOKOL_UNREACHABLE;
+ }
+}
+
+_SOKOL_PRIVATE void _sg_gl_cache_bind_storage_buffer(int stage, int slot, GLuint buffer) {
+ SOKOL_ASSERT((stage >= 0) && (stage < SG_NUM_SHADER_STAGES));
+ SOKOL_ASSERT((slot >= 0) && (slot < SG_MAX_SHADERSTAGE_STORAGEBUFFERS));
+ if (_sg.gl.cache.stage_storage_buffers[stage][slot] != buffer) {
+ _sg.gl.cache.stage_storage_buffers[stage][slot] = buffer;
+ _sg.gl.cache.storage_buffer = buffer; // not a bug
+ GLuint bind_index = _sg_gl_storagebuffer_bind_index(stage, slot);
+ if (_sg.features.storage_buffer) {
+ glBindBufferBase(GL_SHADER_STORAGE_BUFFER, bind_index, buffer);
+ }
+ _sg_stats_add(gl.num_bind_buffer, 1);
}
}
_SOKOL_PRIVATE void _sg_gl_cache_store_buffer_binding(GLenum target) {
if (target == GL_ARRAY_BUFFER) {
_sg.gl.cache.stored_vertex_buffer = _sg.gl.cache.vertex_buffer;
- } else {
+ } else if (target == GL_ELEMENT_ARRAY_BUFFER) {
_sg.gl.cache.stored_index_buffer = _sg.gl.cache.index_buffer;
+ } else if (target == GL_SHADER_STORAGE_BUFFER) {
+ _sg.gl.cache.stored_storage_buffer = _sg.gl.cache.storage_buffer;
+ } else {
+ SOKOL_UNREACHABLE;
}
}
@@ -7615,12 +7869,20 @@ _SOKOL_PRIVATE void _sg_gl_cache_restore_buffer_binding(GLenum target) {
_sg_gl_cache_bind_buffer(target, _sg.gl.cache.stored_vertex_buffer);
_sg.gl.cache.stored_vertex_buffer = 0;
}
- } else {
+ } else if (target == GL_ELEMENT_ARRAY_BUFFER) {
if (_sg.gl.cache.stored_index_buffer != 0) {
// we only care about restoring valid ids
_sg_gl_cache_bind_buffer(target, _sg.gl.cache.stored_index_buffer);
_sg.gl.cache.stored_index_buffer = 0;
}
+ } else if (target == GL_SHADER_STORAGE_BUFFER) {
+ if (_sg.gl.cache.stored_storage_buffer != 0) {
+ // we only care about restoring valid ids
+ _sg_gl_cache_bind_buffer(target, _sg.gl.cache.stored_storage_buffer);
+ _sg.gl.cache.stored_storage_buffer = 0;
+ }
+ } else {
+ SOKOL_UNREACHABLE;
}
}
@@ -7636,12 +7898,31 @@ _SOKOL_PRIVATE void _sg_gl_cache_invalidate_buffer(GLuint buf) {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
_sg_stats_add(gl.num_bind_buffer, 1);
}
+ if (buf == _sg.gl.cache.storage_buffer) {
+ _sg.gl.cache.storage_buffer = 0;
+ glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
+ _sg_stats_add(gl.num_bind_buffer, 1);
+ }
+ for (int stage = 0; stage < SG_NUM_SHADER_STAGES; stage++) {
+ for (int i = 0; i < SG_MAX_SHADERSTAGE_STORAGEBUFFERS; i++) {
+ if (buf == _sg.gl.cache.stage_storage_buffers[stage][i]) {
+ _sg.gl.cache.stage_storage_buffers[stage][i] = 0;
+ _sg.gl.cache.storage_buffer = 0; // not a bug!
+ const GLuint bind_index = _sg_gl_storagebuffer_bind_index(stage, i);
+ glBindBufferBase(GL_SHADER_STORAGE_BUFFER, bind_index, 0);
+ _sg_stats_add(gl.num_bind_buffer, 1);
+ }
+ }
+ }
if (buf == _sg.gl.cache.stored_vertex_buffer) {
_sg.gl.cache.stored_vertex_buffer = 0;
}
if (buf == _sg.gl.cache.stored_index_buffer) {
_sg.gl.cache.stored_index_buffer = 0;
}
+ if (buf == _sg.gl.cache.stored_storage_buffer) {
+ _sg.gl.cache.stored_storage_buffer = 0;
+ }
for (int i = 0; i < SG_MAX_VERTEX_ATTRIBUTES; i++) {
if (buf == _sg.gl.cache.attrs[i].gl_vbuf) {
_sg.gl.cache.attrs[i].gl_vbuf = 0;
@@ -7851,7 +8132,7 @@ _SOKOL_PRIVATE void _sg_gl_reset_state_cache(void) {
glEnable(GL_DITHER);
glDisable(GL_POLYGON_OFFSET_FILL);
_sg_stats_add(gl.num_render_state, 10);
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
glEnable(GL_MULTISAMPLE);
glEnable(GL_PROGRAM_POINT_SIZE);
_sg_stats_add(gl.num_render_state, 2);
@@ -7872,8 +8153,8 @@ _SOKOL_PRIVATE void _sg_gl_setup_backend(const sg_desc* desc) {
#if defined(SOKOL_DEBUG)
while (glGetError() != GL_NO_ERROR);
#endif
- #if defined(SOKOL_GLCORE33)
- _sg_gl_init_caps_glcore33();
+ #if defined(SOKOL_GLCORE)
+ _sg_gl_init_caps_glcore();
#elif defined(SOKOL_GLES3)
_sg_gl_init_caps_gles3();
#endif
@@ -7883,7 +8164,7 @@ _SOKOL_PRIVATE void _sg_gl_setup_backend(const sg_desc* desc) {
_SG_GL_CHECK_ERROR();
// incoming texture data is generally expected to be packed tightly
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
// enable seamless cubemap sampling (only desktop GL)
glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
#endif
@@ -8074,7 +8355,7 @@ _SOKOL_PRIVATE sg_resource_state _sg_gl_create_sampler(_sg_sampler_t* smp, const
glSamplerParameteri(smp->gl.smp, GL_TEXTURE_WRAP_S, (GLint)_sg_gl_wrap(smp->cmn.wrap_u));
glSamplerParameteri(smp->gl.smp, GL_TEXTURE_WRAP_T, (GLint)_sg_gl_wrap(smp->cmn.wrap_v));
glSamplerParameteri(smp->gl.smp, GL_TEXTURE_WRAP_R, (GLint)_sg_gl_wrap(smp->cmn.wrap_w));
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
float border[4];
switch (smp->cmn.border_color) {
case SG_BORDERCOLOR_TRANSPARENT_BLACK:
@@ -8558,13 +8839,13 @@ _SOKOL_PRIVATE void _sg_gl_begin_pass(const sg_pass* pass) {
if (atts) {
// offscreen pass
SOKOL_ASSERT(atts->gl.fb);
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
glEnable(GL_FRAMEBUFFER_SRGB);
#endif
glBindFramebuffer(GL_FRAMEBUFFER, atts->gl.fb);
} else {
// default pass
- #if defined(SOKOL_GLCORE33)
+ #if defined(SOKOL_GLCORE)
glDisable(GL_FRAMEBUFFER_SRGB);
#endif
// NOTE: on some platforms, the default framebuffer of a context
@@ -8864,7 +9145,7 @@ _SOKOL_PRIVATE void _sg_gl_apply_pipeline(_sg_pipeline_t* pip) {
if (pip->gl.color_write_mask[i] != _sg.gl.cache.color_write_mask[i]) {
const sg_color_mask cm = pip->gl.color_write_mask[i];
_sg.gl.cache.color_write_mask[i] = cm;
- #ifdef SOKOL_GLCORE33
+ #ifdef SOKOL_GLCORE
glColorMaski(i,
(cm & SG_COLORMASK_R) != 0,
(cm & SG_COLORMASK_G) != 0,
@@ -8921,7 +9202,7 @@ _SOKOL_PRIVATE void _sg_gl_apply_pipeline(_sg_pipeline_t* pip) {
}
_sg_stats_add(gl.num_render_state, 1);
}
- #ifdef SOKOL_GLCORE33
+ #ifdef SOKOL_GLCORE
if (pip->gl.sample_count != _sg.gl.cache.sample_count) {
_sg.gl.cache.sample_count = pip->gl.sample_count;
if (pip->gl.sample_count > 1) {
@@ -8977,6 +9258,18 @@ _SOKOL_PRIVATE bool _sg_gl_apply_bindings(_sg_bindings_t* bnd) {
}
_SG_GL_CHECK_ERROR();
+ // bind storage buffers
+ for (int slot = 0; slot < bnd->num_vs_sbufs; slot++) {
+ _sg_buffer_t* sb = bnd->vs_sbufs[slot];
+ GLuint gl_sb = sb->gl.buf[sb->cmn.active_slot];
+ _sg_gl_cache_bind_storage_buffer(SG_SHADERSTAGE_VS, slot, gl_sb);
+ }
+ for (int slot = 0; slot < bnd->num_fs_sbufs; slot++) {
+ _sg_buffer_t* sb = bnd->fs_sbufs[slot];
+ GLuint gl_sb = sb->gl.buf[sb->cmn.active_slot];
+ _sg_gl_cache_bind_storage_buffer(SG_SHADERSTAGE_FS, slot, gl_sb);
+ }
+
// index buffer (can be 0)
const GLuint gl_ib = bnd->ib ? bnd->ib->gl.buf[bnd->ib->cmn.active_slot] : 0;
_sg_gl_cache_bind_buffer(GL_ELEMENT_ARRAY_BUFFER, gl_ib);
@@ -9092,19 +9385,20 @@ _SOKOL_PRIVATE void _sg_gl_draw(int base_element, int num_elements, int num_inst
SOKOL_ASSERT(_sg.gl.cache.cur_pipeline);
const GLenum i_type = _sg.gl.cache.cur_index_type;
const GLenum p_type = _sg.gl.cache.cur_primitive_type;
+ const bool use_instanced_draw = (num_instances > 1) || (_sg.gl.cache.cur_pipeline->cmn.use_instanced_draw);
if (0 != i_type) {
// indexed rendering
const int i_size = (i_type == GL_UNSIGNED_SHORT) ? 2 : 4;
const int ib_offset = _sg.gl.cache.cur_ib_offset;
const GLvoid* indices = (const GLvoid*)(GLintptr)(base_element*i_size+ib_offset);
- if (_sg.gl.cache.cur_pipeline->cmn.use_instanced_draw) {
+ if (use_instanced_draw) {
glDrawElementsInstanced(p_type, num_elements, i_type, indices, num_instances);
} else {
glDrawElements(p_type, num_elements, i_type, indices);
}
} else {
// non-indexed rendering
- if (_sg.gl.cache.cur_pipeline->cmn.use_instanced_draw) {
+ if (use_instanced_draw) {
glDrawArraysInstanced(p_type, base_element, num_elements, num_instances);
} else {
glDrawArrays(p_type, base_element, num_elements);
@@ -9210,6 +9504,10 @@ _SOKOL_PRIVATE void _sg_gl_update_image(_sg_image_t* img, const sg_image_data* d
// >>d3d11 backend
#elif defined(SOKOL_D3D11)
+#define _SG_D3D11_MAX_SHADERSTAGE_SRVS (32)
+#define _SG_D3D11_SHADERSTAGE_IMAGE_SRV_OFFSET (0)
+#define _SG_D3D11_SHADERSTAGE_BUFFER_SRV_OFFSET (16)
+
#if defined(__cplusplus)
#define _sg_d3d11_AddRef(self) (self)->AddRef()
#else
@@ -9628,6 +9926,34 @@ _SOKOL_PRIVATE D3D11_USAGE _sg_d3d11_usage(sg_usage usg) {
}
}
+_SOKOL_PRIVATE UINT _sg_d3d11_buffer_bind_flags(sg_buffer_type t) {
+ switch (t) {
+ case SG_BUFFERTYPE_VERTEXBUFFER:
+ return D3D11_BIND_VERTEX_BUFFER;
+ case SG_BUFFERTYPE_INDEXBUFFER:
+ return D3D11_BIND_INDEX_BUFFER;
+ case SG_BUFFERTYPE_STORAGEBUFFER:
+ // FIXME: for compute shaders we'd want UNORDERED_ACCESS?
+ return D3D11_BIND_SHADER_RESOURCE;
+ default:
+ SOKOL_UNREACHABLE;
+ return 0;
+ }
+}
+
+_SOKOL_PRIVATE UINT _sg_d3d11_buffer_misc_flags(sg_buffer_type t) {
+ switch (t) {
+ case SG_BUFFERTYPE_VERTEXBUFFER:
+ case SG_BUFFERTYPE_INDEXBUFFER:
+ return 0;
+ case SG_BUFFERTYPE_STORAGEBUFFER:
+ return D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS;
+ default:
+ SOKOL_UNREACHABLE;
+ return 0;
+ }
+}
+
_SOKOL_PRIVATE UINT _sg_d3d11_cpu_access_flags(sg_usage usg) {
switch (usg) {
case SG_USAGE_IMMUTABLE:
@@ -9936,6 +10262,7 @@ _SOKOL_PRIVATE void _sg_d3d11_init_caps(void) {
_sg.features.image_clamp_to_border = true;
_sg.features.mrt_independent_blend_state = true;
_sg.features.mrt_independent_write_mask = true;
+ _sg.features.storage_buffer = true;
_sg.limits.max_image_size_2d = 16 * 1024;
_sg.limits.max_image_size_cube = 16 * 1024;
@@ -9994,13 +10321,15 @@ _SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_buffer(_sg_buffer_t* buf, cons
if (injected) {
buf->d3d11.buf = (ID3D11Buffer*) desc->d3d11_buffer;
_sg_d3d11_AddRef(buf->d3d11.buf);
+ // FIXME: for storage buffers also need to inject resource view
} else {
- D3D11_BUFFER_DESC d3d11_desc;
- _sg_clear(&d3d11_desc, sizeof(d3d11_desc));
- d3d11_desc.ByteWidth = (UINT)buf->cmn.size;
- d3d11_desc.Usage = _sg_d3d11_usage(buf->cmn.usage);
- d3d11_desc.BindFlags = buf->cmn.type == SG_BUFFERTYPE_VERTEXBUFFER ? D3D11_BIND_VERTEX_BUFFER : D3D11_BIND_INDEX_BUFFER;
- d3d11_desc.CPUAccessFlags = _sg_d3d11_cpu_access_flags(buf->cmn.usage);
+ D3D11_BUFFER_DESC d3d11_buf_desc;
+ _sg_clear(&d3d11_buf_desc, sizeof(d3d11_buf_desc));
+ d3d11_buf_desc.ByteWidth = (UINT)buf->cmn.size;
+ d3d11_buf_desc.Usage = _sg_d3d11_usage(buf->cmn.usage);
+ d3d11_buf_desc.BindFlags = _sg_d3d11_buffer_bind_flags(buf->cmn.type);
+ d3d11_buf_desc.CPUAccessFlags = _sg_d3d11_cpu_access_flags(buf->cmn.usage);
+ d3d11_buf_desc.MiscFlags = _sg_d3d11_buffer_misc_flags(buf->cmn.type);
D3D11_SUBRESOURCE_DATA* init_data_ptr = 0;
D3D11_SUBRESOURCE_DATA init_data;
_sg_clear(&init_data, sizeof(init_data));
@@ -10009,11 +10338,30 @@ _SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_buffer(_sg_buffer_t* buf, cons
init_data.pSysMem = desc->data.ptr;
init_data_ptr = &init_data;
}
- HRESULT hr = _sg_d3d11_CreateBuffer(_sg.d3d11.dev, &d3d11_desc, init_data_ptr, &buf->d3d11.buf);
+ HRESULT hr = _sg_d3d11_CreateBuffer(_sg.d3d11.dev, &d3d11_buf_desc, init_data_ptr, &buf->d3d11.buf);
if (!(SUCCEEDED(hr) && buf->d3d11.buf)) {
_SG_ERROR(D3D11_CREATE_BUFFER_FAILED);
return SG_RESOURCESTATE_FAILED;
}
+
+ // for storage buffers need to create a view object
+ if (buf->cmn.type == SG_BUFFERTYPE_STORAGEBUFFER) {
+ // FIXME: currently only shader-resource-view, in future also UAV
+ // storage buffer size must be multiple of 4
+ SOKOL_ASSERT(_sg_multiple_u64(buf->cmn.size, 4));
+ D3D11_SHADER_RESOURCE_VIEW_DESC d3d11_srv_desc;
+ _sg_clear(&d3d11_srv_desc, sizeof(d3d11_srv_desc));
+ d3d11_srv_desc.Format = DXGI_FORMAT_R32_TYPELESS;
+ d3d11_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;
+ d3d11_srv_desc.BufferEx.FirstElement = 0;
+ d3d11_srv_desc.BufferEx.NumElements = buf->cmn.size / 4;
+ d3d11_srv_desc.BufferEx.Flags = D3D11_BUFFEREX_SRV_FLAG_RAW;
+ hr = _sg_d3d11_CreateShaderResourceView(_sg.d3d11.dev, (ID3D11Resource*)buf->d3d11.buf, &d3d11_srv_desc, &buf->d3d11.srv);
+ if (!(SUCCEEDED(hr) && buf->d3d11.srv)) {
+ _SG_ERROR(D3D11_CREATE_BUFFER_SRV_FAILED);
+ return SG_RESOURCESTATE_FAILED;
+ }
+ }
_sg_d3d11_setlabel(buf->d3d11.buf, desc->label);
}
return SG_RESOURCESTATE_VALID;
@@ -10024,6 +10372,9 @@ _SOKOL_PRIVATE void _sg_d3d11_discard_buffer(_sg_buffer_t* buf) {
if (buf->d3d11.buf) {
_sg_d3d11_Release(buf->d3d11.buf);
}
+ if (buf->d3d11.srv) {
+ _sg_d3d11_Release(buf->d3d11.srv);
+ }
}
_SOKOL_PRIVATE void _sg_d3d11_fill_subres_data(const _sg_image_t* img, const sg_image_data* data) {
@@ -10488,17 +10839,19 @@ _SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_pipeline(_sg_pipeline_t* pip,
pip->d3d11.vb_strides[layout_index] = 0;
}
}
- hr = _sg_d3d11_CreateInputLayout(_sg.d3d11.dev,
- d3d11_comps, // pInputElementDesc
- (UINT)attr_index, // NumElements
- shd->d3d11.vs_blob, // pShaderByteCodeWithInputSignature
- shd->d3d11.vs_blob_length, // BytecodeLength
- &pip->d3d11.il);
- if (!(SUCCEEDED(hr) && pip->d3d11.il)) {
- _SG_ERROR(D3D11_CREATE_INPUT_LAYOUT_FAILED);
- return SG_RESOURCESTATE_FAILED;
+ if (attr_index > 0) {
+ hr = _sg_d3d11_CreateInputLayout(_sg.d3d11.dev,
+ d3d11_comps, // pInputElementDesc
+ (UINT)attr_index, // NumElements
+ shd->d3d11.vs_blob, // pShaderByteCodeWithInputSignature
+ shd->d3d11.vs_blob_length, // BytecodeLength
+ &pip->d3d11.il);
+ if (!(SUCCEEDED(hr) && pip->d3d11.il)) {
+ _SG_ERROR(D3D11_CREATE_INPUT_LAYOUT_FAILED);
+ return SG_RESOURCESTATE_FAILED;
+ }
+ _sg_d3d11_setlabel(pip->d3d11.il, desc->label);
}
- _sg_d3d11_setlabel(pip->d3d11.il, desc->label);
// create rasterizer state
D3D11_RASTERIZER_DESC rs_desc;
@@ -10901,7 +11254,7 @@ _SOKOL_PRIVATE void _sg_d3d11_apply_pipeline(_sg_pipeline_t* pip) {
SOKOL_ASSERT(pip);
SOKOL_ASSERT(pip->shader && (pip->cmn.shader_id.id == pip->shader->slot.id));
SOKOL_ASSERT(_sg.d3d11.ctx);
- SOKOL_ASSERT(pip->d3d11.rs && pip->d3d11.bs && pip->d3d11.dss && pip->d3d11.il);
+ SOKOL_ASSERT(pip->d3d11.rs && pip->d3d11.bs && pip->d3d11.dss);
_sg.d3d11.cur_pipeline = pip;
_sg.d3d11.cur_pipeline_id.id = pip->slot.id;
@@ -10937,8 +11290,8 @@ _SOKOL_PRIVATE bool _sg_d3d11_apply_bindings(_sg_bindings_t* bnd) {
ID3D11Buffer* d3d11_ib = bnd->ib ? bnd->ib->d3d11.buf : 0;
ID3D11Buffer* d3d11_vbs[SG_MAX_VERTEX_BUFFERS] = {0};
UINT d3d11_vb_offsets[SG_MAX_VERTEX_BUFFERS] = {0};
- ID3D11ShaderResourceView* d3d11_vs_srvs[SG_MAX_SHADERSTAGE_IMAGES] = {0};
- ID3D11ShaderResourceView* d3d11_fs_srvs[SG_MAX_SHADERSTAGE_IMAGES] = {0};
+ ID3D11ShaderResourceView* d3d11_vs_srvs[_SG_D3D11_MAX_SHADERSTAGE_SRVS] = {0};
+ ID3D11ShaderResourceView* d3d11_fs_srvs[_SG_D3D11_MAX_SHADERSTAGE_SRVS] = {0};
ID3D11SamplerState* d3d11_vs_smps[SG_MAX_SHADERSTAGE_SAMPLERS] = {0};
ID3D11SamplerState* d3d11_fs_smps[SG_MAX_SHADERSTAGE_SAMPLERS] = {0};
for (int i = 0; i < bnd->num_vbs; i++) {
@@ -10948,11 +11301,19 @@ _SOKOL_PRIVATE bool _sg_d3d11_apply_bindings(_sg_bindings_t* bnd) {
}
for (int i = 0; i < bnd->num_vs_imgs; i++) {
SOKOL_ASSERT(bnd->vs_imgs[i]->d3d11.srv);
- d3d11_vs_srvs[i] = bnd->vs_imgs[i]->d3d11.srv;
+ d3d11_vs_srvs[_SG_D3D11_SHADERSTAGE_IMAGE_SRV_OFFSET + i] = bnd->vs_imgs[i]->d3d11.srv;
+ }
+ for (int i = 0; i < bnd->num_vs_sbufs; i++) {
+ SOKOL_ASSERT(bnd->vs_sbufs[i]->d3d11.srv);
+ d3d11_vs_srvs[_SG_D3D11_SHADERSTAGE_BUFFER_SRV_OFFSET + i] = bnd->vs_sbufs[i]->d3d11.srv;
}
for (int i = 0; i < bnd->num_fs_imgs; i++) {
SOKOL_ASSERT(bnd->fs_imgs[i]->d3d11.srv);
- d3d11_fs_srvs[i] = bnd->fs_imgs[i]->d3d11.srv;
+ d3d11_fs_srvs[_SG_D3D11_SHADERSTAGE_IMAGE_SRV_OFFSET + i] = bnd->fs_imgs[i]->d3d11.srv;
+ }
+ for (int i = 0; i < bnd->num_fs_sbufs; i++) {
+ SOKOL_ASSERT(bnd->fs_sbufs[i]->d3d11.srv);
+ d3d11_fs_srvs[_SG_D3D11_SHADERSTAGE_BUFFER_SRV_OFFSET + i] = bnd->fs_sbufs[i]->d3d11.srv;
}
for (int i = 0; i < bnd->num_vs_smps; i++) {
SOKOL_ASSERT(bnd->vs_smps[i]->d3d11.smp);
@@ -10964,8 +11325,8 @@ _SOKOL_PRIVATE bool _sg_d3d11_apply_bindings(_sg_bindings_t* bnd) {
}
_sg_d3d11_IASetVertexBuffers(_sg.d3d11.ctx, 0, SG_MAX_VERTEX_BUFFERS, d3d11_vbs, bnd->pip->d3d11.vb_strides, d3d11_vb_offsets);
_sg_d3d11_IASetIndexBuffer(_sg.d3d11.ctx, d3d11_ib, bnd->pip->d3d11.index_format, (UINT)bnd->ib_offset);
- _sg_d3d11_VSSetShaderResources(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_IMAGES, d3d11_vs_srvs);
- _sg_d3d11_PSSetShaderResources(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_IMAGES, d3d11_fs_srvs);
+ _sg_d3d11_VSSetShaderResources(_sg.d3d11.ctx, 0, _SG_D3D11_MAX_SHADERSTAGE_SRVS, d3d11_vs_srvs);
+ _sg_d3d11_PSSetShaderResources(_sg.d3d11.ctx, 0, _SG_D3D11_MAX_SHADERSTAGE_SRVS, d3d11_fs_srvs);
_sg_d3d11_VSSetSamplers(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_SAMPLERS, d3d11_vs_smps);
_sg_d3d11_PSSetSamplers(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_SAMPLERS, d3d11_fs_smps);
_sg_stats_add(d3d11.bindings.num_ia_set_vertex_buffers, 1);
@@ -10990,8 +11351,9 @@ _SOKOL_PRIVATE void _sg_d3d11_apply_uniforms(sg_shader_stage stage_index, int ub
}
_SOKOL_PRIVATE void _sg_d3d11_draw(int base_element, int num_elements, int num_instances) {
+ const bool use_instanced_draw = (num_instances > 1) || (_sg.d3d11.use_instanced_draw);
if (_sg.d3d11.use_indexed_draw) {
- if (_sg.d3d11.use_instanced_draw) {
+ if (use_instanced_draw) {
_sg_d3d11_DrawIndexedInstanced(_sg.d3d11.ctx, (UINT)num_elements, (UINT)num_instances, (UINT)base_element, 0, 0);
_sg_stats_add(d3d11.draw.num_draw_indexed_instanced, 1);
} else {
@@ -10999,7 +11361,7 @@ _SOKOL_PRIVATE void _sg_d3d11_draw(int base_element, int num_elements, int num_i
_sg_stats_add(d3d11.draw.num_draw_indexed, 1);
}
} else {
- if (_sg.d3d11.use_instanced_draw) {
+ if (use_instanced_draw) {
_sg_d3d11_DrawInstanced(_sg.d3d11.ctx, (UINT)num_elements, (UINT)num_instances, (UINT)base_element, 0);
_sg_stats_add(d3d11.draw.num_draw_instanced, 1);
} else {
@@ -11617,6 +11979,7 @@ _SOKOL_PRIVATE void _sg_mtl_init_caps(void) {
_sg.features.origin_top_left = true;
_sg.features.mrt_independent_blend_state = true;
_sg.features.mrt_independent_write_mask = true;
+ _sg.features.storage_buffer = true;
_sg.features.image_clamp_to_border = false;
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= 120000) || (__IPHONE_OS_VERSION_MAX_ALLOWED >= 140000)
@@ -12721,7 +13084,7 @@ _SOKOL_PRIVATE bool _sg_mtl_apply_bindings(_sg_bindings_t* bnd) {
}
}
- // apply vertex shader images
+ // apply vertex stage images
for (NSUInteger slot = 0; slot < (NSUInteger)bnd->num_vs_imgs; slot++) {
const _sg_image_t* img = bnd->vs_imgs[slot];
if (_sg.mtl.state_cache.cur_vs_image_ids[slot].id != img->slot.id) {
@@ -12732,7 +13095,7 @@ _SOKOL_PRIVATE bool _sg_mtl_apply_bindings(_sg_bindings_t* bnd) {
}
}
- // apply vertex shader samplers
+ // apply vertex stage samplers
for (NSUInteger slot = 0; slot < (NSUInteger)bnd->num_vs_smps; slot++) {
const _sg_sampler_t* smp = bnd->vs_smps[slot];
if (_sg.mtl.state_cache.cur_vs_sampler_ids[slot].id != smp->slot.id) {
@@ -12743,7 +13106,19 @@ _SOKOL_PRIVATE bool _sg_mtl_apply_bindings(_sg_bindings_t* bnd) {
}
}
- // apply fragment shader images
+ // apply vertex stage storage buffers
+ for (NSUInteger slot = 0; slot < (NSUInteger)bnd->num_vs_sbufs; slot++) {
+ const _sg_buffer_t* sbuf = bnd->vs_sbufs[slot];
+ if (_sg.mtl.state_cache.cur_vs_storagebuffer_ids[slot].id != sbuf->slot.id) {
+ _sg.mtl.state_cache.cur_vs_storagebuffer_ids[slot].id = sbuf->slot.id;
+ SOKOL_ASSERT(sbuf->mtl.buf[sbuf->cmn.active_slot] != _SG_MTL_INVALID_SLOT_INDEX);
+ const NSUInteger mtl_slot = SG_MAX_SHADERSTAGE_UBS + SG_MAX_VERTEX_BUFFERS + slot;
+ [_sg.mtl.cmd_encoder setVertexBuffer:_sg_mtl_id(sbuf->mtl.buf[sbuf->cmn.active_slot]) offset:0 atIndex:mtl_slot];
+ _sg_stats_add(metal.bindings.num_set_vertex_buffer, 1);
+ }
+ }
+
+ // apply fragment stage images
for (NSUInteger slot = 0; slot < (NSUInteger)bnd->num_fs_imgs; slot++) {
const _sg_image_t* img = bnd->fs_imgs[slot];
if (_sg.mtl.state_cache.cur_fs_image_ids[slot].id != img->slot.id) {
@@ -12754,7 +13129,7 @@ _SOKOL_PRIVATE bool _sg_mtl_apply_bindings(_sg_bindings_t* bnd) {
}
}
- // apply fragment shader samplers
+ // apply fragment stage samplers
for (NSUInteger slot = 0; slot < (NSUInteger)bnd->num_fs_smps; slot++) {
const _sg_sampler_t* smp = bnd->fs_smps[slot];
if (_sg.mtl.state_cache.cur_fs_sampler_ids[slot].id != smp->slot.id) {
@@ -12764,6 +13139,19 @@ _SOKOL_PRIVATE bool _sg_mtl_apply_bindings(_sg_bindings_t* bnd) {
_sg_stats_add(metal.bindings.num_set_fragment_sampler_state, 1);
}
}
+
+ // apply fragment stage storage buffers
+ for (NSUInteger slot = 0; slot < (NSUInteger)bnd->num_fs_sbufs; slot++) {
+ const _sg_buffer_t* sbuf = bnd->fs_sbufs[slot];
+ if (_sg.mtl.state_cache.cur_fs_storagebuffer_ids[slot].id != sbuf->slot.id) {
+ _sg.mtl.state_cache.cur_fs_storagebuffer_ids[slot].id = sbuf->slot.id;
+ SOKOL_ASSERT(sbuf->mtl.buf[sbuf->cmn.active_slot] != _SG_MTL_INVALID_SLOT_INDEX);
+ const NSUInteger mtl_slot = SG_MAX_SHADERSTAGE_UBS + slot;
+ [_sg.mtl.cmd_encoder setFragmentBuffer:_sg_mtl_id(sbuf->mtl.buf[sbuf->cmn.active_slot]) offset:0 atIndex:mtl_slot];
+ _sg_stats_add(metal.bindings.num_set_fragment_buffer, 1);
+ }
+ }
+
return true;
}
@@ -12882,9 +13270,11 @@ _SOKOL_PRIVATE void _sg_mtl_pop_debug_group(void) {
_SOKOL_PRIVATE WGPUBufferUsageFlags _sg_wgpu_buffer_usage(sg_buffer_type t, sg_usage u) {
WGPUBufferUsageFlags res = 0;
if (SG_BUFFERTYPE_VERTEXBUFFER == t) {
- res |= WGPUBufferUsage_Vertex;
+ res = WGPUBufferUsage_Vertex;
+ } else if (SG_BUFFERTYPE_STORAGEBUFFER == t) {
+ res = WGPUBufferUsage_Storage;
} else {
- res |= WGPUBufferUsage_Index;
+ res = WGPUBufferUsage_Index;
}
if (SG_USAGE_IMMUTABLE != u) {
res |= WGPUBufferUsage_CopyDst;
@@ -13241,15 +13631,17 @@ _SOKOL_PRIVATE WGPUColorWriteMaskFlags _sg_wgpu_colorwritemask(uint8_t m) {
// - all images and sampler are in @group(1)
// - vertex stage images start at @binding(0)
// - vertex stage samplers start at @binding(16)
-// - fragment stage images start at @binding(32)
-// - fragment stage samplers start at @binding(48)
+// - vertex stage storage buffers start at @binding(32)
+// - fragment stage images start at @binding(48)
+// - fragment stage samplers start at @binding(64)
+// - fragment stage storage buffers start at @binding(80)
//
_SOKOL_PRIVATE uint32_t _sg_wgpu_image_binding(sg_shader_stage stage, int img_slot) {
SOKOL_ASSERT((img_slot >= 0) && (img_slot < 16));
if (SG_SHADERSTAGE_VS == stage) {
return 0 + (uint32_t)img_slot;
} else {
- return 32 + (uint32_t)img_slot;
+ return 48 + (uint32_t)img_slot;
}
}
@@ -13258,7 +13650,16 @@ _SOKOL_PRIVATE uint32_t _sg_wgpu_sampler_binding(sg_shader_stage stage, int smp_
if (SG_SHADERSTAGE_VS == stage) {
return 16 + (uint32_t)smp_slot;
} else {
- return 48 + (uint32_t)smp_slot;
+ return 64 + (uint32_t)smp_slot;
+ }
+}
+
+_SOKOL_PRIVATE uint32_t _sg_wgpu_storagebuffer_binding(sg_shader_stage stage, int sbuf_slot) {
+ SOKOL_ASSERT((sbuf_slot >= 0) && (sbuf_slot < 16));
+ if (SG_SHADERSTAGE_VS == stage) {
+ return 32 + (uint32_t)sbuf_slot;
+ } else {
+ return 80 + (uint32_t)sbuf_slot;
}
}
@@ -13276,6 +13677,7 @@ _SOKOL_PRIVATE void _sg_wgpu_init_caps(void) {
_sg.features.image_clamp_to_border = false;
_sg.features.mrt_independent_blend_state = true;
_sg.features.mrt_independent_write_mask = true;
+ _sg.features.storage_buffer = true;
wgpuDeviceGetLimits(_sg.wgpu.dev, &_sg.wgpu.limits);
@@ -13567,16 +13969,20 @@ _SOKOL_PRIVATE void _sg_wgpu_init_bindgroups_cache_key(_sg_wgpu_bindgroups_cache
SOKOL_ASSERT(bnd->pip);
SOKOL_ASSERT(bnd->num_vs_imgs <= SG_MAX_SHADERSTAGE_IMAGES);
SOKOL_ASSERT(bnd->num_vs_smps <= SG_MAX_SHADERSTAGE_SAMPLERS);
+ SOKOL_ASSERT(bnd->num_vs_sbufs <= SG_MAX_SHADERSTAGE_STORAGEBUFFERS);
SOKOL_ASSERT(bnd->num_fs_imgs <= SG_MAX_SHADERSTAGE_IMAGES);
SOKOL_ASSERT(bnd->num_fs_smps <= SG_MAX_SHADERSTAGE_SAMPLERS);
+ SOKOL_ASSERT(bnd->num_fs_sbufs <= SG_MAX_SHADERSTAGE_STORAGEBUFFERS);
_sg_clear(key->items, sizeof(key->items));
key->items[0] = bnd->pip->slot.id;
const int vs_imgs_offset = 1;
const int vs_smps_offset = vs_imgs_offset + SG_MAX_SHADERSTAGE_IMAGES;
- const int fs_imgs_offset = vs_smps_offset + SG_MAX_SHADERSTAGE_SAMPLERS;
+ const int vs_sbufs_offset = vs_smps_offset + SG_MAX_SHADERSTAGE_SAMPLERS;
+ const int fs_imgs_offset = vs_sbufs_offset + SG_MAX_SHADERSTAGE_STORAGEBUFFERS;
const int fs_smps_offset = fs_imgs_offset + SG_MAX_SHADERSTAGE_IMAGES;
- SOKOL_ASSERT((fs_smps_offset + SG_MAX_SHADERSTAGE_SAMPLERS) == _SG_WGPU_BINDGROUPSCACHE_NUM_ITEMS);
+ const int fs_sbufs_offset = fs_smps_offset + SG_MAX_SHADERSTAGE_SAMPLERS;
+ SOKOL_ASSERT((fs_sbufs_offset + SG_MAX_SHADERSTAGE_STORAGEBUFFERS) == _SG_WGPU_BINDGROUPSCACHE_NUM_ITEMS);
for (int i = 0; i < bnd->num_vs_imgs; i++) {
SOKOL_ASSERT(bnd->vs_imgs[i]);
key->items[vs_imgs_offset + i] = bnd->vs_imgs[i]->slot.id;
@@ -13585,6 +13991,10 @@ _SOKOL_PRIVATE void _sg_wgpu_init_bindgroups_cache_key(_sg_wgpu_bindgroups_cache
SOKOL_ASSERT(bnd->vs_smps[i]);
key->items[vs_smps_offset + i] = bnd->vs_smps[i]->slot.id;
}
+ for (int i = 0; i < bnd->num_vs_sbufs; i++) {
+ SOKOL_ASSERT(bnd->vs_sbufs[i]);
+ key->items[vs_sbufs_offset + i] = bnd->vs_sbufs[i]->slot.id;
+ }
for (int i = 0; i < bnd->num_fs_imgs; i++) {
SOKOL_ASSERT(bnd->fs_imgs[i]);
key->items[fs_imgs_offset + i] = bnd->fs_imgs[i]->slot.id;
@@ -13593,6 +14003,10 @@ _SOKOL_PRIVATE void _sg_wgpu_init_bindgroups_cache_key(_sg_wgpu_bindgroups_cache
SOKOL_ASSERT(bnd->fs_smps[i]);
key->items[fs_smps_offset + i] = bnd->fs_smps[i]->slot.id;
}
+ for (int i = 0; i < bnd->num_fs_sbufs; i++) {
+ SOKOL_ASSERT(bnd->fs_sbufs[i]);
+ key->items[fs_sbufs_offset + i] = bnd->fs_sbufs[i]->slot.id;
+ }
key->hash = _sg_wgpu_hash(&key->items, (int)sizeof(key->items), 0x1234567887654321);
}
@@ -13623,7 +14037,7 @@ _SOKOL_PRIVATE _sg_wgpu_bindgroup_t* _sg_wgpu_create_bindgroup(_sg_bindings_t* b
// create wgpu bindgroup object
WGPUBindGroupLayout bgl = bnd->pip->shader->wgpu.bind_group_layout;
SOKOL_ASSERT(bgl);
- WGPUBindGroupEntry wgpu_entries[SG_NUM_SHADER_STAGES * SG_MAX_SHADERSTAGE_IMAGES + SG_MAX_SHADERSTAGE_SAMPLERS];
+ WGPUBindGroupEntry wgpu_entries[_SG_WGPU_MAX_BINDGROUP_ENTRIES];
_sg_clear(&wgpu_entries, sizeof(wgpu_entries));
int bge_index = 0;
for (int i = 0; i < bnd->num_vs_imgs; i++) {
@@ -13636,6 +14050,12 @@ _SOKOL_PRIVATE _sg_wgpu_bindgroup_t* _sg_wgpu_create_bindgroup(_sg_bindings_t* b
wgpu_entry->binding = _sg_wgpu_sampler_binding(SG_SHADERSTAGE_VS, i);
wgpu_entry->sampler = bnd->vs_smps[i]->wgpu.smp;
}
+ for (int i = 0; i < bnd->num_vs_sbufs; i++) {
+ WGPUBindGroupEntry* wgpu_entry = &wgpu_entries[bge_index++];
+ wgpu_entry->binding = _sg_wgpu_storagebuffer_binding(SG_SHADERSTAGE_VS, i);
+ wgpu_entry->buffer = bnd->vs_sbufs[i]->wgpu.buf;
+ wgpu_entry->size = (uint64_t) bnd->vs_sbufs[i]->cmn.size;
+ }
for (int i = 0; i < bnd->num_fs_imgs; i++) {
WGPUBindGroupEntry* wgpu_entry = &wgpu_entries[bge_index++];
wgpu_entry->binding = _sg_wgpu_image_binding(SG_SHADERSTAGE_FS, i);
@@ -13646,6 +14066,12 @@ _SOKOL_PRIVATE _sg_wgpu_bindgroup_t* _sg_wgpu_create_bindgroup(_sg_bindings_t* b
wgpu_entry->binding = _sg_wgpu_sampler_binding(SG_SHADERSTAGE_FS, i);
wgpu_entry->sampler = bnd->fs_smps[i]->wgpu.smp;
}
+ for (int i = 0; i < bnd->num_fs_sbufs; i++) {
+ WGPUBindGroupEntry* wgpu_entry = &wgpu_entries[bge_index++];
+ wgpu_entry->binding = _sg_wgpu_storagebuffer_binding(SG_SHADERSTAGE_FS, i);
+ wgpu_entry->buffer = bnd->fs_sbufs[i]->wgpu.buf;
+ wgpu_entry->size = (uint64_t) bnd->fs_sbufs[i]->cmn.size;
+ }
WGPUBindGroupDescriptor bg_desc;
_sg_clear(&bg_desc, sizeof(bg_desc));
bg_desc.layout = bgl;
@@ -13792,7 +14218,7 @@ _SOKOL_PRIVATE void _sg_wgpu_bindings_cache_bg_update(const _sg_wgpu_bindgroup_t
}
}
-_SOKOL_PRIVATE void _sg_wgpu_set_image_sampler_bindgroup(_sg_wgpu_bindgroup_t* bg) {
+_SOKOL_PRIVATE void _sg_wgpu_set_bindings_bindgroup(_sg_wgpu_bindgroup_t* bg) {
if (_sg_wgpu_bindings_cache_bg_dirty(bg)) {
_sg_wgpu_bindings_cache_bg_update(bg);
_sg_stats_add(wgpu.bindings.num_set_bindgroup, 1);
@@ -13810,7 +14236,7 @@ _SOKOL_PRIVATE void _sg_wgpu_set_image_sampler_bindgroup(_sg_wgpu_bindgroup_t* b
}
_SOKOL_PRIVATE bool _sg_wgpu_apply_bindgroup(_sg_bindings_t* bnd) {
- if ((bnd->num_vs_imgs + bnd->num_vs_smps + bnd->num_fs_imgs + bnd->num_fs_smps) > 0) {
+ if ((bnd->num_vs_imgs + bnd->num_vs_smps + bnd->num_vs_sbufs + bnd->num_fs_imgs + bnd->num_fs_smps + bnd->num_fs_sbufs) > 0) {
if (!_sg.desc.wgpu_disable_bindgroups_cache) {
_sg_wgpu_bindgroup_t* bg = 0;
_sg_wgpu_bindgroups_cache_key_t key;
@@ -13838,7 +14264,7 @@ _SOKOL_PRIVATE bool _sg_wgpu_apply_bindgroup(_sg_bindings_t* bnd) {
_sg_wgpu_bindgroups_cache_set(key.hash, bg->slot.id);
}
if (bg && bg->slot.state == SG_RESOURCESTATE_VALID) {
- _sg_wgpu_set_image_sampler_bindgroup(bg);
+ _sg_wgpu_set_bindings_bindgroup(bg);
} else {
return false;
}
@@ -13847,7 +14273,7 @@ _SOKOL_PRIVATE bool _sg_wgpu_apply_bindgroup(_sg_bindings_t* bnd) {
_sg_wgpu_bindgroup_t* bg = _sg_wgpu_create_bindgroup(bnd);
if (bg) {
if (bg->slot.state == SG_RESOURCESTATE_VALID) {
- _sg_wgpu_set_image_sampler_bindgroup(bg);
+ _sg_wgpu_set_bindings_bindgroup(bg);
}
_sg_wgpu_discard_bindgroup(bg);
} else {
@@ -13855,10 +14281,11 @@ _SOKOL_PRIVATE bool _sg_wgpu_apply_bindgroup(_sg_bindings_t* bnd) {
}
}
} else {
- _sg_wgpu_set_image_sampler_bindgroup(0);
+ _sg_wgpu_set_bindings_bindgroup(0);
}
return true;
}
+
_SOKOL_PRIVATE bool _sg_wgpu_apply_index_buffer(_sg_bindings_t* bnd) {
if (_sg_wgpu_bindings_cache_ib_dirty(bnd->ib, bnd->ib_offset)) {
_sg_wgpu_bindings_cache_ib_update(bnd->ib, bnd->ib_offset);
@@ -14180,8 +14607,7 @@ _SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_shader(_sg_shader_t* shd, const
SOKOL_ASSERT(shd && desc);
SOKOL_ASSERT(desc->vs.source && desc->fs.source);
- #define _sg_wgpu_create_shader_max_bgl_entries (SG_NUM_SHADER_STAGES * (SG_MAX_SHADERSTAGE_IMAGES + SG_MAX_SHADERSTAGE_SAMPLERS))
- WGPUBindGroupLayoutEntry wgpu_bgl_entries[_sg_wgpu_create_shader_max_bgl_entries];
+ WGPUBindGroupLayoutEntry wgpu_bgl_entries[_SG_WGPU_MAX_BINDGROUP_ENTRIES];
_sg_clear(wgpu_bgl_entries, sizeof(wgpu_bgl_entries));
int bgl_index = 0;
for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) {
@@ -14217,8 +14643,13 @@ _SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_shader(_sg_shader_t* shd, const
_SG_ERROR(WGPU_SHADER_TOO_MANY_SAMPLERS);
return SG_RESOURCESTATE_FAILED;
}
+ const int num_sbufs = cmn_stage->num_storage_buffers;
+ if (num_sbufs > (int)_sg.wgpu.limits.limits.maxStorageBuffersPerShaderStage) {
+ _SG_ERROR(WGPU_SHADER_TOO_MANY_STORAGEBUFFERS);
+ return SG_RESOURCESTATE_FAILED;
+ }
for (int img_index = 0; img_index < num_images; img_index++) {
- SOKOL_ASSERT(bgl_index < _sg_wgpu_create_shader_max_bgl_entries);
+ SOKOL_ASSERT(bgl_index < _SG_WGPU_MAX_BINDGROUP_ENTRIES);
WGPUBindGroupLayoutEntry* wgpu_bgl_entry = &wgpu_bgl_entries[bgl_index++];
const sg_shader_image_desc* img_desc = &stage_desc->images[img_index];
wgpu_bgl_entry->binding = _sg_wgpu_image_binding((sg_shader_stage)stage_index, img_index);
@@ -14228,13 +14659,21 @@ _SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_shader(_sg_shader_t* shd, const
wgpu_bgl_entry->texture.multisampled = img_desc->multisampled;
}
for (int smp_index = 0; smp_index < num_samplers; smp_index++) {
- SOKOL_ASSERT(bgl_index < _sg_wgpu_create_shader_max_bgl_entries);
+ SOKOL_ASSERT(bgl_index < _SG_WGPU_MAX_BINDGROUP_ENTRIES);
WGPUBindGroupLayoutEntry* wgpu_bgl_entry = &wgpu_bgl_entries[bgl_index++];
const sg_shader_sampler_desc* smp_desc = &stage_desc->samplers[smp_index];
- wgpu_bgl_entry->binding =_sg_wgpu_sampler_binding((sg_shader_stage)stage_index, smp_index);
+ wgpu_bgl_entry->binding = _sg_wgpu_sampler_binding((sg_shader_stage)stage_index, smp_index);
wgpu_bgl_entry->visibility = _sg_wgpu_shader_stage((sg_shader_stage)stage_index);
wgpu_bgl_entry->sampler.type = _sg_wgpu_sampler_binding_type(smp_desc->sampler_type);
}
+ for (int sbuf_index = 0; sbuf_index < num_sbufs; sbuf_index++) {
+ SOKOL_ASSERT(bgl_index < _SG_WGPU_MAX_BINDGROUP_ENTRIES);
+ WGPUBindGroupLayoutEntry* wgpu_bgl_entry = &wgpu_bgl_entries[bgl_index++];
+ const sg_shader_storage_buffer_desc* sbuf_desc = &stage_desc->storage_buffers[sbuf_index];
+ wgpu_bgl_entry->binding = _sg_wgpu_storagebuffer_binding((sg_shader_stage)stage_index, sbuf_index);
+ wgpu_bgl_entry->visibility = _sg_wgpu_shader_stage((sg_shader_stage)stage_index);
+ wgpu_bgl_entry->buffer.type = sbuf_desc->readonly ? WGPUBufferBindingType_ReadOnlyStorage : WGPUBufferBindingType_Storage;
+ }
}
WGPUBindGroupLayoutDescriptor wgpu_bgl_desc;
@@ -14246,8 +14685,6 @@ _SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_shader(_sg_shader_t* shd, const
_SG_ERROR(WGPU_SHADER_CREATE_BINDGROUP_LAYOUT_FAILED);
return SG_RESOURCESTATE_FAILED;
}
-
- #undef _sg_wgpu_create_shader_max_bgl_entries
return SG_RESOURCESTATE_VALID;
}
@@ -15625,6 +16062,10 @@ _SOKOL_PRIVATE bool _sg_validate_buffer_desc(const sg_buffer_desc* desc) {
} else {
_SG_VALIDATE(0 == desc->data.ptr, VALIDATE_BUFFERDESC_NO_DATA);
}
+ if (desc->type == SG_BUFFERTYPE_STORAGEBUFFER) {
+ _SG_VALIDATE(_sg.features.storage_buffer, VALIDATE_BUFFERDESC_STORAGEBUFFER_SUPPORTED);
+ _SG_VALIDATE(_sg_multiple_u64(desc->size, 4), VALIDATE_BUFFERDESC_STORAGEBUFFER_SIZE_MULTIPLE_4);
+ }
return _sg_validate_end();
#endif
}
@@ -15762,10 +16203,7 @@ _SOKOL_PRIVATE bool _sg_validate_shader_desc(const sg_shader_desc* desc) {
_sg_validate_begin();
_SG_VALIDATE(desc->_start_canary == 0, VALIDATE_SHADERDESC_CANARY);
_SG_VALIDATE(desc->_end_canary == 0, VALIDATE_SHADERDESC_CANARY);
- #if defined(SOKOL_D3D11)
- _SG_VALIDATE(0 != desc->attrs[0].sem_name, VALIDATE_SHADERDESC_ATTR_SEMANTICS);
- #endif
- #if defined(SOKOL_GLCORE33) || defined(SOKOL_GLES3) || defined(SOKOL_WGPU)
+ #if defined(SOKOL_GLCORE) || defined(SOKOL_GLES3) || defined(SOKOL_WGPU)
// on GL or WebGPU, must provide shader source code
_SG_VALIDATE(0 != desc->vs.source, VALIDATE_SHADERDESC_SOURCE);
_SG_VALIDATE(0 != desc->fs.source, VALIDATE_SHADERDESC_SOURCE);
@@ -15836,6 +16274,16 @@ _SOKOL_PRIVATE bool _sg_validate_shader_desc(const sg_shader_desc* desc) {
uniform_blocks_continuous = false;
}
}
+ bool storage_buffers_continuous = true;
+ for (int sbuf_index = 0; sbuf_index < SG_MAX_SHADERSTAGE_STORAGEBUFFERS; sbuf_index++) {
+ const sg_shader_storage_buffer_desc* sbuf_desc = &stage_desc->storage_buffers[sbuf_index];
+ if (sbuf_desc->used) {
+ _SG_VALIDATE(storage_buffers_continuous, VALIDATE_SHADERDESC_NO_CONT_STORAGEBUFFERS);
+ _SG_VALIDATE(sbuf_desc->readonly, VALIDATE_SHADERDESC_STORAGEBUFFER_READONLY);
+ } else {
+ storage_buffers_continuous = false;
+ }
+ }
bool images_continuous = true;
int num_images = 0;
for (int img_index = 0; img_index < SG_MAX_SHADERSTAGE_IMAGES; img_index++) {
@@ -15930,7 +16378,6 @@ _SOKOL_PRIVATE bool _sg_validate_pipeline_desc(const sg_pipeline_desc* desc) {
}
_SG_VALIDATE(_sg_multiple_u64((uint64_t)l_state->stride, 4), VALIDATE_PIPELINEDESC_LAYOUT_STRIDE4);
}
- _SG_VALIDATE(desc->layout.attrs[0].format != SG_VERTEXFORMAT_INVALID, VALIDATE_PIPELINEDESC_NO_ATTRS);
const _sg_shader_t* shd = _sg_lookup_shader(&_sg.pools, desc->shader.id);
_SG_VALIDATE(0 != shd, VALIDATE_PIPELINEDESC_SHADER);
if (shd) {
@@ -15942,7 +16389,7 @@ _SOKOL_PRIVATE bool _sg_validate_pipeline_desc(const sg_pipeline_desc* desc) {
attrs_cont = false;
continue;
}
- _SG_VALIDATE(attrs_cont, VALIDATE_PIPELINEDESC_NO_ATTRS);
+ _SG_VALIDATE(attrs_cont, VALIDATE_PIPELINEDESC_NO_CONT_ATTRS);
SOKOL_ASSERT(a_state->buffer_index < SG_MAX_VERTEX_BUFFERS);
#if defined(SOKOL_D3D11)
// on D3D11, semantic names (and semantic indices) must be provided
@@ -16329,6 +16776,23 @@ _SOKOL_PRIVATE bool _sg_validate_apply_bindings(const sg_bindings* bindings) {
}
}
+ // has expected vertex shader storage buffers
+ for (int i = 0; i < SG_MAX_SHADERSTAGE_STORAGEBUFFERS; i++) {
+ const _sg_shader_stage_t* stage = &pip->shader->cmn.stage[SG_SHADERSTAGE_VS];
+ if (stage->storage_buffers[i].used) {
+ _SG_VALIDATE(bindings->vs.storage_buffers[i].id != SG_INVALID_ID, VALIDATE_ABND_VS_EXPECTED_STORAGEBUFFER_BINDING);
+ if (bindings->vs.storage_buffers[i].id != SG_INVALID_ID) {
+ const _sg_buffer_t* sbuf = _sg_lookup_buffer(&_sg.pools, bindings->vs.storage_buffers[i].id);
+ _SG_VALIDATE(sbuf != 0, VALIDATE_ABND_VS_STORAGEBUFFER_EXISTS);
+ if (sbuf) {
+ _SG_VALIDATE(sbuf->cmn.type == SG_BUFFERTYPE_STORAGEBUFFER, VALIDATE_ABND_VS_STORAGEBUFFER_BINDING_BUFFERTYPE);
+ }
+ }
+ } else {
+ _SG_VALIDATE(bindings->vs.storage_buffers[i].id == SG_INVALID_ID, VALIDATE_ABND_VS_UNEXPECTED_STORAGEBUFFER_BINDING);
+ }
+ }
+
// has expected fragment shader images
for (int i = 0; i < SG_MAX_SHADERSTAGE_IMAGES; i++) {
const _sg_shader_stage_t* stage = &pip->shader->cmn.stage[SG_SHADERSTAGE_FS];
@@ -16384,6 +16848,24 @@ _SOKOL_PRIVATE bool _sg_validate_apply_bindings(const sg_bindings* bindings) {
_SG_VALIDATE(bindings->fs.samplers[i].id == SG_INVALID_ID, VALIDATE_ABND_FS_UNEXPECTED_SAMPLER_BINDING);
}
}
+
+ // has expected fragment shader storage buffers
+ for (int i = 0; i < SG_MAX_SHADERSTAGE_STORAGEBUFFERS; i++) {
+ const _sg_shader_stage_t* stage = &pip->shader->cmn.stage[SG_SHADERSTAGE_FS];
+ if (stage->storage_buffers[i].used) {
+ _SG_VALIDATE(bindings->fs.storage_buffers[i].id != SG_INVALID_ID, VALIDATE_ABND_FS_EXPECTED_STORAGEBUFFER_BINDING);
+ if (bindings->fs.storage_buffers[i].id != SG_INVALID_ID) {
+ const _sg_buffer_t* sbuf = _sg_lookup_buffer(&_sg.pools, bindings->fs.storage_buffers[i].id);
+ _SG_VALIDATE(sbuf != 0, VALIDATE_ABND_FS_STORAGEBUFFER_EXISTS);
+ if (sbuf) {
+ _SG_VALIDATE(sbuf->cmn.type == SG_BUFFERTYPE_STORAGEBUFFER, VALIDATE_ABND_FS_STORAGEBUFFER_BINDING_BUFFERTYPE);
+ }
+ }
+ } else {
+ _SG_VALIDATE(bindings->fs.storage_buffers[i].id == SG_INVALID_ID, VALIDATE_ABND_FS_UNEXPECTED_STORAGEBUFFER_BINDING);
+ }
+ }
+
return _sg_validate_end();
#endif
}
@@ -17823,7 +18305,6 @@ SOKOL_API_IMPL void sg_apply_pipeline(sg_pipeline pip_id) {
SOKOL_ASSERT(_sg.valid);
SOKOL_ASSERT(_sg.cur_pass.in_pass);
_sg_stats_add(num_apply_pipeline, 1);
- _sg.apply_bindings_called = false;
if (!_sg_validate_apply_pipeline(pip_id)) {
_sg.next_draw_valid = false;
return;
@@ -17846,7 +18327,6 @@ SOKOL_API_IMPL void sg_apply_bindings(const sg_bindings* bindings) {
SOKOL_ASSERT(bindings);
SOKOL_ASSERT((bindings->_start_canary == 0) && (bindings->_end_canary==0));
_sg_stats_add(num_apply_bindings, 1);
- _sg.apply_bindings_called = true;
if (!_sg_validate_apply_bindings(bindings)) {
_sg.next_draw_valid = false;
return;
@@ -17914,6 +18394,19 @@ SOKOL_API_IMPL void sg_apply_bindings(const sg_bindings* bindings) {
}
}
+ for (int i = 0; i < SG_MAX_SHADERSTAGE_STORAGEBUFFERS; i++, bnd.num_vs_sbufs++) {
+ if (bindings->vs.storage_buffers[i].id) {
+ bnd.vs_sbufs[i] = _sg_lookup_buffer(&_sg.pools, bindings->vs.storage_buffers[i].id);
+ if (bnd.vs_sbufs[i]) {
+ _sg.next_draw_valid &= (SG_RESOURCESTATE_VALID == bnd.vs_sbufs[i]->slot.state);
+ } else {
+ _sg.next_draw_valid = false;
+ }
+ } else {
+ break;
+ }
+ }
+
for (int i = 0; i < SG_MAX_SHADERSTAGE_IMAGES; i++, bnd.num_fs_imgs++) {
if (bindings->fs.images[i].id) {
bnd.fs_imgs[i] = _sg_lookup_image(&_sg.pools, bindings->fs.images[i].id);
@@ -17940,6 +18433,18 @@ SOKOL_API_IMPL void sg_apply_bindings(const sg_bindings* bindings) {
}
}
+ for (int i = 0; i < SG_MAX_SHADERSTAGE_STORAGEBUFFERS; i++, bnd.num_fs_sbufs++) {
+ if (bindings->fs.storage_buffers[i].id) {
+ bnd.fs_sbufs[i] = _sg_lookup_buffer(&_sg.pools, bindings->fs.storage_buffers[i].id);
+ if (bnd.fs_sbufs[i]) {
+ _sg.next_draw_valid &= (SG_RESOURCESTATE_VALID == bnd.fs_sbufs[i]->slot.state);
+ } else {
+ _sg.next_draw_valid = false;
+ }
+ } else {
+ break;
+ }
+ }
if (_sg.next_draw_valid) {
_sg.next_draw_valid &= _sg_apply_bindings(&bnd);
_SG_TRACE_ARGS(apply_bindings, bindings);
@@ -17975,20 +18480,12 @@ SOKOL_API_IMPL void sg_draw(int base_element, int num_elements, int num_instance
SOKOL_ASSERT(num_elements >= 0);
SOKOL_ASSERT(num_instances >= 0);
_sg_stats_add(num_draw, 1);
- #if defined(SOKOL_DEBUG)
- if (!_sg.apply_bindings_called) {
- _SG_WARN(DRAW_WITHOUT_BINDINGS);
- }
- #endif
if (!_sg.cur_pass.valid) {
return;
}
if (!_sg.next_draw_valid) {
return;
}
- if (!_sg.apply_bindings_called) {
- return;
- }
/* attempting to draw with zero elements or instances is not technically an
error, but might be handled as an error in the backend API (e.g. on Metal)
*/
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index cfaf7d46..9c7d3cba 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -4,10 +4,10 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)
-# SOKOL_GLCORE33, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU, SOKOL_DUMMY
+# SOKOL_GLCORE, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU, SOKOL_DUMMY
set(SOKOL_BACKEND "SOKOL_DUMMY_BACKEND" CACHE STRING "Select 3D backend API")
-set_property(CACHE SOKOL_BACKEND PROPERTY STRINGS SOKOL_GLCORE33 SOKOL_METAL SOKOL_D3D11 SOKOL_DUMMY_BACKEND)
-option(SOKOL_FORCE_EGL "Force EGL with GLCORE33 backend" OFF)
+set_property(CACHE SOKOL_BACKEND PROPERTY STRINGS SOKOL_GLCORE SOKOL_METAL SOKOL_D3D11 SOKOL_DUMMY_BACKEND)
+option(SOKOL_FORCE_EGL "Force EGL with GLCORE backend" OFF)
option(SOKOL_FORCE_SLES "Force SLES in sokol-audio Android backend" OFF)
option(USE_ARC "Enable/disable ARC" OFF)
option(USE_ANALYZER "Enable/disable clang analyzer" OFF)
diff --git a/tests/CMakePresets.json b/tests/CMakePresets.json
index fe0b8964..1894497d 100644
--- a/tests/CMakePresets.json
+++ b/tests/CMakePresets.json
@@ -11,7 +11,7 @@
"generator": "Ninja",
"binaryDir": "build/macos_gl_debug",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"CMAKE_BUILD_TYPE": "Debug"
}
},
@@ -20,7 +20,7 @@
"generator": "Ninja",
"binaryDir": "build/macos_gl_release",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"CMAKE_BUILD_TYPE": "Release"
}
},
@@ -29,7 +29,7 @@
"generator": "Ninja",
"binaryDir": "build/macos_gl_analyze",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"CMAKE_BUILD_TYPE": "Debug",
"USE_ANALYZER": {
"type": "BOOL",
@@ -77,7 +77,7 @@
"generator": "Ninja",
"binaryDir": "build/macos_arc_gl_debug",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"USE_ARC": {
"type": "BOOL",
"value": "ON"
@@ -90,7 +90,7 @@
"generator": "Ninja",
"binaryDir": "build/macos_arc_gl_release",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"USE_ARC": {
"type": "BOOL",
"value": "ON"
@@ -103,7 +103,7 @@
"generator": "Ninja",
"binaryDir": "build/macos_arc_gl_analyze",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"USE_ARC": {
"type": "BOOL",
"value": "ON"
@@ -283,7 +283,7 @@
"generator": "Ninja",
"binaryDir": "build/linux_gl_debug",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"CMAKE_BUILD_TYPE": "Debug"
}
},
@@ -292,7 +292,7 @@
"generator": "Ninja",
"binaryDir": "build/linux_gl_release",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"CMAKE_BUILD_TYPE": "Release"
}
},
@@ -301,7 +301,7 @@
"generator": "Ninja",
"binaryDir": "build/linux_gl_analyze",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"CMAKE_BUILD_TYPE": "Debug",
"USE_ANALYZER": {
"type": "BOOL",
@@ -349,7 +349,7 @@
"generator": "Ninja",
"binaryDir": "build/linux_gl_egl_debug",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"SOKOL_FORCE_EGL": {
"type": "BOOL",
"value": "ON"
@@ -362,7 +362,7 @@
"generator": "Ninja",
"binaryDir": "build/linux_gl_egl_release",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"SOKOL_FORCE_EGL": {
"type": "BOOL",
"value": "ON"
@@ -470,7 +470,7 @@
"name": "win_gl",
"binaryDir": "build/win_gl",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33"
+ "SOKOL_BACKEND": "SOKOL_GLCORE"
}
},
{
@@ -478,7 +478,7 @@
"generator": "Ninja",
"binaryDir": "build/win_gl_analyze",
"cacheVariables": {
- "SOKOL_BACKEND": "SOKOL_GLCORE33",
+ "SOKOL_BACKEND": "SOKOL_GLCORE",
"CMAKE_BUILD_TYPE": "Debug",
"USE_ANALYZER": {
"type": "BOOL",
diff --git a/tests/functional/force_dummy_backend.h b/tests/functional/force_dummy_backend.h
index 22390e7d..ac1b6739 100644
--- a/tests/functional/force_dummy_backend.h
+++ b/tests/functional/force_dummy_backend.h
@@ -1,8 +1,8 @@
#if defined(SOKOL_GLES3)
#undef SOKOL_GLES3
#endif
-#if defined(SOKOL_GLCORE33)
-#undef SOKOL_GLCORE33
+#if defined(SOKOL_GLCORE)
+#undef SOKOL_GLCORE
#endif
#if defined(SOKOL_METAL)
#undef SOKOL_METAL
diff --git a/util/sokol_debugtext.h b/util/sokol_debugtext.h
index 9e5062d9..12ca7a64 100644
--- a/util/sokol_debugtext.h
+++ b/util/sokol_debugtext.h
@@ -17,7 +17,7 @@
platform-specific embedded shader code (these are the same defines as
used by sokol_gfx.h and sokol_app.h):
- SOKOL_GLCORE33
+ SOKOL_GLCORE
SOKOL_GLES3
SOKOL_D3D11
SOKOL_METAL
@@ -2374,7 +2374,7 @@ static const uint8_t _sdtx_font_oric[2048] = {
/*
Embedded source code compiled with:
- sokol-shdc -i debugtext.glsl -o debugtext.h -l glsl330:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgsl -b
+ sokol-shdc -i debugtext.glsl -o debugtext.h -l glsl410:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgsl -b
(not that for Metal and D3D11 byte code, sokol-shdc must be run
on macOS and Windows)
@@ -2405,44 +2405,50 @@ static const uint8_t _sdtx_font_oric[2048] = {
@program debugtext vs fs
*/
-#if defined(SOKOL_GLCORE33)
-static const char _sdtx_vs_source_glsl330[298] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x6c,0x61,
+#if defined(SOKOL_GLCORE)
+static const uint8_t _sdtx_vs_source_glsl410[343] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x6c,0x61,
0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,
0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x6f,0x73,0x69,0x74,
- 0x69,0x6f,0x6e,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,
- 0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,
- 0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x74,
- 0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,
- 0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
- 0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,
- 0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x0a,
- 0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,
- 0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,
- 0x76,0x65,0x63,0x34,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x2a,0x20,
- 0x76,0x65,0x63,0x32,0x28,0x32,0x2e,0x30,0x2c,0x20,0x2d,0x32,0x2e,0x30,0x29,0x20,
- 0x2b,0x20,0x76,0x65,0x63,0x32,0x28,0x2d,0x31,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,
- 0x29,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,
- 0x20,0x20,0x75,0x76,0x20,0x3d,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,
- 0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,
- 0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
+ 0x69,0x6f,0x6e,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
+ 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,
+ 0x63,0x32,0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,
+ 0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,
+ 0x65,0x63,0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x6c,
+ 0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,
+ 0x20,0x31,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,
+ 0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,
+ 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,
+ 0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,
+ 0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,
+ 0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x66,
+ 0x6d,0x61,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x76,0x65,0x63,
+ 0x32,0x28,0x32,0x2e,0x30,0x2c,0x20,0x2d,0x32,0x2e,0x30,0x29,0x2c,0x20,0x76,0x65,
+ 0x63,0x32,0x28,0x2d,0x31,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x29,0x2c,0x20,
+ 0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,
+ 0x76,0x20,0x3d,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x20,
+ 0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,
+ 0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _sdtx_fs_source_glsl330[182] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e,
+static const uint8_t _sdtx_fs_source_glsl410[224] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,
0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,
0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,
- 0x6f,0x72,0x3b,0x0a,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,0x3b,0x0a,
- 0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,
- 0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,
- 0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,
- 0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x2c,0x20,
- 0x75,0x76,0x29,0x2e,0x78,0x78,0x78,0x78,0x20,0x2a,0x20,0x63,0x6f,0x6c,0x6f,0x72,
- 0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
+ 0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,
+ 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,
+ 0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
+ 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,
+ 0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,
+ 0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,
+ 0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,
+ 0x28,0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x75,0x76,0x29,0x2e,0x78,0x78,
+ 0x78,0x78,0x20,0x2a,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
+
};
#elif defined(SOKOL_GLES3)
-static const char _sdtx_vs_source_glsl300es[301] = {
+static const uint8_t _sdtx_vs_source_glsl300es[301] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,
0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x6f,
@@ -2463,7 +2469,7 @@ static const char _sdtx_vs_source_glsl300es[301] = {
0x72,0x64,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,
0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _sdtx_fs_source_glsl300es[255] = {
+static const uint8_t _sdtx_fs_source_glsl300es[255] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x70,0x72,0x65,0x63,0x69,0x73,0x69,0x6f,0x6e,0x20,0x6d,0x65,0x64,0x69,0x75,0x6d,
0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3b,0x0a,0x70,0x72,0x65,0x63,0x69,0x73,0x69,
@@ -3194,7 +3200,7 @@ static const uint8_t _sdtx_fs_bytecode_metal_ios[2825] = {
0x32,0x04,0x03,0x62,0x01,0x23,0x9f,0xd9,0x06,0x23,0x00,0x32,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
-static const char _sdtx_vs_source_metal_sim[577] = {
+static const uint8_t _sdtx_vs_source_metal_sim[577] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -3233,7 +3239,7 @@ static const char _sdtx_vs_source_metal_sim[577] = {
0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,
0x00,
};
-static const char _sdtx_fs_source_metal_sim[441] = {
+static const uint8_t _sdtx_fs_source_metal_sim[441] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -3351,7 +3357,7 @@ static const uint8_t _sdtx_fs_bytecode_hlsl4[608] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
#elif defined(SOKOL_WGPU)
-static const char _sdtx_vs_source_wgsl[922] = {
+static const uint8_t _sdtx_vs_source_wgsl[922] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,
@@ -3411,17 +3417,17 @@ static const char _sdtx_vs_source_wgsl[922] = {
0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x75,0x76,0x2c,0x20,0x63,0x6f,
0x6c,0x6f,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _sdtx_fs_source_wgsl[663] = {
+static const uint8_t _sdtx_fs_source_wgsl[663] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,
0x76,0x61,0x74,0x65,0x3e,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,
0x20,0x3a,0x20,0x76,0x65,0x63,0x34,0x66,0x3b,0x0a,0x0a,0x40,0x67,0x72,0x6f,0x75,
- 0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x28,0x33,0x32,
+ 0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x28,0x34,0x38,
0x29,0x20,0x76,0x61,0x72,0x20,0x74,0x65,0x78,0x20,0x3a,0x20,0x74,0x65,0x78,0x74,
0x75,0x72,0x65,0x5f,0x32,0x64,0x3c,0x66,0x33,0x32,0x3e,0x3b,0x0a,0x0a,0x40,0x67,
0x72,0x6f,0x75,0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,
- 0x28,0x34,0x38,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,0x20,0x3a,0x20,0x73,
+ 0x28,0x36,0x34,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,0x20,0x3a,0x20,0x73,
0x61,0x6d,0x70,0x6c,0x65,0x72,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,
0x76,0x61,0x74,0x65,0x3e,0x20,0x75,0x76,0x20,0x3a,0x20,0x76,0x65,0x63,0x32,0x66,
0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x3e,0x20,
@@ -3459,7 +3465,7 @@ static const char _sdtx_fs_source_wgsl[663] = {
static const char* _sdtx_vs_src_dummy = "";
static const char* _sdtx_fs_src_dummy = "";
#else
-#error "Please define one of SOKOL_GLCORE33, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
+#error "Please define one of SOKOL_GLCORE, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
#endif
// ███████ ████████ ██████ ██ ██ ██████ ████████ ███████
@@ -3952,12 +3958,12 @@ static void _sdtx_setup_common(void) {
shd_desc.fs.image_sampler_pairs[0].image_slot = 0;
shd_desc.fs.image_sampler_pairs[0].sampler_slot = 0;
shd_desc.fs.image_sampler_pairs[0].glsl_name = "tex_smp";
- #if defined(SOKOL_GLCORE33)
- shd_desc.vs.source = _sdtx_vs_source_glsl330;
- shd_desc.fs.source = _sdtx_fs_source_glsl330;
+ #if defined(SOKOL_GLCORE)
+ shd_desc.vs.source = (const char*)_sdtx_vs_source_glsl410;
+ shd_desc.fs.source = (const char*)_sdtx_fs_source_glsl410;
#elif defined(SOKOL_GLES3)
- shd_desc.vs.source = _sdtx_vs_source_glsl300es;
- shd_desc.fs.source = _sdtx_fs_source_glsl300es;
+ shd_desc.vs.source = (const char*)_sdtx_vs_source_glsl300es;
+ shd_desc.fs.source = (const char*)_sdtx_fs_source_glsl300es;
#elif defined(SOKOL_METAL)
shd_desc.vs.entry = "main0";
shd_desc.fs.entry = "main0";
@@ -3971,16 +3977,16 @@ static void _sdtx_setup_common(void) {
shd_desc.fs.bytecode = SG_RANGE(_sdtx_fs_bytecode_metal_ios);
break;
default:
- shd_desc.vs.source = _sdtx_vs_source_metal_sim;
- shd_desc.fs.source = _sdtx_fs_source_metal_sim;
+ shd_desc.vs.source = (const char*)_sdtx_vs_source_metal_sim;
+ shd_desc.fs.source = (const char*)_sdtx_fs_source_metal_sim;
break;
}
#elif defined(SOKOL_D3D11)
shd_desc.vs.bytecode = SG_RANGE(_sdtx_vs_bytecode_hlsl4);
shd_desc.fs.bytecode = SG_RANGE(_sdtx_fs_bytecode_hlsl4);
#elif defined(SOKOL_WGPU)
- shd_desc.vs.source = _sdtx_vs_source_wgsl;
- shd_desc.fs.source = _sdtx_fs_source_wgsl;
+ shd_desc.vs.source = (const char*)_sdtx_vs_source_wgsl;
+ shd_desc.fs.source = (const char*)_sdtx_fs_source_wgsl;
#else
shd_desc.vs.source = _sdtx_vs_src_dummy;
shd_desc.fs.source = _sdtx_fs_src_dummy;
diff --git a/util/sokol_fontstash.h b/util/sokol_fontstash.h
index 048c8215..a6505857 100644
--- a/util/sokol_fontstash.h
+++ b/util/sokol_fontstash.h
@@ -19,7 +19,7 @@
platform-specific embedded shader code (these are the same defines as
used by sokol_gfx.h and sokol_app.h):
- SOKOL_GLCORE33
+ SOKOL_GLCORE
SOKOL_GLES3
SOKOL_D3D11
SOKOL_METAL
@@ -278,11 +278,11 @@ SOKOL_FONTSTASH_API_DECL uint32_t sfons_rgba(uint8_t r, uint8_t g, uint8_t b, ui
#define _SOKOL_UNUSED(x) (void)(x)
#endif
-#if defined(SOKOL_GLCORE33)
+#if defined(SOKOL_GLCORE)
/*
Embedded source code compiled with:
- sokol-shdc -i sfons.glsl -o sfons.h -l glsl330:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgsl -b
+ sokol-shdc -i sfons.glsl -o sfons.h -l glsl410:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgsl -b
(not that for Metal and D3D11 byte code, sokol-shdc must be run
on macOS and Windows)
@@ -321,55 +321,61 @@ SOKOL_FONTSTASH_API_DECL uint32_t sfons_rgba(uint8_t r, uint8_t g, uint8_t b, ui
@program sfontstash vs fs
*/
-static const char _sfons_vs_source_glsl330[478] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e,
+static const uint8_t _sfons_vs_source_glsl410[520] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x76,0x73,0x5f,0x70,0x61,
0x72,0x61,0x6d,0x73,0x5b,0x38,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,
0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,
0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,
0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,
0x3d,0x20,0x33,0x29,0x20,0x69,0x6e,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x73,
- 0x69,0x7a,0x65,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x75,0x76,
- 0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,
- 0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x74,
- 0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,
- 0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
- 0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,
- 0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x0a,
- 0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,
- 0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,
- 0x6d,0x61,0x74,0x34,0x28,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,
- 0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2c,
- 0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c,0x20,0x76,
- 0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20,0x2a,0x20,0x70,
- 0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,
- 0x50,0x6f,0x69,0x6e,0x74,0x53,0x69,0x7a,0x65,0x20,0x3d,0x20,0x70,0x73,0x69,0x7a,
- 0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x76,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,
- 0x28,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x34,0x5d,0x2c,0x20,0x76,
- 0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x35,0x5d,0x2c,0x20,0x76,0x73,0x5f,
- 0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x36,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,
- 0x72,0x61,0x6d,0x73,0x5b,0x37,0x5d,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x34,0x28,
- 0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,
- 0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,
- 0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
+ 0x69,0x7a,0x65,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
+ 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,
+ 0x63,0x34,0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,
+ 0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,
+ 0x65,0x63,0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x6c,
+ 0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,
+ 0x20,0x31,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,
+ 0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,
+ 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,
+ 0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,
+ 0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,
+ 0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x76,
+ 0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2c,0x20,0x76,0x73,0x5f,
+ 0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,
+ 0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,
+ 0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20,0x2a,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,
+ 0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x69,0x6e,0x74,0x53,
+ 0x69,0x7a,0x65,0x20,0x3d,0x20,0x70,0x73,0x69,0x7a,0x65,0x3b,0x0a,0x20,0x20,0x20,
+ 0x20,0x75,0x76,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x76,0x73,0x5f,0x70,0x61,
+ 0x72,0x61,0x6d,0x73,0x5b,0x34,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,
+ 0x6d,0x73,0x5b,0x35,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,
+ 0x5b,0x36,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x37,
+ 0x5d,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x34,0x28,0x74,0x65,0x78,0x63,0x6f,0x6f,
+ 0x72,0x64,0x30,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,
+ 0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,
+ 0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _sfons_fs_source_glsl330[203] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e,
+static const uint8_t _sfons_fs_source_glsl410[245] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,
0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,
0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,
- 0x6f,0x72,0x3b,0x0a,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x75,0x76,0x3b,0x0a,
- 0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,
- 0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,
- 0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,
- 0x65,0x63,0x34,0x28,0x31,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x31,0x2e,
- 0x30,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x74,0x65,0x78,0x5f,0x73,
- 0x6d,0x70,0x2c,0x20,0x75,0x76,0x2e,0x78,0x79,0x29,0x2e,0x78,0x29,0x20,0x2a,0x20,
- 0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
+ 0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,
+ 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,
+ 0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
+ 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,
+ 0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,
+ 0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,
+ 0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x31,0x2e,
+ 0x30,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x74,0x65,0x78,
+ 0x74,0x75,0x72,0x65,0x28,0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x75,0x76,
+ 0x2e,0x78,0x79,0x29,0x2e,0x78,0x29,0x20,0x2a,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,
+ 0x0a,0x7d,0x0a,0x0a,0x00,
};
#elif defined(SOKOL_GLES3)
-static const char _sfons_vs_source_glsl300es[481] = {
+static const uint8_t _sfons_vs_source_glsl300es[481] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x76,0x73,
0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x38,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,
@@ -402,7 +408,7 @@ static const char _sfons_vs_source_glsl300es[481] = {
0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,
0x00,
};
-static const char _sfons_fs_source_glsl300es[276] = {
+static const uint8_t _sfons_fs_source_glsl300es[276] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x70,0x72,0x65,0x63,0x69,0x73,0x69,0x6f,0x6e,0x20,0x6d,0x65,0x64,0x69,0x75,0x6d,
0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3b,0x0a,0x70,0x72,0x65,0x63,0x69,0x73,0x69,
@@ -1204,7 +1210,7 @@ static const uint8_t _sfons_fs_bytecode_metal_ios[2841] = {
0xc8,0x70,0x04,0x8d,0x05,0x91,0x7c,0x66,0x1b,0x94,0x00,0xc8,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
-static const char _sfons_vs_source_metal_sim[756] = {
+static const uint8_t _sfons_vs_source_metal_sim[756] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -1254,7 +1260,7 @@ static const char _sfons_vs_source_metal_sim[756] = {
0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,
0x7d,0x0a,0x0a,0x00,
};
-static const char _sfons_fs_source_metal_sim[464] = {
+static const uint8_t _sfons_fs_source_metal_sim[464] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -1397,7 +1403,7 @@ static const uint8_t _sfons_fs_bytecode_hlsl4[628] = {
0x00,0x00,0x00,0x00,
};
#elif defined(SOKOL_WGPU)
-static const char _sfons_vs_source_wgsl[1162] = {
+static const uint8_t _sfons_vs_source_wgsl[1162] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,
@@ -1472,17 +1478,17 @@ static const char _sfons_vs_source_wgsl[1162] = {
0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x75,0x76,0x2c,0x20,0x63,0x6f,
0x6c,0x6f,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _sfons_fs_source_wgsl[674] = {
+static const uint8_t _sfons_fs_source_wgsl[674] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,
0x76,0x61,0x74,0x65,0x3e,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,
0x20,0x3a,0x20,0x76,0x65,0x63,0x34,0x66,0x3b,0x0a,0x0a,0x40,0x67,0x72,0x6f,0x75,
- 0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x28,0x33,0x32,
+ 0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x28,0x34,0x38,
0x29,0x20,0x76,0x61,0x72,0x20,0x74,0x65,0x78,0x20,0x3a,0x20,0x74,0x65,0x78,0x74,
0x75,0x72,0x65,0x5f,0x32,0x64,0x3c,0x66,0x33,0x32,0x3e,0x3b,0x0a,0x0a,0x40,0x67,
0x72,0x6f,0x75,0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,
- 0x28,0x34,0x38,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,0x20,0x3a,0x20,0x73,
+ 0x28,0x36,0x34,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,0x20,0x3a,0x20,0x73,
0x61,0x6d,0x70,0x6c,0x65,0x72,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,
0x76,0x61,0x74,0x65,0x3e,0x20,0x75,0x76,0x20,0x3a,0x20,0x76,0x65,0x63,0x34,0x66,
0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x3e,0x20,
@@ -1521,7 +1527,7 @@ static const char _sfons_fs_source_wgsl[674] = {
static const char* _sfons_vs_source_dummy = "";
static const char* _sfons_fs_source_dummy = "";
#else
-#error "Please define one of SOKOL_GLCORE33, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
+#error "Please define one of SOKOL_GLCORE, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
#endif
typedef struct _sfons_t {
@@ -1601,12 +1607,12 @@ static int _sfons_render_create(void* user_ptr, int width, int height) {
shd_desc.fs.image_sampler_pairs[0].image_slot = 0;
shd_desc.fs.image_sampler_pairs[0].sampler_slot = 0;
shd_desc.label = "sokol-fontstash-shader";
- #if defined(SOKOL_GLCORE33)
- shd_desc.vs.source = _sfons_vs_source_glsl330;
- shd_desc.fs.source = _sfons_fs_source_glsl330;
+ #if defined(SOKOL_GLCORE)
+ shd_desc.vs.source = (const char*)_sfons_vs_source_glsl410;
+ shd_desc.fs.source = (const char*)_sfons_fs_source_glsl410;
#elif defined(SOKOL_GLES3)
- shd_desc.vs.source = _sfons_vs_source_glsl300es;
- shd_desc.fs.source = _sfons_fs_source_glsl300es;
+ shd_desc.vs.source = (const char*)_sfons_vs_source_glsl300es;
+ shd_desc.fs.source = (const char*)_sfons_fs_source_glsl300es;
#elif defined(SOKOL_METAL)
shd_desc.vs.entry = "main0";
shd_desc.fs.entry = "main0";
@@ -1620,16 +1626,16 @@ static int _sfons_render_create(void* user_ptr, int width, int height) {
shd_desc.fs.bytecode = SG_RANGE(_sfons_fs_bytecode_metal_ios);
break;
default:
- shd_desc.vs.source = _sfons_vs_source_metal_sim;
- shd_desc.fs.source = _sfons_fs_source_metal_sim;
+ shd_desc.vs.source = (const char*)_sfons_vs_source_metal_sim;
+ shd_desc.fs.source = (const char*)_sfons_fs_source_metal_sim;
break;
}
#elif defined(SOKOL_D3D11)
shd_desc.vs.bytecode = SG_RANGE(_sfons_vs_bytecode_hlsl4);
shd_desc.fs.bytecode = SG_RANGE(_sfons_fs_bytecode_hlsl4);
#elif defined(SOKOL_WGPU)
- shd_desc.vs.source = _sfons_vs_source_wgsl;
- shd_desc.fs.source = _sfons_fs_source_wgsl;
+ shd_desc.vs.source = (const char*)_sfons_vs_source_wgsl;
+ shd_desc.fs.source = (const char*)_sfons_fs_source_wgsl;
#else
shd_desc.vs.source = _sfons_vs_source_dummy;
shd_desc.fs.source = _sfons_fs_source_dummy;
diff --git a/util/sokol_gfx_imgui.h b/util/sokol_gfx_imgui.h
index 0348cb08..e76f7d5f 100644
--- a/util/sokol_gfx_imgui.h
+++ b/util/sokol_gfx_imgui.h
@@ -1140,7 +1140,7 @@ _SOKOL_PRIVATE void _sgimgui_draw_resource_slot(const sg_slot_info* slot) {
_SOKOL_PRIVATE const char* _sgimgui_backend_string(sg_backend b) {
switch (b) {
- case SG_BACKEND_GLCORE33: return "SG_BACKEND_GLCORE33";
+ case SG_BACKEND_GLCORE: return "SG_BACKEND_GLCORE";
case SG_BACKEND_GLES3: return "SG_BACKEND_GLES3";
case SG_BACKEND_D3D11: return "SG_BACKEND_D3D11";
case SG_BACKEND_METAL_IOS: return "SG_BACKEND_METAL_IOS";
@@ -1156,6 +1156,7 @@ _SOKOL_PRIVATE const char* _sgimgui_buffertype_string(sg_buffer_type t) {
switch (t) {
case SG_BUFFERTYPE_VERTEXBUFFER: return "SG_BUFFERTYPE_VERTEXBUFFER";
case SG_BUFFERTYPE_INDEXBUFFER: return "SG_BUFFERTYPE_INDEXBUFFER";
+ case SG_BUFFERTYPE_STORAGEBUFFER: return "SG_BUFFERTYPE_STORAGEBUFFER";
default: return "???";
}
}
@@ -3483,6 +3484,15 @@ _SOKOL_PRIVATE void _sgimgui_draw_shader_stage(const sg_shader_stage_desc* stage
break;
}
}
+ int num_valid_storage_buffers = 0;
+ for (int i = 0; i < SG_MAX_SHADERSTAGE_STORAGEBUFFERS; i++) {
+ if (stage->storage_buffers[i].used) {
+ num_valid_storage_buffers++;
+ } else {
+ break;
+ }
+ }
+
if (num_valid_ubs > 0) {
if (igTreeNode_Str("Uniform Blocks")) {
for (int i = 0; i < num_valid_ubs; i++) {
@@ -3537,6 +3547,15 @@ _SOKOL_PRIVATE void _sgimgui_draw_shader_stage(const sg_shader_stage_desc* stage
igTreePop();
}
}
+ if (num_valid_storage_buffers > 0) {
+ if (igTreeNode_Str("Storage Buffers")) {
+ for (int i = 0; i < num_valid_storage_buffers; i++) {
+ const sg_shader_storage_buffer_desc* sbuf_desc = &stage->storage_buffers[i];
+ igText("slot: %d\n readonly: %s\n", i, sbuf_desc->readonly ? "true" : "false");
+ }
+ igTreePop();
+ }
+ }
if (stage->entry) {
igText("Entry: %s", stage->entry);
}
@@ -3817,6 +3836,17 @@ _SOKOL_PRIVATE void _sgimgui_draw_bindings_panel(sgimgui_t* ctx, const sg_bindin
break;
}
}
+ for (int i = 0; i < SG_MAX_SHADERSTAGE_STORAGEBUFFERS; i++) {
+ sg_buffer buf = bnd->vs.storage_buffers[i];
+ if (buf.id != SG_INVALID_ID) {
+ igSeparator();
+ igText("Vertex Stage Storage Buffer Slot #%d:", i);
+ igText(" Buffer: "); igSameLine(0,-1);
+ if (_sgimgui_draw_buffer_link(ctx, buf)) {
+ _sgimgui_show_buffer(ctx, buf);
+ }
+ }
+ }
for (int i = 0; i < SG_MAX_SHADERSTAGE_IMAGES; i++) {
sg_image img = bnd->fs.images[i];
if (img.id != SG_INVALID_ID) {
@@ -3839,6 +3869,17 @@ _SOKOL_PRIVATE void _sgimgui_draw_bindings_panel(sgimgui_t* ctx, const sg_bindin
}
}
}
+ for (int i = 0; i < SG_MAX_SHADERSTAGE_STORAGEBUFFERS; i++) {
+ sg_buffer buf = bnd->fs.storage_buffers[i];
+ if (buf.id != SG_INVALID_ID) {
+ igSeparator();
+ igText("Fragment Stage Storage Buffer Slot #%d:", i);
+ igText(" Buffer: "); igSameLine(0,-1);
+ if (_sgimgui_draw_buffer_link(ctx, buf)) {
+ _sgimgui_show_buffer(ctx, buf);
+ }
+ }
+ }
}
_SOKOL_PRIVATE void _sgimgui_draw_uniforms_panel(sgimgui_t* ctx, const sgimgui_args_apply_uniforms_t* args) {
@@ -4033,7 +4074,7 @@ _SOKOL_PRIVATE void _sgimgui_draw_swapchain_panel(sg_swapchain* swapchain) {
igText(" Depth Stencil Texture: %p", swapchain->metal.depth_stencil_texture);
igText(" MSAA Color Texture: %p", swapchain->metal.msaa_color_texture);
break;
- case SG_BACKEND_GLCORE33:
+ case SG_BACKEND_GLCORE:
case SG_BACKEND_GLES3:
igText("GL Objects:");
igText(" Framebuffer: %d", swapchain->gl.framebuffer);
@@ -4196,6 +4237,7 @@ _SOKOL_PRIVATE void _sgimgui_draw_caps_panel(void) {
igText(" image_clamp_to_border: %s", _sgimgui_bool_string(f.image_clamp_to_border));
igText(" mrt_independent_blend_state: %s", _sgimgui_bool_string(f.mrt_independent_blend_state));
igText(" mrt_independent_write_mask: %s", _sgimgui_bool_string(f.mrt_independent_write_mask));
+ igText(" storage_buffer: %s", _sgimgui_bool_string(f.storage_buffer));
sg_limits l = sg_query_limits();
igText("\nLimits:\n");
igText(" max_image_size_2d: %d", l.max_image_size_2d);
@@ -4263,7 +4305,7 @@ _SOKOL_PRIVATE void _sgimgui_draw_frame_stats_panel(sgimgui_t* ctx) {
_sgimgui_frame_stats(size_append_buffer);
_sgimgui_frame_stats(size_update_image);
switch (sg_query_backend()) {
- case SG_BACKEND_GLCORE33:
+ case SG_BACKEND_GLCORE:
case SG_BACKEND_GLES3:
_sgimgui_frame_stats(gl.num_bind_buffer);
_sgimgui_frame_stats(gl.num_active_texture);
@@ -4309,6 +4351,7 @@ _SOKOL_PRIVATE void _sgimgui_draw_frame_stats_panel(sgimgui_t* ctx) {
_sgimgui_frame_stats(metal.bindings.num_set_vertex_buffer);
_sgimgui_frame_stats(metal.bindings.num_set_vertex_texture);
_sgimgui_frame_stats(metal.bindings.num_set_vertex_sampler_state);
+ _sgimgui_frame_stats(metal.bindings.num_set_fragment_buffer);
_sgimgui_frame_stats(metal.bindings.num_set_fragment_texture);
_sgimgui_frame_stats(metal.bindings.num_set_fragment_sampler_state);
_sgimgui_frame_stats(metal.uniforms.num_set_vertex_buffer_offset);
diff --git a/util/sokol_gl.h b/util/sokol_gl.h
index 997ddea3..15b38808 100644
--- a/util/sokol_gl.h
+++ b/util/sokol_gl.h
@@ -17,7 +17,7 @@
platform-specific embedded shader code (these are the same defines as
used by sokol_gfx.h and sokol_app.h):
- SOKOL_GLCORE33
+ SOKOL_GLCORE
SOKOL_GLES3
SOKOL_D3D11
SOKOL_METAL
@@ -973,7 +973,7 @@ inline sgl_pipeline sgl_context_make_pipeline(sgl_context ctx, const sg_pipeline
/*
Embedded source code compiled with:
- sokol-shdc -i sgl.glsl -o sgl.h -l glsl330:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgpu -b
+ sokol-shdc -i sgl.glsl -o sgl.h -l glsl410:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgpu -b
(not that for Metal and D3D11 byte code, sokol-shdc must be run
on macOS and Windows)
@@ -1013,55 +1013,60 @@ inline sgl_pipeline sgl_context_make_pipeline(sgl_context ctx, const sg_pipeline
@program sgl vs fs
*/
-#if defined(SOKOL_GLCORE33)
-static const char _sgl_vs_source_glsl330[478] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e,
+#if defined(SOKOL_GLCORE)
+static const uint8_t _sgl_vs_source_glsl410[520] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x76,0x73,0x5f,0x70,0x61,
0x72,0x61,0x6d,0x73,0x5b,0x38,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,
0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,
0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,
0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,
0x3d,0x20,0x33,0x29,0x20,0x69,0x6e,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x73,
- 0x69,0x7a,0x65,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x75,0x76,
- 0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,
- 0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x74,
- 0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,
- 0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
- 0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,
- 0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x0a,
- 0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,
- 0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,
- 0x6d,0x61,0x74,0x34,0x28,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,
- 0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2c,
- 0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c,0x20,0x76,
- 0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20,0x2a,0x20,0x70,
- 0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,
- 0x50,0x6f,0x69,0x6e,0x74,0x53,0x69,0x7a,0x65,0x20,0x3d,0x20,0x70,0x73,0x69,0x7a,
- 0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x76,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,
- 0x28,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x34,0x5d,0x2c,0x20,0x76,
- 0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x35,0x5d,0x2c,0x20,0x76,0x73,0x5f,
- 0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x36,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,
- 0x72,0x61,0x6d,0x73,0x5b,0x37,0x5d,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x34,0x28,
- 0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,
- 0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,
- 0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
+ 0x69,0x7a,0x65,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
+ 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,
+ 0x63,0x34,0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,
+ 0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,
+ 0x65,0x63,0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x6c,
+ 0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,
+ 0x20,0x31,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,
+ 0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,
+ 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,
+ 0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,
+ 0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,
+ 0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x76,
+ 0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2c,0x20,0x76,0x73,0x5f,
+ 0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,
+ 0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,
+ 0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20,0x2a,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,
+ 0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x69,0x6e,0x74,0x53,
+ 0x69,0x7a,0x65,0x20,0x3d,0x20,0x70,0x73,0x69,0x7a,0x65,0x3b,0x0a,0x20,0x20,0x20,
+ 0x20,0x75,0x76,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x76,0x73,0x5f,0x70,0x61,
+ 0x72,0x61,0x6d,0x73,0x5b,0x34,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,
+ 0x6d,0x73,0x5b,0x35,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,
+ 0x5b,0x36,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x37,
+ 0x5d,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x34,0x28,0x74,0x65,0x78,0x63,0x6f,0x6f,
+ 0x72,0x64,0x30,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,
+ 0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,
+ 0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _sgl_fs_source_glsl330[180] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e,
+static const uint8_t _sgl_fs_source_glsl410[222] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,
0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,
0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,
- 0x6f,0x72,0x3b,0x0a,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x75,0x76,0x3b,0x0a,
- 0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,
- 0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,
- 0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,
- 0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x2c,0x20,
- 0x75,0x76,0x2e,0x78,0x79,0x29,0x20,0x2a,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,
- 0x7d,0x0a,0x0a,0x00,
+ 0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,
+ 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,
+ 0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
+ 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,
+ 0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,
+ 0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,
+ 0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,
+ 0x28,0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x75,0x76,0x2e,0x78,0x79,0x29,
+ 0x20,0x2a,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
#elif defined(SOKOL_GLES3)
-static const char _sgl_vs_source_glsl300es[481] = {
+static const uint8_t _sgl_vs_source_glsl300es[481] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x76,0x73,
0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x38,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,
@@ -1094,7 +1099,7 @@ static const char _sgl_vs_source_glsl300es[481] = {
0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,
0x00,
};
-static const char _sgl_fs_source_glsl300es[253] = {
+static const uint8_t _sgl_fs_source_glsl300es[253] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x70,0x72,0x65,0x63,0x69,0x73,0x69,0x6f,0x6e,0x20,0x6d,0x65,0x64,0x69,0x75,0x6d,
0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3b,0x0a,0x70,0x72,0x65,0x63,0x69,0x73,0x69,
@@ -1890,7 +1895,7 @@ static const uint8_t _sgl_fs_bytecode_metal_ios[2809] = {
0x42,0x40,0x29,0x49,0x50,0x20,0x86,0x60,0x01,0x23,0x9f,0xd9,0x06,0x23,0x00,0x32,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
-static const char _sgl_vs_source_metal_sim[756] = {
+static const uint8_t _sgl_vs_source_metal_sim[756] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -1940,7 +1945,7 @@ static const char _sgl_vs_source_metal_sim[756] = {
0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,
0x7d,0x0a,0x0a,0x00,
};
-static const char _sgl_fs_source_metal_sim[439] = {
+static const uint8_t _sgl_fs_source_metal_sim[439] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -2080,7 +2085,7 @@ static const uint8_t _sgl_fs_bytecode_hlsl4[608] = {
};
#elif defined(SOKOL_WGPU)
-static const char _sgl_vs_source_wgsl[1162] = {
+static const uint8_t _sgl_vs_source_wgsl[1162] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,
@@ -2155,17 +2160,17 @@ static const char _sgl_vs_source_wgsl[1162] = {
0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x75,0x76,0x2c,0x20,0x63,0x6f,
0x6c,0x6f,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _sgl_fs_source_wgsl[647] = {
+static const uint8_t _sgl_fs_source_wgsl[647] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,
0x76,0x61,0x74,0x65,0x3e,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,
0x20,0x3a,0x20,0x76,0x65,0x63,0x34,0x66,0x3b,0x0a,0x0a,0x40,0x67,0x72,0x6f,0x75,
- 0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x28,0x33,0x32,
+ 0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x28,0x34,0x38,
0x29,0x20,0x76,0x61,0x72,0x20,0x74,0x65,0x78,0x20,0x3a,0x20,0x74,0x65,0x78,0x74,
0x75,0x72,0x65,0x5f,0x32,0x64,0x3c,0x66,0x33,0x32,0x3e,0x3b,0x0a,0x0a,0x40,0x67,
0x72,0x6f,0x75,0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,
- 0x28,0x34,0x38,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,0x20,0x3a,0x20,0x73,
+ 0x28,0x36,0x34,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,0x20,0x3a,0x20,0x73,
0x61,0x6d,0x70,0x6c,0x65,0x72,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,
0x76,0x61,0x74,0x65,0x3e,0x20,0x75,0x76,0x20,0x3a,0x20,0x76,0x65,0x63,0x34,0x66,
0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x3e,0x20,
@@ -2202,7 +2207,7 @@ static const char _sgl_fs_source_wgsl[647] = {
static const char* _sgl_vs_source_dummy = "";
static const char* _sgl_fs_source_dummy = "";
#else
-#error "Please define one of SOKOL_GLCORE33, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
+#error "Please define one of SOKOL_GLCORE, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
#endif
// ████████ ██ ██ ██████ ███████ ███████
@@ -3284,12 +3289,12 @@ static void _sgl_setup_common(void) {
shd_desc.fs.image_sampler_pairs[0].sampler_slot = 0;
shd_desc.fs.image_sampler_pairs[0].glsl_name = "tex_smp";
shd_desc.label = "sgl-shader";
- #if defined(SOKOL_GLCORE33)
- shd_desc.vs.source = _sgl_vs_source_glsl330;
- shd_desc.fs.source = _sgl_fs_source_glsl330;
+ #if defined(SOKOL_GLCORE)
+ shd_desc.vs.source = (const char*)_sgl_vs_source_glsl410;
+ shd_desc.fs.source = (const char*)_sgl_fs_source_glsl410;
#elif defined(SOKOL_GLES3)
- shd_desc.vs.source = _sgl_vs_source_glsl300es;
- shd_desc.fs.source = _sgl_fs_source_glsl300es;
+ shd_desc.vs.source = (const char*)_sgl_vs_source_glsl300es;
+ shd_desc.fs.source = (const char*)_sgl_fs_source_glsl300es;
#elif defined(SOKOL_METAL)
shd_desc.vs.entry = "main0";
shd_desc.fs.entry = "main0";
@@ -3303,16 +3308,16 @@ static void _sgl_setup_common(void) {
shd_desc.fs.bytecode = SG_RANGE(_sgl_fs_bytecode_metal_ios);
break;
default:
- shd_desc.vs.source = _sgl_vs_source_metal_sim;
- shd_desc.fs.source = _sgl_fs_source_metal_sim;
+ shd_desc.vs.source = (const char*)_sgl_vs_source_metal_sim;
+ shd_desc.fs.source = (const char*)_sgl_fs_source_metal_sim;
break;
}
#elif defined(SOKOL_D3D11)
shd_desc.vs.bytecode = SG_RANGE(_sgl_vs_bytecode_hlsl4);
shd_desc.fs.bytecode = SG_RANGE(_sgl_fs_bytecode_hlsl4);
#elif defined(SOKOL_WGPU)
- shd_desc.vs.source = _sgl_vs_source_wgsl;
- shd_desc.fs.source = _sgl_fs_source_wgsl;
+ shd_desc.vs.source = (const char*)_sgl_vs_source_wgsl;
+ shd_desc.fs.source = (const char*)_sgl_fs_source_wgsl;
#else
shd_desc.vs.source = _sgl_vs_source_dummy;
shd_desc.fs.source = _sgl_fs_source_dummy;
diff --git a/util/sokol_imgui.h b/util/sokol_imgui.h
index 9f54686a..810890c0 100644
--- a/util/sokol_imgui.h
+++ b/util/sokol_imgui.h
@@ -26,7 +26,7 @@
platform-specific embedded shader code (these are the same defines as
used by sokol_gfx.h and sokol_app.h):
- SOKOL_GLCORE33
+ SOKOL_GLCORE
SOKOL_GLES3
SOKOL_D3D11
SOKOL_METAL
@@ -687,7 +687,7 @@ static _simgui_state_t _simgui;
/*
Embedded source code compiled with:
- sokol-shdc -i simgui.glsl -o simgui.h -l glsl330:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgpu -b
+ sokol-shdc -i simgui.glsl -o simgui.h -l glsl410:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgpu -b
(not that for Metal and D3D11 byte code, sokol-shdc must be run
on macOS and Windows)
@@ -721,47 +721,51 @@ static _simgui_state_t _simgui;
@program simgui vs fs
*/
-#if defined(SOKOL_GLCORE33)
-static const char _simgui_vs_source_glsl330[341] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e,
+#if defined(SOKOL_GLCORE)
+static const uint8_t _simgui_vs_source_glsl410[383] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x76,0x73,0x5f,0x70,0x61,
0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,
0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,
0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,
- 0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,
- 0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,
- 0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,
- 0x72,0x64,0x30,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,
- 0x6c,0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
- 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,
- 0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,
- 0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,
- 0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,
- 0x28,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x2f,0x20,0x76,0x73,0x5f,
- 0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2e,0x78,0x79,0x29,0x20,0x2d,0x20,
- 0x76,0x65,0x63,0x32,0x28,0x30,0x2e,0x35,0x29,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,
- 0x32,0x28,0x32,0x2e,0x30,0x2c,0x20,0x2d,0x32,0x2e,0x30,0x29,0x2c,0x20,0x30,0x2e,
- 0x35,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x76,0x20,
- 0x3d,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x20,0x20,0x20,
- 0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,
- 0x0a,0x7d,0x0a,0x0a,0x00,
+ 0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,
+ 0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,
+ 0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,
+ 0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x74,
+ 0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
+ 0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x6f,
+ 0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x6c,
+ 0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,
+ 0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,
+ 0x72,0x30,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,
+ 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,
+ 0x6f,0x6e,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x28,0x28,0x70,0x6f,0x73,0x69,
+ 0x74,0x69,0x6f,0x6e,0x20,0x2f,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,
+ 0x5b,0x30,0x5d,0x2e,0x78,0x79,0x29,0x20,0x2d,0x20,0x76,0x65,0x63,0x32,0x28,0x30,
+ 0x2e,0x35,0x29,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x32,0x28,0x32,0x2e,0x30,0x2c,
+ 0x20,0x2d,0x32,0x2e,0x30,0x29,0x2c,0x20,0x30,0x2e,0x35,0x2c,0x20,0x31,0x2e,0x30,
+ 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x76,0x20,0x3d,0x20,0x74,0x65,0x78,0x63,
+ 0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,
+ 0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _simgui_fs_source_glsl330[177] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e,
+static const uint8_t _simgui_fs_source_glsl410[219] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,
0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,
0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,
- 0x6f,0x72,0x3b,0x0a,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,0x3b,0x0a,
- 0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,
- 0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,
- 0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,
- 0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x2c,0x20,
- 0x75,0x76,0x29,0x20,0x2a,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x7d,0x0a,0x0a,
- 0x00,
+ 0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,
+ 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,
+ 0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
+ 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,
+ 0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,
+ 0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,
+ 0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,
+ 0x28,0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x75,0x76,0x29,0x20,0x2a,0x20,
+ 0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
#elif defined(SOKOL_GLES3)
-static const char _simgui_vs_source_glsl300es[344] = {
+static const uint8_t _simgui_vs_source_glsl300es[344] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x76,0x73,
0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,
@@ -785,7 +789,7 @@ static const char _simgui_vs_source_glsl300es[344] = {
0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,
0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _simgui_fs_source_glsl300es[250] = {
+static const uint8_t _simgui_fs_source_glsl300es[250] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x70,0x72,0x65,0x63,0x69,0x73,0x69,0x6f,0x6e,0x20,0x6d,0x65,0x64,0x69,0x75,0x6d,
0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3b,0x0a,0x70,0x72,0x65,0x63,0x69,0x73,0x69,
@@ -1546,7 +1550,7 @@ static const uint8_t _simgui_fs_bytecode_metal_ios[2809] = {
0x0c,0x05,0x11,0x58,0x90,0xc8,0x67,0xb6,0x81,0x08,0x80,0x0c,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
-static const char _simgui_vs_source_metal_sim[672] = {
+static const uint8_t _simgui_vs_source_metal_sim[672] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -1591,7 +1595,7 @@ static const char _simgui_vs_source_metal_sim[672] = {
0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _simgui_fs_source_metal_sim[436] = {
+static const uint8_t _simgui_fs_source_metal_sim[436] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -1722,7 +1726,7 @@ static const uint8_t _simgui_fs_bytecode_hlsl4[608] = {
};
#elif defined(SOKOL_WGPU)
-static const char _simgui_vs_source_wgsl[1083] = {
+static const uint8_t _simgui_vs_source_wgsl[1083] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,
@@ -1792,17 +1796,17 @@ static const char _simgui_vs_source_wgsl[1083] = {
0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x75,0x76,0x2c,0x20,0x63,
0x6f,0x6c,0x6f,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _simgui_fs_source_wgsl[630] = {
+static const uint8_t _simgui_fs_source_wgsl[630] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,
0x76,0x61,0x74,0x65,0x3e,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,
0x20,0x3a,0x20,0x76,0x65,0x63,0x34,0x66,0x3b,0x0a,0x0a,0x40,0x67,0x72,0x6f,0x75,
- 0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x28,0x33,0x32,
+ 0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x28,0x34,0x38,
0x29,0x20,0x76,0x61,0x72,0x20,0x74,0x65,0x78,0x20,0x3a,0x20,0x74,0x65,0x78,0x74,
0x75,0x72,0x65,0x5f,0x32,0x64,0x3c,0x66,0x33,0x32,0x3e,0x3b,0x0a,0x0a,0x40,0x67,
0x72,0x6f,0x75,0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,
- 0x28,0x34,0x38,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,0x20,0x3a,0x20,0x73,
+ 0x28,0x36,0x34,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,0x20,0x3a,0x20,0x73,
0x61,0x6d,0x70,0x6c,0x65,0x72,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,
0x76,0x61,0x74,0x65,0x3e,0x20,0x75,0x76,0x20,0x3a,0x20,0x76,0x65,0x63,0x32,0x66,
0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x3e,0x20,
@@ -1838,7 +1842,7 @@ static const char _simgui_fs_source_wgsl[630] = {
static const char* _simgui_vs_source_dummy = "";
static const char* _simgui_fs_source_dummy = "";
#else
-#error "Please define one of SOKOL_GLCORE33, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
+#error "Please define one of SOKOL_GLCORE, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
#endif
#if !defined(SOKOL_IMGUI_NO_SOKOL_APP)
@@ -2251,12 +2255,12 @@ SOKOL_API_IMPL void simgui_setup(const simgui_desc_t* desc) {
shd_desc.fs.image_sampler_pairs[0].sampler_slot = 0;
shd_desc.fs.image_sampler_pairs[0].glsl_name = "tex_smp";
shd_desc.label = "sokol-imgui-shader";
- #if defined(SOKOL_GLCORE33)
- shd_desc.vs.source = _simgui_vs_source_glsl330;
- shd_desc.fs.source = _simgui_fs_source_glsl330;
+ #if defined(SOKOL_GLCORE)
+ shd_desc.vs.source = (const char*)_simgui_vs_source_glsl410;
+ shd_desc.fs.source = (const char*)_simgui_fs_source_glsl410;
#elif defined(SOKOL_GLES3)
- shd_desc.vs.source = _simgui_vs_source_glsl300es;
- shd_desc.fs.source = _simgui_fs_source_glsl300es;
+ shd_desc.vs.source = (const char*)_simgui_vs_source_glsl300es;
+ shd_desc.fs.source = (const char*)_simgui_fs_source_glsl300es;
#elif defined(SOKOL_METAL)
shd_desc.vs.entry = "main0";
shd_desc.fs.entry = "main0";
@@ -2270,16 +2274,16 @@ SOKOL_API_IMPL void simgui_setup(const simgui_desc_t* desc) {
shd_desc.fs.bytecode = SG_RANGE(_simgui_fs_bytecode_metal_ios);
break;
default:
- shd_desc.vs.source = _simgui_vs_source_metal_sim;
- shd_desc.fs.source = _simgui_fs_source_metal_sim;
+ shd_desc.vs.source = (const char*)_simgui_vs_source_metal_sim;
+ shd_desc.fs.source = (const char*)_simgui_fs_source_metal_sim;
break;
}
#elif defined(SOKOL_D3D11)
shd_desc.vs.bytecode = SG_RANGE(_simgui_vs_bytecode_hlsl4);
shd_desc.fs.bytecode = SG_RANGE(_simgui_fs_bytecode_hlsl4);
#elif defined(SOKOL_WGPU)
- shd_desc.vs.source = _simgui_vs_source_wgsl;
- shd_desc.fs.source = _simgui_fs_source_wgsl;
+ shd_desc.vs.source = (const char*)_simgui_vs_source_wgsl;
+ shd_desc.fs.source = (const char*)_simgui_fs_source_wgsl;
#else
shd_desc.vs.source = _simgui_vs_source_dummy;
shd_desc.fs.source = _simgui_fs_source_dummy;
diff --git a/util/sokol_nuklear.h b/util/sokol_nuklear.h
index 04e73eac..06229f71 100644
--- a/util/sokol_nuklear.h
+++ b/util/sokol_nuklear.h
@@ -18,7 +18,7 @@
platform-specific embedded shader code (these are the same defines as
used by sokol_gfx.h and sokol_app.h):
- SOKOL_GLCORE33
+ SOKOL_GLCORE
SOKOL_GLES3
SOKOL_D3D11
SOKOL_METAL
@@ -582,7 +582,7 @@ static _snk_state_t _snuklear;
/*
Embedded source code compiled with:
- sokol-shdc -i snuk.glsl -o snuk.h -l glsl330:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgsl -b
+ sokol-shdc -i snuk.glsl -o snuk.h -l glsl410:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgsl -b
(not that for Metal and D3D11 byte code, sokol-shdc must be run
on macOS and Windows)
@@ -616,47 +616,51 @@ static _snk_state_t _snuklear;
@program snuk vs fs
*/
-#if defined(SOKOL_GLCORE33)
-static const char _snk_vs_source_glsl330[341] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e,
+#if defined(SOKOL_GLCORE)
+static const uint8_t _snk_vs_source_glsl410[383] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x76,0x73,0x5f,0x70,0x61,
0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,
0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,
0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,
- 0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,
- 0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,
- 0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,
- 0x72,0x64,0x30,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,
- 0x6c,0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
- 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,
- 0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,
- 0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,
- 0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,
- 0x28,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x2f,0x20,0x76,0x73,0x5f,
- 0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2e,0x78,0x79,0x29,0x20,0x2d,0x20,
- 0x76,0x65,0x63,0x32,0x28,0x30,0x2e,0x35,0x29,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,
- 0x32,0x28,0x32,0x2e,0x30,0x2c,0x20,0x2d,0x32,0x2e,0x30,0x29,0x2c,0x20,0x30,0x2e,
- 0x35,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x76,0x20,
- 0x3d,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x20,0x20,0x20,
- 0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,
- 0x0a,0x7d,0x0a,0x0a,0x00,
+ 0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,
+ 0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,
+ 0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,
+ 0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x74,
+ 0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
+ 0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x6f,
+ 0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x6c,
+ 0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,
+ 0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,
+ 0x72,0x30,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,
+ 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,
+ 0x6f,0x6e,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x28,0x28,0x70,0x6f,0x73,0x69,
+ 0x74,0x69,0x6f,0x6e,0x20,0x2f,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,
+ 0x5b,0x30,0x5d,0x2e,0x78,0x79,0x29,0x20,0x2d,0x20,0x76,0x65,0x63,0x32,0x28,0x30,
+ 0x2e,0x35,0x29,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x32,0x28,0x32,0x2e,0x30,0x2c,
+ 0x20,0x2d,0x32,0x2e,0x30,0x29,0x2c,0x20,0x30,0x2e,0x35,0x2c,0x20,0x31,0x2e,0x30,
+ 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x76,0x20,0x3d,0x20,0x74,0x65,0x78,0x63,
+ 0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,
+ 0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _snk_fs_source_glsl330[177] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e,
+static const uint8_t _snk_fs_source_glsl410[219] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,
0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,
0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,
- 0x6f,0x72,0x3b,0x0a,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,0x3b,0x0a,
- 0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,
- 0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,
- 0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,
- 0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x2c,0x20,
- 0x75,0x76,0x29,0x20,0x2a,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x7d,0x0a,0x0a,
- 0x00,
+ 0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,
+ 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,
+ 0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
+ 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,
+ 0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,
+ 0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,
+ 0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,
+ 0x28,0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x75,0x76,0x29,0x20,0x2a,0x20,
+ 0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
#elif defined(SOKOL_GLES3)
-static const char _snk_vs_source_glsl300es[344] = {
+static const uint8_t _snk_vs_source_glsl300es[344] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x76,0x73,
0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,
@@ -680,7 +684,7 @@ static const char _snk_vs_source_glsl300es[344] = {
0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,
0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _snk_fs_source_glsl300es[250] = {
+static const uint8_t _snk_fs_source_glsl300es[250] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x70,0x72,0x65,0x63,0x69,0x73,0x69,0x6f,0x6e,0x20,0x6d,0x65,0x64,0x69,0x75,0x6d,
0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3b,0x0a,0x70,0x72,0x65,0x63,0x69,0x73,0x69,
@@ -1441,7 +1445,7 @@ static const uint8_t _snk_fs_bytecode_metal_ios[2809] = {
0x0c,0x05,0x11,0x58,0x90,0xc8,0x67,0xb6,0x81,0x08,0x80,0x0c,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
-static const char _snk_vs_source_metal_sim[672] = {
+static const uint8_t _snk_vs_source_metal_sim[672] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -1486,7 +1490,7 @@ static const char _snk_vs_source_metal_sim[672] = {
0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _snk_fs_source_metal_sim[436] = {
+static const uint8_t _snk_fs_source_metal_sim[436] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -1616,7 +1620,7 @@ static const uint8_t _snk_fs_bytecode_hlsl4[608] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
#elif defined(SOKOL_WGPU)
-static const char _snk_vs_source_wgsl[1083] = {
+static const uint8_t _snk_vs_source_wgsl[1083] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,
@@ -1686,17 +1690,17 @@ static const char _snk_vs_source_wgsl[1083] = {
0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x75,0x76,0x2c,0x20,0x63,
0x6f,0x6c,0x6f,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _snk_fs_source_wgsl[630] = {
+static const uint8_t _snk_fs_source_wgsl[630] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,
0x76,0x61,0x74,0x65,0x3e,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,
0x20,0x3a,0x20,0x76,0x65,0x63,0x34,0x66,0x3b,0x0a,0x0a,0x40,0x67,0x72,0x6f,0x75,
- 0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x28,0x33,0x32,
+ 0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x28,0x34,0x38,
0x29,0x20,0x76,0x61,0x72,0x20,0x74,0x65,0x78,0x20,0x3a,0x20,0x74,0x65,0x78,0x74,
0x75,0x72,0x65,0x5f,0x32,0x64,0x3c,0x66,0x33,0x32,0x3e,0x3b,0x0a,0x0a,0x40,0x67,
0x72,0x6f,0x75,0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,
- 0x28,0x34,0x38,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,0x20,0x3a,0x20,0x73,
+ 0x28,0x36,0x34,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,0x20,0x3a,0x20,0x73,
0x61,0x6d,0x70,0x6c,0x65,0x72,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,
0x76,0x61,0x74,0x65,0x3e,0x20,0x75,0x76,0x20,0x3a,0x20,0x76,0x65,0x63,0x32,0x66,
0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x3e,0x20,
@@ -1732,7 +1736,7 @@ static const char _snk_fs_source_wgsl[630] = {
static const char* _snk_vs_source_dummy = "";
static const char* _snk_fs_source_dummy = "";
#else
-#error "Please define one of SOKOL_GLCORE33, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
+#error "Please define one of SOKOL_GLCORE, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
#endif
#if !defined(SOKOL_NUKLEAR_NO_SOKOL_APP)
@@ -2174,12 +2178,12 @@ SOKOL_API_IMPL void snk_setup(const snk_desc_t* desc) {
sg_range fs_bytecode = { .ptr = 0, .size = 0 };
const char* vs_source = 0;
const char* fs_source = 0;
- #if defined(SOKOL_GLCORE33)
- vs_source = _snk_vs_source_glsl330;
- fs_source = _snk_fs_source_glsl330;
+ #if defined(SOKOL_GLCORE)
+ vs_source = (const char*)_snk_vs_source_glsl410;
+ fs_source = (const char*)_snk_fs_source_glsl410;
#elif defined(SOKOL_GLES3)
- vs_source = _snk_vs_source_glsl300es;
- fs_source = _snk_fs_source_glsl300es;
+ vs_source = (const char*)_snk_vs_source_glsl300es;
+ fs_source = (const char*)_snk_fs_source_glsl300es;
#elif defined(SOKOL_METAL)
switch (sg_query_backend()) {
case SG_BACKEND_METAL_MACOS:
@@ -2191,16 +2195,16 @@ SOKOL_API_IMPL void snk_setup(const snk_desc_t* desc) {
fs_bytecode = SG_RANGE(_snk_fs_bytecode_metal_ios);
break;
default:
- vs_source = _snk_vs_source_metal_sim;
- fs_source = _snk_fs_source_metal_sim;
+ vs_source = (const char*)_snk_vs_source_metal_sim;
+ fs_source = (const char*)_snk_fs_source_metal_sim;
break;
}
#elif defined(SOKOL_D3D11)
vs_bytecode = SG_RANGE(_snk_vs_bytecode_hlsl4);
fs_bytecode = SG_RANGE(_snk_fs_bytecode_hlsl4);
#elif defined(SOKOL_WGPU)
- vs_source = _snk_vs_source_wgsl;
- fs_source = _snk_fs_source_wgsl;
+ vs_source = (const char*)_snk_vs_source_wgsl;
+ fs_source = (const char*)_snk_fs_source_wgsl;
#else
vs_source = _snk_vs_source_dummy;
fs_source = _snk_fs_source_dummy;
diff --git a/util/sokol_spine.h b/util/sokol_spine.h
index f76d2bf4..4eb9b66a 100644
--- a/util/sokol_spine.h
+++ b/util/sokol_spine.h
@@ -19,7 +19,7 @@
platform-specific embedded shader code (these are the same defines as
used by sokol_gfx.h and sokol_app.h):
- SOKOL_GLCORE33
+ SOKOL_GLCORE
SOKOL_GLES3
SOKOL_D3D11
SOKOL_METAL
@@ -1436,7 +1436,7 @@ SOKOL_SPINE_API_DECL void sspine_set_skin(sspine_instance instance, sspine_skin
/*
Embedded source compiled with:
- sokol-shdc -i sspine.glsl -o sspine.h -l glsl330:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgsl -b
+ sokol-shdc -i sspine.glsl -o sspine.h -l glsl410:glsl300es:hlsl4:metal_macos:metal_ios:metal_sim:wgsl -b
@vs vs
uniform vs_params {
@@ -1472,56 +1472,60 @@ SOKOL_SPINE_API_DECL void sspine_set_skin(sspine_instance instance, sspine_skin
@program sspine vs fs
*/
-#if defined(SOKOL_GLCORE33)
-static const char _sspine_vs_source_glsl330[352] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e,
+#if defined(SOKOL_GLCORE)
+static const uint8_t _sspine_vs_source_glsl410[394] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x76,0x73,0x5f,0x70,0x61,
0x72,0x61,0x6d,0x73,0x5b,0x34,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,
0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,
0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,
- 0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,
- 0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,
- 0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,
- 0x72,0x64,0x30,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,
- 0x6c,0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
- 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,
- 0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,
- 0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,
- 0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,
- 0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2c,0x20,0x76,0x73,
- 0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,
- 0x61,0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,
- 0x61,0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x34,0x28,0x70,
- 0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,
- 0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x76,0x20,0x3d,0x20,0x74,0x65,0x78,
- 0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,
- 0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
-
+ 0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,
+ 0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,
+ 0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,
+ 0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x74,
+ 0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
+ 0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x6f,
+ 0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x6c,
+ 0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,
+ 0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,
+ 0x72,0x30,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,
+ 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,
+ 0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x76,0x73,0x5f,0x70,0x61,0x72,
+ 0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,
+ 0x73,0x5b,0x31,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,
+ 0x32,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d,
+ 0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x34,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,
+ 0x6e,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,
+ 0x20,0x20,0x75,0x76,0x20,0x3d,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x30,
+ 0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,
+ 0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _sspine_fs_source_glsl330[308] = {
- 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e,
+static const uint8_t _sspine_fs_source_glsl410[350] = {
+ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x31,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x73,0x5f,0x70,0x61,
0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x3b,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,
0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,0x74,0x65,0x78,0x5f,0x73,
- 0x6d,0x70,0x3b,0x0a,0x0a,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,0x3b,
- 0x0a,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,
- 0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,
- 0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,
- 0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,
- 0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,
- 0x34,0x20,0x5f,0x32,0x38,0x20,0x3d,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,
- 0x74,0x65,0x78,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x75,0x76,0x29,0x20,0x2a,0x20,0x63,
- 0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,
- 0x5f,0x33,0x37,0x20,0x3d,0x20,0x5f,0x32,0x38,0x2e,0x77,0x3b,0x0a,0x20,0x20,0x20,
- 0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69,
- 0x78,0x28,0x5f,0x32,0x38,0x2c,0x20,0x76,0x65,0x63,0x34,0x28,0x5f,0x32,0x38,0x2e,
- 0x78,0x79,0x7a,0x20,0x2a,0x20,0x5f,0x33,0x37,0x2c,0x20,0x5f,0x33,0x37,0x29,0x20,
- 0x2a,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x76,0x65,0x63,0x34,0x28,0x66,0x73,
- 0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2e,0x78,0x29,0x29,0x3b,0x0a,
- 0x7d,0x0a,0x0a,0x00,
+ 0x6d,0x70,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,
+ 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,
+ 0x32,0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,
+ 0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,
+ 0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,
+ 0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,
+ 0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,
+ 0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,
+ 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x32,0x38,0x20,
+ 0x3d,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x74,0x65,0x78,0x5f,0x73,0x6d,
+ 0x70,0x2c,0x20,0x75,0x76,0x29,0x20,0x2a,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,
+ 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x37,0x20,0x3d,0x20,
+ 0x5f,0x32,0x38,0x2e,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,
+ 0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x5f,0x32,0x38,0x2c,
+ 0x20,0x76,0x65,0x63,0x34,0x28,0x5f,0x32,0x38,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,
+ 0x5f,0x33,0x37,0x2c,0x20,0x5f,0x33,0x37,0x29,0x20,0x2a,0x20,0x63,0x6f,0x6c,0x6f,
+ 0x72,0x2c,0x20,0x76,0x65,0x63,0x34,0x28,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,
+ 0x73,0x5b,0x30,0x5d,0x2e,0x78,0x29,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
#elif defined(SOKOL_GLES3)
-static const char _sspine_vs_source_glsl300es[355] = {
+static const uint8_t _sspine_vs_source_glsl300es[355] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x76,0x73,
0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x34,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,
@@ -1546,7 +1550,7 @@ static const char _sspine_vs_source_glsl300es[355] = {
0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,
0x0a,0x0a,0x00,
};
-static const char _sspine_fs_source_glsl300es[399] = {
+static const uint8_t _sspine_fs_source_glsl300es[399] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a,
0x70,0x72,0x65,0x63,0x69,0x73,0x69,0x6f,0x6e,0x20,0x6d,0x65,0x64,0x69,0x75,0x6d,
0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3b,0x0a,0x70,0x72,0x65,0x63,0x69,0x73,0x69,
@@ -2487,7 +2491,7 @@ static const uint8_t _sspine_fs_bytecode_metal_ios[3241] = {
0x01,0x31,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x5b,0x86,0x24,0xf8,0x03,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
-static const char _sspine_vs_source_metal_sim[624] = {
+static const uint8_t _sspine_vs_source_metal_sim[624] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -2529,7 +2533,7 @@ static const char _sspine_vs_source_metal_sim[624] = {
0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _sspine_fs_source_metal_sim[619] = {
+static const uint8_t _sspine_fs_source_metal_sim[619] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,
0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,
0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,
@@ -2571,7 +2575,7 @@ static const char _sspine_fs_source_metal_sim[619] = {
0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
#elif defined(SOKOL_WGPU)
-static const char _sspine_vs_source_wgsl[1003] = {
+static const uint8_t _sspine_vs_source_wgsl[1003] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,
@@ -2636,7 +2640,7 @@ static const char _sspine_vs_source_wgsl[1003] = {
0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x75,0x76,0x2c,0x20,0x63,
0x6f,0x6c,0x6f,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
-static const char _sspine_fs_source_wgsl[1125] = {
+static const uint8_t _sspine_fs_source_wgsl[1125] = {
0x64,0x69,0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x28,0x6f,0x66,0x66,0x2c,0x20,
0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x5f,0x75,0x6e,0x69,0x66,0x6f,
0x72,0x6d,0x69,0x74,0x79,0x29,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,
@@ -2644,10 +2648,10 @@ static const char _sspine_fs_source_wgsl[1125] = {
0x20,0x40,0x6f,0x66,0x66,0x73,0x65,0x74,0x28,0x30,0x29,0x20,0x2a,0x2f,0x0a,0x20,
0x20,0x70,0x6d,0x61,0x20,0x3a,0x20,0x66,0x33,0x32,0x2c,0x0a,0x7d,0x0a,0x0a,0x40,
0x67,0x72,0x6f,0x75,0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,0x64,0x69,0x6e,
- 0x67,0x28,0x33,0x32,0x29,0x20,0x76,0x61,0x72,0x20,0x74,0x65,0x78,0x20,0x3a,0x20,
+ 0x67,0x28,0x34,0x38,0x29,0x20,0x76,0x61,0x72,0x20,0x74,0x65,0x78,0x20,0x3a,0x20,
0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x5f,0x32,0x64,0x3c,0x66,0x33,0x32,0x3e,0x3b,
0x0a,0x0a,0x40,0x67,0x72,0x6f,0x75,0x70,0x28,0x31,0x29,0x20,0x40,0x62,0x69,0x6e,
- 0x64,0x69,0x6e,0x67,0x28,0x34,0x38,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,
+ 0x64,0x69,0x6e,0x67,0x28,0x36,0x34,0x29,0x20,0x76,0x61,0x72,0x20,0x73,0x6d,0x70,
0x20,0x3a,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x3b,0x0a,0x0a,0x76,0x61,0x72,
0x3c,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x3e,0x20,0x75,0x76,0x20,0x3a,0x20,0x76,
0x65,0x63,0x32,0x66,0x3b,0x0a,0x0a,0x76,0x61,0x72,0x3c,0x70,0x72,0x69,0x76,0x61,
@@ -2713,7 +2717,7 @@ static const char _sspine_fs_source_wgsl[1125] = {
static const char* _sspine_vs_source_dummy = "";
static const char* _sspine_fs_source_dummy = "";
#else
-#error "Please define one of SOKOL_GLCORE33, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
+#error "Please define one of SOKOL_GLCORE, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND!"
#endif
// ███████ ████████ ██████ ██ ██ ██████ ████████ ███████
@@ -4664,12 +4668,12 @@ static void _sspine_init_shared(void) {
shd_desc.fs.image_sampler_pairs[0].sampler_slot = 0;
shd_desc.fs.image_sampler_pairs[0].glsl_name = "tex_smp";
shd_desc.label = "sspine-shader";
- #if defined(SOKOL_GLCORE33)
- shd_desc.vs.source = _sspine_vs_source_glsl330;
- shd_desc.fs.source = _sspine_fs_source_glsl330;
+ #if defined(SOKOL_GLCORE)
+ shd_desc.vs.source = (const char*)_sspine_vs_source_glsl410;
+ shd_desc.fs.source = (const char*)_sspine_fs_source_glsl410;
#elif defined(SOKOL_GLES3)
- shd_desc.vs.source = _sspine_vs_source_glsl300es;
- shd_desc.fs.source = _sspine_fs_source_glsl300es;
+ shd_desc.vs.source = (const char*)_sspine_vs_source_glsl300es;
+ shd_desc.fs.source = (const char*)_sspine_fs_source_glsl300es;
#elif defined(SOKOL_METAL)
shd_desc.vs.entry = "main0";
shd_desc.fs.entry = "main0";
@@ -4683,16 +4687,16 @@ static void _sspine_init_shared(void) {
shd_desc.fs.bytecode = SG_RANGE(_sspine_fs_bytecode_metal_ios);
break;
default:
- shd_desc.vs.source = _sspine_vs_source_metal_sim;
- shd_desc.fs.source = _sspine_fs_source_metal_sim;
+ shd_desc.vs.source = (const char*)_sspine_vs_source_metal_sim;
+ shd_desc.fs.source = (const char*)_sspine_fs_source_metal_sim;
break;
}
#elif defined(SOKOL_D3D11)
shd_desc.vs.bytecode = SG_RANGE(_sspine_vs_bytecode_hlsl4);
shd_desc.fs.bytecode = SG_RANGE(_sspine_fs_bytecode_hlsl4);
#elif defined(SOKOL_WGPU)
- shd_desc.vs.source = _sspine_vs_source_wgsl;
- shd_desc.fs.source = _sspine_fs_source_wgsl;
+ shd_desc.vs.source = (const char*)_sspine_vs_source_wgsl;
+ shd_desc.fs.source = (const char*)_sspine_fs_source_wgsl;
#else
shd_desc.vs.source = _sspine_vs_source_dummy;
shd_desc.fs.source = _sspine_fs_source_dummy;