mirror of
https://github.com/Kbz-8/Pulse.git
synced 2026-01-11 15:33:34 +00:00
yes
This commit is contained in:
29
Examples/D3D11/main.c
git.filemode.normal_file
29
Examples/D3D11/main.c
git.filemode.normal_file
@@ -0,0 +1,29 @@
|
|||||||
|
#include <Pulse.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
void DebugCallBack(PulseDebugMessageSeverity severity, const char* message)
|
||||||
|
{
|
||||||
|
if(severity == PULSE_DEBUG_MESSAGE_SEVERITY_ERROR)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Pulse Error: %s\n", message);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if(severity == PULSE_DEBUG_MESSAGE_SEVERITY_WARNING)
|
||||||
|
fprintf(stderr, "Pulse Warning: %s\n", message);
|
||||||
|
else
|
||||||
|
printf("Pulse: %s\n", message);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define BUFFER_SIZE (256 * sizeof(uint32_t))
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
PulseBackend backend = PulseLoadBackend(PULSE_BACKEND_D3D11, PULSE_SHADER_FORMAT_DXBC_BIT, PULSE_HIGH_DEBUG);
|
||||||
|
PulseSetDebugCallback(backend, DebugCallBack);
|
||||||
|
PulseDevice device = PulseCreateDevice(backend, NULL, 0);
|
||||||
|
PulseUnloadBackend(backend);
|
||||||
|
puts("Successfully executed Pulse example using D3D11 !");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
7
Examples/D3D11/xmake.lua
git.filemode.normal_file
7
Examples/D3D11/xmake.lua
git.filemode.normal_file
@@ -0,0 +1,7 @@
|
|||||||
|
target("D3D11Example")
|
||||||
|
add_deps("pulse_gpu")
|
||||||
|
if is_plat("linux") then
|
||||||
|
set_extension(".x86_64")
|
||||||
|
end
|
||||||
|
add_files("*.c")
|
||||||
|
target_end()
|
||||||
@@ -14,4 +14,7 @@ if has_config("examples") then
|
|||||||
if has_config("software") then
|
if has_config("software") then
|
||||||
includes("Software/xmake.lua")
|
includes("Software/xmake.lua")
|
||||||
end
|
end
|
||||||
|
if has_config("d3d11") then
|
||||||
|
includes("D3D11/xmake.lua")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ typedef enum PulseBackendBits
|
|||||||
PULSE_BACKEND_SOFTWARE = PULSE_BIT(6),
|
PULSE_BACKEND_SOFTWARE = PULSE_BIT(6),
|
||||||
PULSE_BACKEND_OPENGL = PULSE_BIT(7),
|
PULSE_BACKEND_OPENGL = PULSE_BIT(7),
|
||||||
PULSE_BACKEND_OPENGL_ES = PULSE_BIT(8),
|
PULSE_BACKEND_OPENGL_ES = PULSE_BIT(8),
|
||||||
|
PULSE_BACKEND_D3D11 = PULSE_BIT(9),
|
||||||
} PulseBackendBits;
|
} PulseBackendBits;
|
||||||
typedef PulseFlags PulseBackendFlags;
|
typedef PulseFlags PulseBackendFlags;
|
||||||
|
|
||||||
@@ -75,6 +76,7 @@ typedef enum PulseShaderFormatsBits
|
|||||||
PULSE_SHADER_FORMAT_METALLIB_BIT = PULSE_BIT(3), // Can be used by Metal backend
|
PULSE_SHADER_FORMAT_METALLIB_BIT = PULSE_BIT(3), // Can be used by Metal backend
|
||||||
PULSE_SHADER_FORMAT_WGSL_BIT = PULSE_BIT(4), // Can be used by WebGPU backend
|
PULSE_SHADER_FORMAT_WGSL_BIT = PULSE_BIT(4), // Can be used by WebGPU backend
|
||||||
PULSE_SHADER_FORMAT_GLSL_BIT = PULSE_BIT(5), // Can be used by OpenGL / OpenGL_ES backend
|
PULSE_SHADER_FORMAT_GLSL_BIT = PULSE_BIT(5), // Can be used by OpenGL / OpenGL_ES backend
|
||||||
|
PULSE_SHADER_FORMAT_DXBC_BIT = PULSE_BIT(6), // Can be used by D3D11 backend
|
||||||
// More to come
|
// More to come
|
||||||
} PulseShaderFormatsBits;
|
} PulseShaderFormatsBits;
|
||||||
typedef PulseFlags PulseShaderFormatsFlags;
|
typedef PulseFlags PulseShaderFormatsFlags;
|
||||||
|
|||||||
@@ -83,6 +83,14 @@ extern "C" {
|
|||||||
#define PULSE_API
|
#define PULSE_API
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef PULSE_COMPILER_MSVC
|
||||||
|
#define PULSE_IMPORT_API __declspec(dllimport)
|
||||||
|
#elif defined(PULSE_COMPILER_MINGW)
|
||||||
|
#define PULSE_IMPORT_API __attribute__((dllimport))
|
||||||
|
#else
|
||||||
|
#define PULSE_IMPORT_API
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef __cplusplus // if we compile in C
|
#ifndef __cplusplus // if we compile in C
|
||||||
#ifdef __STDC__
|
#ifdef __STDC__
|
||||||
#ifdef __STDC_VERSION__
|
#ifdef __STDC_VERSION__
|
||||||
|
|||||||
37
Sources/Backends/D3D11/D3D11.c
git.filemode.normal_file
37
Sources/Backends/D3D11/D3D11.c
git.filemode.normal_file
@@ -0,0 +1,37 @@
|
|||||||
|
// Copyright (C) 2025 kanel
|
||||||
|
// This file is part of "Pulse"
|
||||||
|
// For conditions of distribution and use, see copyright notice in LICENSE
|
||||||
|
|
||||||
|
#include <Pulse.h>
|
||||||
|
#include "../../PulseInternal.h"
|
||||||
|
|
||||||
|
#include "D3D11.h"
|
||||||
|
#include "D3D11Device.h"
|
||||||
|
|
||||||
|
PulseBackendFlags PuD3D11CheckSupport(PulseBackendFlags candidates, PulseShaderFormatsFlags shader_formats_used)
|
||||||
|
{
|
||||||
|
if(candidates != PULSE_BACKEND_ANY && (candidates & PULSE_BACKEND_D3D11) == 0)
|
||||||
|
return PULSE_BACKEND_INVALID;
|
||||||
|
if((shader_formats_used & PULSE_SHADER_FORMAT_DXBC_BIT) == 0)
|
||||||
|
return PULSE_BACKEND_INVALID;
|
||||||
|
return PULSE_BACKEND_D3D11;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PuD3D11LoadBackend(PulseBackend backend, PulseDebugLevel debug_level)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PuD3D11UnloadBackend(PulseBackend backend)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PulseBackendHandler D3D11Driver = {
|
||||||
|
.PFN_LoadBackend = PuD3D11LoadBackend,
|
||||||
|
.PFN_UnloadBackend = PuD3D11UnloadBackend,
|
||||||
|
.PFN_CreateDevice = PuD3D11CreateDevice,
|
||||||
|
.backend = PULSE_BACKEND_D3D11,
|
||||||
|
.supported_shader_formats = PULSE_SHADER_FORMAT_DXBC_BIT,
|
||||||
|
.driver_data = PULSE_NULLPTR
|
||||||
|
};
|
||||||
|
|
||||||
21
Sources/Backends/D3D11/D3D11.h
git.filemode.normal_file
21
Sources/Backends/D3D11/D3D11.h
git.filemode.normal_file
@@ -0,0 +1,21 @@
|
|||||||
|
// Copyright (C) 2025 kanel
|
||||||
|
// This file is part of "Pulse"
|
||||||
|
// For conditions of distribution and use, see copyright notice in LICENSE
|
||||||
|
|
||||||
|
#ifdef PULSE_ENABLE_D3D11_BACKEND
|
||||||
|
|
||||||
|
#ifndef PULSE_D3D11_H_
|
||||||
|
#define PULSE_D3D11_H_
|
||||||
|
|
||||||
|
#include <d3d11.h>
|
||||||
|
#include <dxgi.h>
|
||||||
|
|
||||||
|
#include "../../PulseInternal.h"
|
||||||
|
|
||||||
|
#define D3D11_RETRIEVE_DRIVER_DATA_AS(handle, cast) ((cast)handle->driver_data)
|
||||||
|
|
||||||
|
PulseBackendFlags PuD3D11CheckSupport(PulseBackendFlags candidates, PulseShaderFormatsFlags shader_formats_used); // Return PULSE_BACKEND_D3D11 in case of success and PULSE_BACKEND_INVALID otherwise
|
||||||
|
|
||||||
|
#endif // PULSE_D3D11_H_
|
||||||
|
|
||||||
|
#endif // PULSE_ENABLE_D3D11_BACKEND
|
||||||
61
Sources/Backends/D3D11/D3D11Device.c
git.filemode.normal_file
61
Sources/Backends/D3D11/D3D11Device.c
git.filemode.normal_file
@@ -0,0 +1,61 @@
|
|||||||
|
// Copyright (C) 2025 kanel
|
||||||
|
// This file is part of "Pulse"
|
||||||
|
// For conditions of distribution and use, see copyright notice in LICENSE
|
||||||
|
|
||||||
|
#include <Pulse.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "../../PulseInternal.h"
|
||||||
|
#include "D3D11.h"
|
||||||
|
#include "D3D11Device.h"
|
||||||
|
|
||||||
|
bool PuD3D11IsDedicatedAdapter(IDXGIAdapter1* adapter)
|
||||||
|
{
|
||||||
|
DXGI_ADAPTER_DESC1 desc;
|
||||||
|
if(FAILED(adapter->lpVtbl->GetDesc1(adapter, &desc)))
|
||||||
|
return false;
|
||||||
|
bool has_dedicated_memory = desc.DedicatedVideoMemory > 0;
|
||||||
|
bool is_software_adapter = wcsstr(desc.Description, L"Microsoft Basic Render") != PULSE_NULLPTR;
|
||||||
|
|
||||||
|
// Known vendor IDs
|
||||||
|
const uint32_t NVIDIA = 0x10DE;
|
||||||
|
const uint32_t AMD = 0x1002;
|
||||||
|
|
||||||
|
bool is_known_vendor = (desc.VendorId == NVIDIA || desc.VendorId == AMD);
|
||||||
|
|
||||||
|
return has_dedicated_memory && is_known_vendor && !is_software_adapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint64_t PuD3D11ScoreAdapter(ID3D11Device* device, IDXGIAdapter1* adapter)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PulseDevice PuD3D11CreateDevice(PulseBackend backend, PulseDevice* forbiden_devices, uint32_t forbiden_devices_count)
|
||||||
|
{
|
||||||
|
PULSE_CHECK_HANDLE_RETVAL(backend, PULSE_NULLPTR);
|
||||||
|
|
||||||
|
PulseDevice pulse_device = (PulseDeviceHandler*)calloc(1, sizeof(PulseDeviceHandler));
|
||||||
|
PULSE_CHECK_ALLOCATION_RETVAL(pulse_device, PULSE_NULL_HANDLE);
|
||||||
|
|
||||||
|
D3D11Device* device = (D3D11Device*)calloc(1, sizeof(D3D11Device));
|
||||||
|
PULSE_CHECK_ALLOCATION_RETVAL(device, PULSE_NULL_HANDLE);
|
||||||
|
|
||||||
|
pulse_device->driver_data = device;
|
||||||
|
pulse_device->backend = backend;
|
||||||
|
|
||||||
|
CreateDXGIFactory1(&IID_IDXGIFactory, (void**)&device->factory);
|
||||||
|
for(uint32_t i = 0; device->factory->lpVtbl->EnumAdapters1(device->factory, i, &device->adapter) != DXGI_ERROR_NOT_FOUND; i++)
|
||||||
|
{
|
||||||
|
DXGI_ADAPTER_DESC1 desc;
|
||||||
|
device->adapter->lpVtbl->GetDesc1(device->adapter, &desc);
|
||||||
|
device->adapter->lpVtbl->Release(device->adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
device->factory->lpVtbl->Release(device->factory);
|
||||||
|
return pulse_device;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PuD3D11DestroyDevice(PulseDevice device)
|
||||||
|
{
|
||||||
|
}
|
||||||
26
Sources/Backends/D3D11/D3D11Device.h
git.filemode.normal_file
26
Sources/Backends/D3D11/D3D11Device.h
git.filemode.normal_file
@@ -0,0 +1,26 @@
|
|||||||
|
// Copyright (C) 2025 kanel
|
||||||
|
// This file is part of "Pulse"
|
||||||
|
// For conditions of distribution and use, see copyright notice in LICENSE
|
||||||
|
|
||||||
|
#ifdef PULSE_ENABLE_D3D11_BACKEND
|
||||||
|
|
||||||
|
#ifndef PULSE_D3D11_DEVICE_H_
|
||||||
|
#define PULSE_D3D11_DEVICE_H_
|
||||||
|
|
||||||
|
#include <Pulse.h>
|
||||||
|
#include "D3D11.h"
|
||||||
|
|
||||||
|
typedef struct D3D11Device
|
||||||
|
{
|
||||||
|
ID3D11Device* device;
|
||||||
|
ID3D11DeviceContext* context;
|
||||||
|
IDXGIFactory1* factory;
|
||||||
|
IDXGIAdapter1* adapter;
|
||||||
|
} D3D11Device;
|
||||||
|
|
||||||
|
PulseDevice PuD3D11CreateDevice(PulseBackend backend, PulseDevice* forbiden_devices, uint32_t forbiden_devices_count);
|
||||||
|
void PuD3D11DestroyDevice(PulseDevice device);
|
||||||
|
|
||||||
|
#endif // PULSE_D3D11_DEVICE_H_
|
||||||
|
|
||||||
|
#endif // PULSE_ENABLE_D3D11_BACKEND
|
||||||
@@ -23,6 +23,9 @@
|
|||||||
#ifdef PULSE_ENABLE_OPENGL_BACKEND
|
#ifdef PULSE_ENABLE_OPENGL_BACKEND
|
||||||
#include "Backends/OpenGL/OpenGL.h"
|
#include "Backends/OpenGL/OpenGL.h"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef PULSE_ENABLE_D3D11_BACKEND
|
||||||
|
#include "Backends/D3D11/D3D11.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
// Ordered by default preference
|
// Ordered by default preference
|
||||||
static const PulseCheckBackendSupportPFN backends_supports[] = {
|
static const PulseCheckBackendSupportPFN backends_supports[] = {
|
||||||
@@ -35,6 +38,9 @@ static const PulseCheckBackendSupportPFN backends_supports[] = {
|
|||||||
#ifdef PULSE_ENABLE_WEBGPU_BACKEND
|
#ifdef PULSE_ENABLE_WEBGPU_BACKEND
|
||||||
WebGPUCheckSupport,
|
WebGPUCheckSupport,
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef PULSE_ENABLE_D3D11_BACKEND
|
||||||
|
PuD3D11CheckSupport,
|
||||||
|
#endif
|
||||||
#ifdef PULSE_ENABLE_OPENGL_BACKEND
|
#ifdef PULSE_ENABLE_OPENGL_BACKEND
|
||||||
OpenGLCheckSupport,
|
OpenGLCheckSupport,
|
||||||
OpenGLESCheckSupport,
|
OpenGLESCheckSupport,
|
||||||
@@ -115,6 +121,9 @@ static PulseBackend PulseGetBackendFromFlag(PulseBackendBits flag)
|
|||||||
#ifdef PULSE_ENABLE_WEBGPU_BACKEND
|
#ifdef PULSE_ENABLE_WEBGPU_BACKEND
|
||||||
case PULSE_BACKEND_WEBGPU: return &WebGPUDriver;
|
case PULSE_BACKEND_WEBGPU: return &WebGPUDriver;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef PULSE_ENABLE_D3D11_BACKEND
|
||||||
|
case PULSE_BACKEND_D3D11: return &D3D11Driver;
|
||||||
|
#endif
|
||||||
#ifdef PULSE_ENABLE_OPENGL_BACKEND
|
#ifdef PULSE_ENABLE_OPENGL_BACKEND
|
||||||
case PULSE_BACKEND_OPENGL: return &OpenGLDriver;
|
case PULSE_BACKEND_OPENGL: return &OpenGLDriver;
|
||||||
case PULSE_BACKEND_OPENGL_ES: return &OpenGLESDriver;
|
case PULSE_BACKEND_OPENGL_ES: return &OpenGLESDriver;
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ char* PulseStrtokR(char* str, const char* delim, char** saveptr)
|
|||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int isspace(int x)
|
static int PulseIsSpace(int x)
|
||||||
{
|
{
|
||||||
return ((x) == ' ') || ((x) == '\t') || ((x) == '\r') || ((x) == '\n') || ((x) == '\f') || ((x) == '\v');
|
return ((x) == ' ') || ((x) == '\t') || ((x) == '\r') || ((x) == '\n') || ((x) == '\f') || ((x) == '\v');
|
||||||
}
|
}
|
||||||
@@ -131,10 +131,10 @@ static int isspace(int x)
|
|||||||
void PulseTrimString(char* str)
|
void PulseTrimString(char* str)
|
||||||
{
|
{
|
||||||
char* start = str;
|
char* start = str;
|
||||||
while(*start && isspace((unsigned char)*start))
|
while(*start && PulseIsSpace((unsigned char)*start))
|
||||||
start++;
|
start++;
|
||||||
char* end = start + strlen(start) - 1;
|
char* end = start + strlen(start) - 1;
|
||||||
while(end > start && isspace((unsigned char)*end))
|
while(end > start && PulseIsSpace((unsigned char)*end))
|
||||||
end--;
|
end--;
|
||||||
*(end + 1) = '\0';
|
*(end + 1) = '\0';
|
||||||
if(start != str)
|
if(start != str)
|
||||||
|
|||||||
@@ -11,6 +11,10 @@
|
|||||||
#include "PulseDefs.h"
|
#include "PulseDefs.h"
|
||||||
#include "PulseEnums.h"
|
#include "PulseEnums.h"
|
||||||
|
|
||||||
|
#ifdef PULSE_COMPILER_MINGW
|
||||||
|
#include <minwindef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PULSE_MAX_READ_TEXTURES_BOUND 8
|
#define PULSE_MAX_READ_TEXTURES_BOUND 8
|
||||||
#define PULSE_MAX_READ_BUFFERS_BOUND 8
|
#define PULSE_MAX_READ_BUFFERS_BOUND 8
|
||||||
#define PULSE_MAX_WRITE_TEXTURES_BOUND 8
|
#define PULSE_MAX_WRITE_TEXTURES_BOUND 8
|
||||||
@@ -222,5 +226,8 @@ void PulseLogBackend(PulseBackend backend, PulseDebugMessageSeverity type, const
|
|||||||
extern PulseBackendHandler OpenGLDriver;
|
extern PulseBackendHandler OpenGLDriver;
|
||||||
extern PulseBackendHandler OpenGLESDriver;
|
extern PulseBackendHandler OpenGLESDriver;
|
||||||
#endif // PULSE_ENABLE_OPENGL_BACKEND
|
#endif // PULSE_ENABLE_OPENGL_BACKEND
|
||||||
|
#ifdef PULSE_ENABLE_D3D11_BACKEND
|
||||||
|
extern PulseBackendHandler D3D11Driver;
|
||||||
|
#endif // PULSE_ENABLE_D3D11_BACKEND
|
||||||
|
|
||||||
#endif // PULSE_INTERNAL_H_
|
#endif // PULSE_INTERNAL_H_
|
||||||
|
|||||||
12
xmake.lua
12
xmake.lua
@@ -30,6 +30,18 @@ local backends = {
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
},
|
},
|
||||||
|
D3D11 = {
|
||||||
|
option = "d3d11",
|
||||||
|
default = is_plat("windows", "msys", "mingw"),
|
||||||
|
custom = function()
|
||||||
|
if is_plat("linux") then
|
||||||
|
add_sysincludedirs("/usr/include/dxvk/")
|
||||||
|
add_syslinks("dxvk_d3d11", "dxvk_dxgi")
|
||||||
|
else
|
||||||
|
add_syslinks("d3d11", "dxgi", "windowscodecs")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},
|
||||||
Software = {
|
Software = {
|
||||||
option = "software",
|
option = "software",
|
||||||
default = true,
|
default = true,
|
||||||
|
|||||||
Reference in New Issue
Block a user