Skip to content

Commit f364bac

Browse files
committed
basic model and texture
1 parent 14e32a1 commit f364bac

File tree

10 files changed

+395
-28
lines changed

10 files changed

+395
-28
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#ifndef guard_gpuBuffer_s54dtu4kfesas
2+
#define guard_gpuBuffer_s54dtu4kfesas
3+
4+
#include <cage-engine/core.h>
5+
6+
namespace wgpu
7+
{
8+
class Buffer;
9+
}
10+
11+
namespace cage
12+
{
13+
class GraphicsDevice;
14+
15+
class CAGE_ENGINE_API GpuBuffer : private Immovable
16+
{
17+
protected:
18+
detail::StringBase<128> label;
19+
20+
public:
21+
void setLabel(const String &name);
22+
23+
void write(PointerRange<const char> buffer);
24+
void write(uint32 offset, PointerRange<const char> buffer);
25+
26+
uint32 size() const;
27+
28+
wgpu::Buffer nativeBuffer();
29+
};
30+
31+
CAGE_ENGINE_API Holder<GpuBuffer> newGpuBufferUniform(GraphicsDevice *device);
32+
CAGE_ENGINE_API Holder<GpuBuffer> newGpuBufferGeometry(GraphicsDevice *device);
33+
}
34+
35+
#endif // guard_gpuBuffer_s54dtu4kfesas

sources/include/cage-engine/graphicsDevice.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace cage
2222
Holder<Texture> nextFrame(Window *window);
2323

2424
wgpu::Device nativeDevice();
25-
wgpu::Queue nativeQueue();
25+
Holder<wgpu::Queue> nativeQueue(); // locks the queue for thread-safe access
2626
};
2727

2828
struct CAGE_CORE_API GraphicsDeviceCreateConfig
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#ifndef guard_model_dthu41r5df
2+
#define guard_model_dthu41r5df
3+
4+
#include <array>
5+
6+
#include <cage-core/geometry.h>
7+
#include <cage-engine/core.h>
8+
9+
namespace cage
10+
{
11+
class Mesh;
12+
class Collider;
13+
class GraphicsDevice;
14+
class GpuBuffer;
15+
enum class MeshRenderFlags : uint32;
16+
17+
class CAGE_ENGINE_API Model : private Immovable
18+
{
19+
protected:
20+
detail::StringBase<128> label;
21+
22+
public:
23+
void setLabel(const String &name);
24+
25+
// general
26+
Mat4 importTransform;
27+
Aabb boundingBox = Aabb::Universe();
28+
Holder<const Collider> collider;
29+
30+
// geometry
31+
Holder<GpuBuffer> geometryBuffer;
32+
uint32 verticesCount = 0;
33+
uint32 bonesCount = 0;
34+
uint32 indicesCount = 0;
35+
uint32 indicesOffset = 0;
36+
uint32 primitivesCount = 0;
37+
uint32 primitiveType = 0;
38+
39+
// material
40+
Holder<GpuBuffer> materialBuffer;
41+
std::array<uint32, MaxTexturesCountPerMaterial> textureNames = {};
42+
uint32 shaderName = 0;
43+
sint32 layer = 0;
44+
MeshRenderFlags flags = {};
45+
};
46+
47+
CAGE_ENGINE_API Holder<Model> newModel();
48+
CAGE_ENGINE_API Holder<Model> newModel(GraphicsDevice *device, const Mesh *mesh, PointerRange<const char> material);
49+
50+
CAGE_ENGINE_API AssetsScheme genAssetSchemeModel(uint32 threadIndex);
51+
constexpr uint32 AssetSchemeIndexModel = 12;
52+
}
53+
54+
#endif // guard_model_dthu41r5df

sources/include/cage-engine/shader.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ namespace cage
2121
};
2222

2323
CAGE_ENGINE_API Holder<Shader> newShader(GraphicsDevice *device, const Spirv *spirv);
24+
25+
CAGE_ENGINE_API AssetsScheme genAssetSchemeShaderProgram(uint32 threadIndex);
26+
constexpr uint32 AssetSchemeIndexShaderProgram = 10;
2427
}
2528

2629
#endif

sources/include/cage-engine/texture.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace wgpu
1111

1212
namespace cage
1313
{
14+
class Image;
1415
class GraphicsDevice;
1516

1617
class CAGE_ENGINE_API Texture : private Immovable
@@ -34,11 +35,17 @@ namespace cage
3435
struct CAGE_ENGINE_API TextureCreateConfig
3536
{
3637
Vec3i resolution = Vec3i(0, 0, 1);
38+
uint32 channels = 3;
3739
uint32 mipLevels = 1;
38-
bool volume3D = false; // true = 3D texture; false = layers, cube
40+
bool srgb = false;
3941
};
4042

41-
CAGE_ENGINE_API Holder<Texture> newGraphicsTexture(GraphicsDevice *device, const TextureCreateConfig &config);
43+
CAGE_ENGINE_API Holder<Texture> newTexture(GraphicsDevice *device, const TextureCreateConfig &config);
44+
CAGE_ENGINE_API Holder<Texture> newTexture(GraphicsDevice *device, const Image *image);
45+
CAGE_ENGINE_API Holder<Texture> newTexture(wgpu::Texture texture);
46+
47+
CAGE_ENGINE_API AssetsScheme genAssetSchemeTexture(uint32 threadIndex);
48+
constexpr uint32 AssetSchemeIndexTexture = 11;
4249
}
4350

4451
#endif
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include <webgpu/webgpu_cpp.h>
2+
3+
#include <cage-engine/gpuBuffer.h>
4+
#include <cage-engine/graphicsDevice.h>
5+
6+
namespace cage
7+
{
8+
namespace
9+
{
10+
class GpuBufferImpl : public GpuBuffer
11+
{
12+
public:
13+
wgpu::Buffer buffer;
14+
GraphicsDevice *device = nullptr;
15+
16+
explicit GpuBufferImpl(GraphicsDevice *device, wgpu::BufferUsage usage) : device(device)
17+
{
18+
wgpu::BufferDescriptor desc = {};
19+
desc.usage = usage | wgpu::BufferUsage::CopyDst;
20+
buffer = device->nativeDevice().CreateBuffer(&desc);
21+
}
22+
};
23+
}
24+
25+
void GpuBuffer::setLabel(const String &name)
26+
{
27+
label = name;
28+
GpuBufferImpl *impl = (GpuBufferImpl *)this;
29+
impl->buffer.SetLabel(name.c_str());
30+
}
31+
32+
void GpuBuffer::write(PointerRange<const char> buffer)
33+
{
34+
GpuBufferImpl *impl = (GpuBufferImpl *)this;
35+
wgpu::BufferDescriptor desc = {};
36+
desc.size = buffer.size();
37+
desc.usage = impl->buffer.GetUsage();
38+
impl->buffer = impl->device->nativeDevice().CreateBuffer(&desc);
39+
if (buffer.size() > 0)
40+
write(0, buffer);
41+
}
42+
43+
void GpuBuffer::write(uint32 offset, PointerRange<const char> buffer)
44+
{
45+
CAGE_ASSERT(offset + buffer.size() <= size());
46+
GpuBufferImpl *impl = (GpuBufferImpl *)this;
47+
impl->device->nativeQueue()->WriteBuffer(impl->buffer, offset, buffer.data(), buffer.size());
48+
}
49+
50+
uint32 GpuBuffer::size() const
51+
{
52+
const GpuBufferImpl *impl = (const GpuBufferImpl *)this;
53+
return numeric_cast<uint32>(impl->buffer.GetSize());
54+
}
55+
56+
wgpu::Buffer GpuBuffer::nativeBuffer()
57+
{
58+
GpuBufferImpl *impl = (GpuBufferImpl *)this;
59+
return impl->buffer;
60+
}
61+
62+
Holder<GpuBuffer> newGpuBufferUniform(GraphicsDevice *device)
63+
{
64+
return systemMemory().createImpl<GpuBuffer, GpuBufferImpl>(device, wgpu::BufferUsage::Uniform);
65+
}
66+
67+
Holder<GpuBuffer> newGpuBufferGeometry(GraphicsDevice *device)
68+
{
69+
return systemMemory().createImpl<GpuBuffer, GpuBufferImpl>(device, wgpu::BufferUsage::Vertex | wgpu::BufferUsage::Index);
70+
}
71+
}

sources/libengine/graphics/device.cpp

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77

88
#include "../window/private.h"
99

10+
#include <cage-core/concurrent.h>
1011
#include <cage-core/debug.h>
1112
#include <cage-engine/graphicsDevice.h>
13+
#include <cage-engine/texture.h>
1214
#include <cage-engine/window.h>
1315

1416
namespace cage
1517
{
16-
Holder<Texture> adaptWgpuTexture(wgpu::Texture texture);
17-
1818
struct GraphicsContext
1919
{
2020
wgpu::Surface surface;
@@ -73,16 +73,17 @@ namespace cage
7373
class GraphicsDeviceImpl : public GraphicsDevice
7474
{
7575
public:
76+
Holder<Mutex> mutex = newMutex();
7677
wgpu::Instance instance;
7778
wgpu::Device device;
7879
wgpu::Queue queue;
7980

8081
GraphicsDeviceImpl(const GraphicsDeviceCreateConfig &config)
8182
{
8283
{
83-
dawn::native::DawnInstanceDescriptor ex;
84+
dawn::native::DawnInstanceDescriptor ex = {};
8485
ex.SetLoggingCallback(logFromInstance);
85-
wgpu::InstanceDescriptor desc;
86+
wgpu::InstanceDescriptor desc = {};
8687
desc.nextInChain = &ex;
8788
std::array<wgpu::InstanceFeatureName, 2> features = { wgpu::InstanceFeatureName::TimedWaitAny, wgpu::InstanceFeatureName::ShaderSourceSPIRV };
8889
desc.requiredFeatureCount = features.size();
@@ -95,7 +96,7 @@ namespace cage
9596

9697
wgpu::Adapter adapter;
9798
{
98-
wgpu::RequestAdapterOptions opts;
99+
wgpu::RequestAdapterOptions opts = {};
99100
opts.backendType = wgpu::BackendType::Vulkan;
100101
opts.powerPreference = wgpu::PowerPreference::HighPerformance;
101102
if (config.compatibility)
@@ -111,15 +112,15 @@ namespace cage
111112
if (!adapter)
112113
CAGE_THROW_ERROR(Exception, "failed to create wgpu adapter");
113114

114-
wgpu::AdapterInfo info;
115+
wgpu::AdapterInfo info = {};
115116
adapter.GetInfo(&info);
116117
CAGE_LOG(SeverityEnum::Info, "graphics", Stringizer() + "adapter vendor: " + conv(info.vendor));
117118
CAGE_LOG(SeverityEnum::Info, "graphics", Stringizer() + "adapter device: " + conv(info.device));
118119
CAGE_LOG(SeverityEnum::Info, "graphics", Stringizer() + "adapter description: " + conv(info.description));
119120
}
120121

121122
{
122-
wgpu::DeviceDescriptor desc;
123+
wgpu::DeviceDescriptor desc = {};
123124
desc.SetDeviceLostCallback(wgpu::CallbackMode::AllowProcessEvents, lostFromDevice);
124125
desc.SetUncapturedErrorCallback(errorFromDevice);
125126

@@ -163,7 +164,7 @@ namespace cage
163164
if (res != context->resolution)
164165
{
165166
context->presentable = false;
166-
wgpu::SurfaceConfiguration cfg;
167+
wgpu::SurfaceConfiguration cfg = {};
167168
cfg.device = device;
168169
cfg.width = res[0];
169170
cfg.height = res[1];
@@ -177,7 +178,7 @@ namespace cage
177178
if (context->presentable)
178179
context->surface.Present();
179180

180-
wgpu::SurfaceTexture tex;
181+
wgpu::SurfaceTexture tex = {};
181182
context->surface.GetCurrentTexture(&tex);
182183
switch (tex.status)
183184
{
@@ -192,7 +193,7 @@ namespace cage
192193

193194
CAGE_ASSERT(tex.texture);
194195
context->presentable = true;
195-
return adaptWgpuTexture(tex.texture);
196+
return newTexture(tex.texture);
196197
}
197198
};
198199
}
@@ -220,9 +221,17 @@ namespace cage
220221
return impl->device;
221222
}
222223

223-
wgpu::Queue GraphicsDevice::nativeQueue()
224+
Holder<wgpu::Queue> GraphicsDevice::nativeQueue()
224225
{
225226
GraphicsDeviceImpl *impl = (GraphicsDeviceImpl *)this;
226-
return impl->queue;
227+
struct LockedQueue : private Noncopyable
228+
{
229+
ScopeLock<Mutex> lock;
230+
wgpu::Queue queue;
231+
232+
LockedQueue(ScopeLock<Mutex> &&l, wgpu::Queue &&q) : lock(std::move(l)), queue(std::move(q)) {}
233+
};
234+
Holder<LockedQueue> l = systemMemory().createHolder<LockedQueue>(ScopeLock(impl->mutex), impl->queue);
235+
return Holder<wgpu::Queue>(&l->queue, std::move(l));
227236
}
228237
}

0 commit comments

Comments
 (0)