get this project started again for the 4th time
parent
7d0cd89ccd
commit
50ce2372eb
|
@ -0,0 +1,111 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1710146030,
|
||||||
|
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1659877975,
|
||||||
|
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixgl": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_2",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1685908677,
|
||||||
|
"narHash": "sha256-E4zUPEUFyVWjVm45zICaHRpfGepfkE9Z2OECV9HXfA4=",
|
||||||
|
"owner": "guibou",
|
||||||
|
"repo": "nixGL",
|
||||||
|
"rev": "489d6b095ab9d289fe11af0219a9ff00fe87c7c5",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "guibou",
|
||||||
|
"repo": "nixGL",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1660551188,
|
||||||
|
"narHash": "sha256-a1LARMMYQ8DPx1BgoI/UN4bXe12hhZkCNqdxNi6uS0g=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "441dc5d512153039f19ef198e662e4f3dbb9fd65",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1710272261,
|
||||||
|
"narHash": "sha256-g0bDwXFmTE7uGDOs9HcJsfLFhH7fOsASbAuOzDC+fhQ=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "0ad13a6833440b8e238947e47bea7f11071dc2b2",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixgl": "nixgl",
|
||||||
|
"nixpkgs": "nixpkgs_2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
nixgl.url = "github:guibou/nixGL";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, flake-utils, nixgl, ... }:
|
||||||
|
flake-utils.lib.eachDefaultSystem (system:
|
||||||
|
let
|
||||||
|
overlays = [ nixgl.overlay ];
|
||||||
|
pkgs = import nixpkgs {
|
||||||
|
inherit system overlays;
|
||||||
|
};
|
||||||
|
naga-cli = pkgs.rustPlatform.buildRustPackage rec {
|
||||||
|
pname = "naga-cli";
|
||||||
|
version = "0.19.0";
|
||||||
|
|
||||||
|
src = pkgs.fetchCrate {
|
||||||
|
inherit pname version;
|
||||||
|
hash = "sha256-zR7Al5aMG8VTdjZwaZtjeDFI6WFD0N6MCrrLP/9PeZ8=";
|
||||||
|
};
|
||||||
|
|
||||||
|
cargoHash = "sha256-/5srWh4CjD8S/hRFRTJE//X6TgIfbwnMKmgRMjX3084=";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
devShell = pkgs.mkShell {
|
||||||
|
buildInputs = with pkgs; (if pkgs.system == "aarch64-darwin" || pkgs.system == "x86_64-darwin" then [
|
||||||
|
pkg-config
|
||||||
|
binutils
|
||||||
|
clang
|
||||||
|
naga-cli
|
||||||
|
darwin.apple_sdk.frameworks.Kernel
|
||||||
|
darwin.apple_sdk.frameworks.CoreVideo
|
||||||
|
darwin.apple_sdk.frameworks.Metal
|
||||||
|
darwin.apple_sdk.frameworks.MetalKit
|
||||||
|
darwin.apple_sdk.frameworks.Cocoa
|
||||||
|
] else throw "unsupported system" );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
alias b := build
|
||||||
|
alias r := run
|
||||||
|
|
||||||
|
build: transpile_shaders_metal
|
||||||
|
mkdir -p bin
|
||||||
|
cc -Ivendor/ -g -Wall -Wextra -framework Cocoa -framework QuartzCore -framework CoreImage -framework Metal -framework MetalKit -ObjC src/*.c -o bin/an_editor
|
||||||
|
|
||||||
|
run: build
|
||||||
|
./bin/an_editor
|
||||||
|
|
||||||
|
transpile_shaders_metal:
|
||||||
|
mkdir -p bin/transpiled_shaders
|
||||||
|
naga shaders/vertex.wgsl bin/transpiled_shaders/vertex.metal
|
||||||
|
naga shaders/fragment.wgsl bin/transpiled_shaders/fragment.metal
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
struct VertexOutput {
|
||||||
|
@builtin(position) position: vec4<f32>,
|
||||||
|
@location(0) color: vec4<f32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
@fragment
|
||||||
|
fn fs_main(input: VertexOutput) -> @location(0) vec4<f32> {
|
||||||
|
return input.color;
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
struct VertexInput {
|
||||||
|
@location(0) position: vec3<f32>,
|
||||||
|
@location(1) color: vec4<f32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct VertexOutput {
|
||||||
|
@builtin(position) position: vec4<f32>,
|
||||||
|
@location(0) color: vec4<f32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
@vertex
|
||||||
|
fn vs_main(input: VertexInput) -> VertexOutput {
|
||||||
|
var out: VertexOutput;
|
||||||
|
out.position = vec4<f32>(input.position, 1.);
|
||||||
|
out.color = input.color;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
-I/usr/include/
|
||||||
|
-I../vendor/
|
||||||
|
-ObjC
|
|
@ -0,0 +1,145 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#define SOKOL_DEBUG
|
||||||
|
|
||||||
|
#define SOKOL_APP_IMPL
|
||||||
|
#define SOKOL_GFX_IMPL
|
||||||
|
#define SOKOL_GLUE_IMPL
|
||||||
|
#define SOKOL_FETCH_IMPL
|
||||||
|
#define SOKOL_LOG_IMPL
|
||||||
|
#define SOKOL_METAL
|
||||||
|
#include <sokol/sokol_log.h>
|
||||||
|
#include <sokol/sokol_gfx.h>
|
||||||
|
#include <sokol/sokol_app.h>
|
||||||
|
#include <sokol/sokol_glue.h>
|
||||||
|
#include <sokol/sokol_fetch.h>
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
sg_pass_action pass_action;
|
||||||
|
sg_pipeline pip;
|
||||||
|
sg_bindings bind;
|
||||||
|
|
||||||
|
sg_shader_desc scratch_shader_desc;
|
||||||
|
|
||||||
|
bool should_exit;
|
||||||
|
} state;
|
||||||
|
|
||||||
|
void vertex_shader_loaded(const sfetch_response_t *response) {
|
||||||
|
if (response->fetched) {
|
||||||
|
state.scratch_shader_desc.vs.source = response->data.ptr;
|
||||||
|
state.scratch_shader_desc.vs.entry = "vs_main";
|
||||||
|
} else if (response->failed) {
|
||||||
|
fprintf(stderr, "failed to load vertex shader\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fragment_shader_loaded(const sfetch_response_t *response) {
|
||||||
|
if (response->fetched) {
|
||||||
|
state.scratch_shader_desc.fs.source = response->data.ptr;
|
||||||
|
state.scratch_shader_desc.fs.entry = "fs_main";
|
||||||
|
} else if (response->failed) {
|
||||||
|
fprintf(stderr, "failed to load vertex shader\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ed_init() {
|
||||||
|
sg_setup(&(sg_desc) {
|
||||||
|
.environment = sglue_environment(),
|
||||||
|
});
|
||||||
|
|
||||||
|
float vertices[] = {
|
||||||
|
// positions colors
|
||||||
|
-0.25f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f,
|
||||||
|
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f,
|
||||||
|
-0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
};
|
||||||
|
state.bind.vertex_buffers[0] = sg_make_buffer(&(sg_buffer_desc) {
|
||||||
|
.data = SG_RANGE(vertices)
|
||||||
|
});
|
||||||
|
|
||||||
|
const uint16_t indices[] = { 0, 1, 2, 0, 2, 3 };
|
||||||
|
state.bind.index_buffer = sg_make_buffer(&(sg_buffer_desc) {
|
||||||
|
.type = SG_BUFFERTYPE_INDEXBUFFER,
|
||||||
|
.data = SG_RANGE(indices)
|
||||||
|
});
|
||||||
|
|
||||||
|
sfetch_setup(&(sfetch_desc_t){ .logger.func = slog_func });
|
||||||
|
|
||||||
|
char vs_source[8000] = { 0 };
|
||||||
|
char fs_source[8000] = { 0 };
|
||||||
|
|
||||||
|
sfetch_handle_t vs_handle = sfetch_send(&(sfetch_request_t) {
|
||||||
|
.path = "./bin/transpiled_shaders/vertex.metal",
|
||||||
|
.callback = vertex_shader_loaded,
|
||||||
|
.buffer = { .ptr = vs_source, .size = sizeof(vs_source) },
|
||||||
|
});
|
||||||
|
sfetch_handle_t fs_handle = sfetch_send(&(sfetch_request_t) {
|
||||||
|
.path = "./bin/transpiled_shaders/fragment.metal",
|
||||||
|
.callback = fragment_shader_loaded,
|
||||||
|
.buffer = { .ptr = fs_source, .size = sizeof(fs_source) },
|
||||||
|
});
|
||||||
|
|
||||||
|
// block until files are loaded
|
||||||
|
while (sfetch_handle_valid(vs_handle) || sfetch_handle_valid(fs_handle)) {
|
||||||
|
sfetch_dowork();
|
||||||
|
}
|
||||||
|
|
||||||
|
sg_shader shd = sg_make_shader(&state.scratch_shader_desc);
|
||||||
|
state.pip = sg_make_pipeline(&(sg_pipeline_desc) {
|
||||||
|
.shader = shd,
|
||||||
|
.index_type = SG_INDEXTYPE_UINT16,
|
||||||
|
.layout = {
|
||||||
|
.attrs = {
|
||||||
|
[0] = { .offset=0, .format=SG_VERTEXFORMAT_FLOAT3 },
|
||||||
|
[1] = { .offset=12, .format=SG_VERTEXFORMAT_FLOAT4 },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
void ed_frame() {
|
||||||
|
sg_begin_pass(&(sg_pass) { .action = state.pass_action, .swapchain = sglue_swapchain() });
|
||||||
|
sg_apply_pipeline(state.pip);
|
||||||
|
sg_apply_bindings(&state.bind);
|
||||||
|
sg_draw(0, 6, 1);
|
||||||
|
sg_end_pass();
|
||||||
|
sg_commit();
|
||||||
|
}
|
||||||
|
void ed_cleanup() {
|
||||||
|
sfetch_shutdown();
|
||||||
|
sg_shutdown();
|
||||||
|
}
|
||||||
|
void ed_event(const sapp_event *event) {
|
||||||
|
switch (event->type) {
|
||||||
|
case SAPP_EVENTTYPE_MOUSE_DOWN:
|
||||||
|
if (event->mouse_button == SAPP_MOUSEBUTTON_LEFT) {
|
||||||
|
sapp_lock_mouse(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SAPP_EVENTTYPE_MOUSE_UP:
|
||||||
|
if (event->mouse_button == SAPP_MOUSEBUTTON_LEFT) {
|
||||||
|
sapp_lock_mouse(false);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sapp_desc sokol_main(int argc, char *argv[]) {
|
||||||
|
return (sapp_desc) {
|
||||||
|
.width = 640,
|
||||||
|
.height = 480,
|
||||||
|
.init_cb = ed_init,
|
||||||
|
.frame_cb = ed_frame,
|
||||||
|
.cleanup_cb = ed_cleanup,
|
||||||
|
.event_cb = ed_event,
|
||||||
|
.icon.sokol_default = true,
|
||||||
|
.logger.func = slog_func,
|
||||||
|
};
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,162 @@
|
||||||
|
#if defined(SOKOL_IMPL) && !defined(SOKOL_GLUE_IMPL)
|
||||||
|
#define SOKOL_GLUE_IMPL
|
||||||
|
#endif
|
||||||
|
#ifndef SOKOL_GLUE_INCLUDED
|
||||||
|
/*
|
||||||
|
sokol_glue.h -- glue helper functions for sokol headers
|
||||||
|
|
||||||
|
Project URL: https://github.com/floooh/sokol
|
||||||
|
|
||||||
|
Do this:
|
||||||
|
#define SOKOL_IMPL or
|
||||||
|
#define SOKOL_GLUE_IMPL
|
||||||
|
before you include this file in *one* C or C++ file to create the
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
...optionally provide the following macros to override defaults:
|
||||||
|
|
||||||
|
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||||
|
SOKOL_GLUE_API_DECL - public function declaration prefix (default: extern)
|
||||||
|
SOKOL_API_DECL - same as SOKOL_GLUE_API_DECL
|
||||||
|
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||||
|
|
||||||
|
If sokol_glue.h is compiled as a DLL, define the following before
|
||||||
|
including the declaration or implementation:
|
||||||
|
|
||||||
|
SOKOL_DLL
|
||||||
|
|
||||||
|
On Windows, SOKOL_DLL will define SOKOL_GLUE_API_DECL as __declspec(dllexport)
|
||||||
|
or __declspec(dllimport) as needed.
|
||||||
|
|
||||||
|
OVERVIEW
|
||||||
|
========
|
||||||
|
sokol_glue.h provides glue helper functions between sokol_gfx.h and sokol_app.h,
|
||||||
|
so that sokol_gfx.h doesn't need to depend on sokol_app.h but can be
|
||||||
|
used with different window system glue libraries.
|
||||||
|
|
||||||
|
PROVIDED FUNCTIONS
|
||||||
|
==================
|
||||||
|
|
||||||
|
sg_environment sglue_environment(void)
|
||||||
|
|
||||||
|
Returns an sg_environment struct initialized by calling sokol_app.h
|
||||||
|
functions. Use this in the sg_setup() call like this:
|
||||||
|
|
||||||
|
sg_setup(&(sg_desc){
|
||||||
|
.environment = sglue_enviornment(),
|
||||||
|
...
|
||||||
|
});
|
||||||
|
|
||||||
|
sg_swapchain sglue_swapchain(void)
|
||||||
|
|
||||||
|
Returns an sg_swapchain struct initialized by calling sokol_app.h
|
||||||
|
functions. Use this in sg_begin_pass() for a 'swapchain pass' like
|
||||||
|
this:
|
||||||
|
|
||||||
|
sg_begin_pass(&(sg_pass){ .swapchain = sglue_swapchain(), ... });
|
||||||
|
|
||||||
|
LICENSE
|
||||||
|
=======
|
||||||
|
zlib/libpng license
|
||||||
|
|
||||||
|
Copyright (c) 2018 Andre Weissflog
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
In no event will the authors be held liable for any damages arising from the
|
||||||
|
use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software in a
|
||||||
|
product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
be misrepresented as being the original software.
|
||||||
|
|
||||||
|
3. This notice may not be removed or altered from any source
|
||||||
|
distribution.
|
||||||
|
*/
|
||||||
|
#define SOKOL_GLUE_INCLUDED
|
||||||
|
|
||||||
|
#if defined(SOKOL_API_DECL) && !defined(SOKOL_GLUE_API_DECL)
|
||||||
|
#define SOKOL_GLUE_API_DECL SOKOL_API_DECL
|
||||||
|
#endif
|
||||||
|
#ifndef SOKOL_GLUE_API_DECL
|
||||||
|
#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_GLUE_IMPL)
|
||||||
|
#define SOKOL_GLUE_API_DECL __declspec(dllexport)
|
||||||
|
#elif defined(_WIN32) && defined(SOKOL_DLL)
|
||||||
|
#define SOKOL_GLUE_API_DECL __declspec(dllimport)
|
||||||
|
#else
|
||||||
|
#define SOKOL_GLUE_API_DECL extern
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SOKOL_GFX_INCLUDED
|
||||||
|
#error "Please include sokol_gfx.h before sokol_glue.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SOKOL_GLUE_API_DECL sg_environment sglue_environment(void);
|
||||||
|
SOKOL_GLUE_API_DECL sg_swapchain sglue_swapchain(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
#endif /* SOKOL_GLUE_INCLUDED */
|
||||||
|
|
||||||
|
/*-- IMPLEMENTATION ----------------------------------------------------------*/
|
||||||
|
#ifdef SOKOL_GLUE_IMPL
|
||||||
|
#define SOKOL_GLUE_IMPL_INCLUDED (1)
|
||||||
|
#include <string.h> /* memset */
|
||||||
|
|
||||||
|
#ifndef SOKOL_APP_INCLUDED
|
||||||
|
#error "Please include sokol_app.h before the sokol_glue.h implementation"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SOKOL_API_IMPL
|
||||||
|
#define SOKOL_API_IMPL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
SOKOL_API_IMPL sg_environment sglue_environment(void) {
|
||||||
|
sg_environment env;
|
||||||
|
memset(&env, 0, sizeof(env));
|
||||||
|
env.defaults.color_format = (sg_pixel_format) sapp_color_format();
|
||||||
|
env.defaults.depth_format = (sg_pixel_format) sapp_depth_format();
|
||||||
|
env.defaults.sample_count = sapp_sample_count();
|
||||||
|
env.metal.device = sapp_metal_get_device();
|
||||||
|
env.d3d11.device = sapp_d3d11_get_device();
|
||||||
|
env.d3d11.device_context = sapp_d3d11_get_device_context();
|
||||||
|
env.wgpu.device = sapp_wgpu_get_device();
|
||||||
|
return env;
|
||||||
|
}
|
||||||
|
|
||||||
|
SOKOL_API_IMPL sg_swapchain sglue_swapchain(void) {
|
||||||
|
sg_swapchain swapchain;
|
||||||
|
memset(&swapchain, 0, sizeof(swapchain));
|
||||||
|
swapchain.width = sapp_width();
|
||||||
|
swapchain.height = sapp_height();
|
||||||
|
swapchain.sample_count = sapp_sample_count();
|
||||||
|
swapchain.color_format = (sg_pixel_format)sapp_color_format();
|
||||||
|
swapchain.depth_format = (sg_pixel_format)sapp_depth_format();
|
||||||
|
swapchain.metal.current_drawable = sapp_metal_get_current_drawable();
|
||||||
|
swapchain.metal.depth_stencil_texture = sapp_metal_get_depth_stencil_texture();
|
||||||
|
swapchain.metal.msaa_color_texture = sapp_metal_get_msaa_color_texture();
|
||||||
|
swapchain.d3d11.render_view = sapp_d3d11_get_render_view();
|
||||||
|
swapchain.d3d11.resolve_view = sapp_d3d11_get_resolve_view();
|
||||||
|
swapchain.d3d11.depth_stencil_view = sapp_d3d11_get_depth_stencil_view();
|
||||||
|
swapchain.wgpu.render_view = sapp_wgpu_get_render_view();
|
||||||
|
swapchain.wgpu.resolve_view = sapp_wgpu_get_resolve_view();
|
||||||
|
swapchain.wgpu.depth_stencil_view = sapp_wgpu_get_depth_stencil_view();
|
||||||
|
swapchain.gl.framebuffer = sapp_gl_get_framebuffer();
|
||||||
|
return swapchain;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SOKOL_GLUE_IMPL */
|
|
@ -0,0 +1,343 @@
|
||||||
|
#if defined(SOKOL_IMPL) && !defined(SOKOL_LOG_IMPL)
|
||||||
|
#define SOKOL_LOG_IMPL
|
||||||
|
#endif
|
||||||
|
#ifndef SOKOL_LOG_INCLUDED
|
||||||
|
/*
|
||||||
|
sokol_log.h -- common logging callback for sokol headers
|
||||||
|
|
||||||
|
Project URL: https://github.com/floooh/sokol
|
||||||
|
|
||||||
|
Example code: https://github.com/floooh/sokol-samples
|
||||||
|
|
||||||
|
Do this:
|
||||||
|
#define SOKOL_IMPL or
|
||||||
|
#define SOKOL_LOG_IMPL
|
||||||
|
before you include this file in *one* C or C++ file to create the
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
Optionally provide the following defines when building the implementation:
|
||||||
|
|
||||||
|
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||||
|
SOKOL_UNREACHABLE() - a guard macro for unreachable code (default: assert(false))
|
||||||
|
SOKOL_LOG_API_DECL - public function declaration prefix (default: extern)
|
||||||
|
SOKOL_API_DECL - same as SOKOL_GFX_API_DECL
|
||||||
|
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||||
|
|
||||||
|
Optionally define the following for verbose output:
|
||||||
|
|
||||||
|
SOKOL_DEBUG - by default this is defined if _DEBUG is defined
|
||||||
|
|
||||||
|
|
||||||
|
OVERVIEW
|
||||||
|
========
|
||||||
|
sokol_log.h provides a default logging callback for other sokol headers.
|
||||||
|
|
||||||
|
To use the default log callback, just include sokol_log.h and provide
|
||||||
|
a function pointer to the 'slog_func' function when setting up the
|
||||||
|
sokol library:
|
||||||
|
|
||||||
|
For instance with sokol_audio.h:
|
||||||
|
|
||||||
|
#include "sokol_log.h"
|
||||||
|
...
|
||||||
|
saudio_setup(&(saudio_desc){ .logger.func = slog_func });
|
||||||
|
|
||||||
|
Logging output goes to stderr and/or a platform specific logging subsystem
|
||||||
|
(which means that in some scenarios you might see logging messages duplicated):
|
||||||
|
|
||||||
|
- Windows: stderr + OutputDebugStringA()
|
||||||
|
- macOS/iOS/Linux: stderr + syslog()
|
||||||
|
- Emscripten: console.info()/warn()/error()
|
||||||
|
- Android: __android_log_write()
|
||||||
|
|
||||||
|
On Windows with sokol_app.h also note the runtime config items to make
|
||||||
|
stdout/stderr output visible on the console for WinMain() applications
|
||||||
|
via sapp_desc.win32_console_attach or sapp_desc.win32_console_create,
|
||||||
|
however when running in a debugger on Windows, the logging output should
|
||||||
|
show up on the debug output UI panel.
|
||||||
|
|
||||||
|
In debug mode, a log message might look like this:
|
||||||
|
|
||||||
|
[sspine][error][id:12] /Users/floh/projects/sokol/util/sokol_spine.h:3472:0:
|
||||||
|
SKELETON_DESC_NO_ATLAS: no atlas object provided in sspine_skeleton_desc.atlas
|
||||||
|
|
||||||
|
The source path and line number is formatted like compiler errors, in some IDEs (like VSCode)
|
||||||
|
such error messages are clickable.
|
||||||
|
|
||||||
|
In release mode, logging is less verbose as to not bloat the executable with string data, but you still get
|
||||||
|
enough information to identify the type and location of an error:
|
||||||
|
|
||||||
|
[sspine][error][id:12][line:3472]
|
||||||
|
|
||||||
|
RULES FOR WRITING YOUR OWN LOGGING FUNCTION
|
||||||
|
===========================================
|
||||||
|
- must be re-entrant because it might be called from different threads
|
||||||
|
- must treat **all** provided string pointers as optional (can be null)
|
||||||
|
- don't store the string pointers, copy the string data instead
|
||||||
|
- must not return for log level panic
|
||||||
|
|
||||||
|
LICENSE
|
||||||
|
=======
|
||||||
|
zlib/libpng license
|
||||||
|
|
||||||
|
Copyright (c) 2023 Andre Weissflog
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
In no event will the authors be held liable for any damages arising from the
|
||||||
|
use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software in a
|
||||||
|
product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
be misrepresented as being the original software.
|
||||||
|
|
||||||
|
3. This notice may not be removed or altered from any source
|
||||||
|
distribution.
|
||||||
|
*/
|
||||||
|
#define SOKOL_LOG_INCLUDED (1)
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#if defined(SOKOL_API_DECL) && !defined(SOKOL_LOG_API_DECL)
|
||||||
|
#define SOKOL_LOG_API_DECL SOKOL_API_DECL
|
||||||
|
#endif
|
||||||
|
#ifndef SOKOL_LOG_API_DECL
|
||||||
|
#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_LOG_IMPL)
|
||||||
|
#define SOKOL_LOG_API_DECL __declspec(dllexport)
|
||||||
|
#elif defined(_WIN32) && defined(SOKOL_DLL)
|
||||||
|
#define SOKOL_LOG_API_DECL __declspec(dllimport)
|
||||||
|
#else
|
||||||
|
#define SOKOL_LOG_API_DECL extern
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Plug this function into the 'logger.func' struct item when initializing any of the sokol
|
||||||
|
headers. For instance for sokol_audio.h it would loom like this:
|
||||||
|
|
||||||
|
saudio_setup(&(saudio_desc){
|
||||||
|
.logger = {
|
||||||
|
.func = slog_func
|
||||||
|
}
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
SOKOL_LOG_API_DECL void slog_func(const char* tag, uint32_t log_level, uint32_t log_item, const char* message, uint32_t line_nr, const char* filename, void* user_data);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
#endif
|
||||||
|
#endif // SOKOL_LOG_INCLUDED
|
||||||
|
|
||||||
|
// ██ ███ ███ ██████ ██ ███████ ███ ███ ███████ ███ ██ ████████ █████ ████████ ██ ██████ ███ ██
|
||||||
|
// ██ ████ ████ ██ ██ ██ ██ ████ ████ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██
|
||||||
|
// ██ ██ ████ ██ ██████ ██ █████ ██ ████ ██ █████ ██ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██
|
||||||
|
// ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
|
// ██ ██ ██ ██ ███████ ███████ ██ ██ ███████ ██ ████ ██ ██ ██ ██ ██ ██████ ██ ████
|
||||||
|
//
|
||||||
|
// >>implementation
|
||||||
|
#ifdef SOKOL_LOG_IMPL
|
||||||
|
#define SOKOL_LOG_IMPL_INCLUDED (1)
|
||||||
|
|
||||||
|
#ifndef SOKOL_API_IMPL
|
||||||
|
#define SOKOL_API_IMPL
|
||||||
|
#endif
|
||||||
|
#ifndef SOKOL_DEBUG
|
||||||
|
#ifndef NDEBUG
|
||||||
|
#define SOKOL_DEBUG
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef SOKOL_ASSERT
|
||||||
|
#include <assert.h>
|
||||||
|
#define SOKOL_ASSERT(c) assert(c)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _SOKOL_PRIVATE
|
||||||
|
#if defined(__GNUC__) || defined(__clang__)
|
||||||
|
#define _SOKOL_PRIVATE __attribute__((unused)) static
|
||||||
|
#else
|
||||||
|
#define _SOKOL_PRIVATE static
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _SOKOL_UNUSED
|
||||||
|
#define _SOKOL_UNUSED(x) (void)(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// platform detection
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
#define _SLOG_APPLE (1)
|
||||||
|
#elif defined(__EMSCRIPTEN__)
|
||||||
|
#define _SLOG_EMSCRIPTEN (1)
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
#define _SLOG_WINDOWS (1)
|
||||||
|
#elif defined(__ANDROID__)
|
||||||
|
#define _SLOG_ANDROID (1)
|
||||||
|
#elif defined(__linux__) || defined(__unix__)
|
||||||
|
#define _SLOG_LINUX (1)
|
||||||
|
#else
|
||||||
|
#error "sokol_log.h: unknown platform"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h> // abort
|
||||||
|
#include <stdio.h> // fputs
|
||||||
|
#include <stddef.h> // size_t
|
||||||
|
|
||||||
|
#if defined(_SLOG_EMSCRIPTEN)
|
||||||
|
#include <emscripten/emscripten.h>
|
||||||
|
#elif defined(_SLOG_WINDOWS)
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#ifndef NOMINMAX
|
||||||
|
#define NOMINMAX
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#elif defined(_SLOG_ANDROID)
|
||||||
|
#include <android/log.h>
|
||||||
|
#elif defined(_SLOG_LINUX) || defined(_SLOG_APPLE)
|
||||||
|
#include <syslog.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// size of line buffer (on stack!) in bytes including terminating zero
|
||||||
|
#define _SLOG_LINE_LENGTH (512)
|
||||||
|
|
||||||
|
_SOKOL_PRIVATE char* _slog_append(const char* str, char* dst, char* end) {
|
||||||
|
if (str) {
|
||||||
|
char c;
|
||||||
|
while (((c = *str++) != 0) && (dst < (end - 1))) {
|
||||||
|
*dst++ = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*dst = 0;
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
_SOKOL_PRIVATE char* _slog_itoa(uint32_t x, char* buf, size_t buf_size) {
|
||||||
|
const size_t max_digits_and_null = 11;
|
||||||
|
if (buf_size < max_digits_and_null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
char* p = buf + max_digits_and_null;
|
||||||
|
*--p = 0;
|
||||||
|
do {
|
||||||
|
*--p = '0' + (x % 10);
|
||||||
|
x /= 10;
|
||||||
|
} while (x != 0);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_SLOG_EMSCRIPTEN)
|
||||||
|
EM_JS(void, slog_js_log, (uint32_t level, const char* c_str), {
|
||||||
|
const str = UTF8ToString(c_str);
|
||||||
|
switch (level) {
|
||||||
|
case 0: console.error(str); break;
|
||||||
|
case 1: console.error(str); break;
|
||||||
|
case 2: console.warn(str); break;
|
||||||
|
default: console.info(str); break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SOKOL_API_IMPL void slog_func(const char* tag, uint32_t log_level, uint32_t log_item, const char* message, uint32_t line_nr, const char* filename, void* user_data) {
|
||||||
|
_SOKOL_UNUSED(user_data);
|
||||||
|
|
||||||
|
const char* log_level_str;
|
||||||
|
switch (log_level) {
|
||||||
|
case 0: log_level_str = "panic"; break;
|
||||||
|
case 1: log_level_str = "error"; break;
|
||||||
|
case 2: log_level_str = "warning"; break;
|
||||||
|
default: log_level_str = "info"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// build log output line
|
||||||
|
char line_buf[_SLOG_LINE_LENGTH];
|
||||||
|
char* str = line_buf;
|
||||||
|
char* end = line_buf + sizeof(line_buf);
|
||||||
|
char num_buf[32];
|
||||||
|
if (tag) {
|
||||||
|
str = _slog_append("[", str, end);
|
||||||
|
str = _slog_append(tag, str, end);
|
||||||
|
str = _slog_append("]", str, end);
|
||||||
|
}
|
||||||
|
str = _slog_append("[", str, end);
|
||||||
|
str = _slog_append(log_level_str, str, end);
|
||||||
|
str = _slog_append("]", str, end);
|
||||||
|
str = _slog_append("[id:", str, end);
|
||||||
|
str = _slog_append(_slog_itoa(log_item, num_buf, sizeof(num_buf)), str, end);
|
||||||
|
str = _slog_append("]", str, end);
|
||||||
|
// if a filename is provided, build a clickable log message that's compatible with compiler error messages
|
||||||
|
if (filename) {
|
||||||
|
str = _slog_append(" ", str, end);
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
// MSVC compiler error format
|
||||||
|
str = _slog_append(filename, str, end);
|
||||||
|
str = _slog_append("(", str, end);
|
||||||
|
str = _slog_append(_slog_itoa(line_nr, num_buf, sizeof(num_buf)), str, end);
|
||||||
|
str = _slog_append("): ", str, end);
|
||||||
|
#else
|
||||||
|
// gcc/clang compiler error format
|
||||||
|
str = _slog_append(filename, str, end);
|
||||||
|
str = _slog_append(":", str, end);
|
||||||
|
str = _slog_append(_slog_itoa(line_nr, num_buf, sizeof(num_buf)), str, end);
|
||||||
|
str = _slog_append(":0: ", str, end);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
str = _slog_append("[line:", str, end);
|
||||||
|
str = _slog_append(_slog_itoa(line_nr, num_buf, sizeof(num_buf)), str, end);
|
||||||
|
str = _slog_append("] ", str, end);
|
||||||
|
}
|
||||||
|
if (message) {
|
||||||
|
str = _slog_append("\n\t", str, end);
|
||||||
|
str = _slog_append(message, str, end);
|
||||||
|
}
|
||||||
|
str = _slog_append("\n\n", str, end);
|
||||||
|
if (0 == log_level) {
|
||||||
|
str = _slog_append("ABORTING because of [panic]\n", str, end);
|
||||||
|
(void)str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// print to stderr?
|
||||||
|
#if defined(_SLOG_LINUX) || defined(_SLOG_WINDOWS) || defined(_SLOG_APPLE)
|
||||||
|
fputs(line_buf, stderr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// platform specific logging calls
|
||||||
|
#if defined(_SLOG_WINDOWS)
|
||||||
|
OutputDebugStringA(line_buf);
|
||||||
|
#elif defined(_SLOG_ANDROID)
|
||||||
|
int prio;
|
||||||
|
switch (log_level) {
|
||||||
|
case 0: prio = ANDROID_LOG_FATAL; break;
|
||||||
|
case 1: prio = ANDROID_LOG_ERROR; break;
|
||||||
|
case 2: prio = ANDROID_LOG_WARN; break;
|
||||||
|
default: prio = ANDROID_LOG_INFO; break;
|
||||||
|
}
|
||||||
|
__android_log_write(prio, "SOKOL", line_buf);
|
||||||
|
#elif defined(_SLOG_EMSCRIPTEN)
|
||||||
|
slog_js_log(log_level, line_buf);
|
||||||
|
#elif defined(_SLOG_LINUX) || defined(_SLOG_APPLE)
|
||||||
|
int prio;
|
||||||
|
switch (log_level) {
|
||||||
|
case 0: prio = LOG_CRIT; break;
|
||||||
|
case 1: prio = LOG_ERR; break;
|
||||||
|
case 2: prio = LOG_WARNING; break;
|
||||||
|
default: prio = LOG_INFO; break;
|
||||||
|
}
|
||||||
|
syslog(prio, "%s", line_buf);
|
||||||
|
#endif
|
||||||
|
if (0 == log_level) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // SOKOL_LOG_IMPL
|
Loading…
Reference in New Issue