Validates platform abstraction compliance - ensures rendering code uses IRendererAPI interfaces, no direct OpenGL in engine core, proper namespace isolation...
All platform-specific code must live in Engine/Platform/{PlatformName}/
ā Engine code should:
IRendererAPI, IShader, ITexture2D interfacesSilk.NET.* namespacesā Platform code should:
Engine/Platform/SilkNet/SilkNetContext.GL for OpenGLGLDebug.CheckError() after GL callsā Never:
Silk.NET.OpenGL in Engine namespaceSilkNetShader in engine codeEngine Core (Platform-Agnostic)
ā Uses interfaces only
Abstraction Layer (IRendererAPI, IShader, ITexture2D, etc.)
ā Implemented by
Platform Implementation (Engine/Platform/SilkNet/)
Current: OpenGL via Silk.NET Future: Vulkan, DirectX, Metal, WebGL
Invoke this skill when:
Run these commands to detect violations automatically:
grep -r "using Silk\.NET\." Engine/ --exclude-dir=Platform
Expected: No matches outside Engine/Platform/
grep -rE "SilkNet[A-Z]" Engine/ --exclude-dir=Platform | grep -E "(private|public|protected)"
Expected: No SilkNetShader, SilkNetTexture2D, etc. in engine code
Check Engine/Renderer/Graphics2D.cs and Engine/Renderer/Graphics3D.cs:
IRendererAPI, IShader, ITexture2D, etc.)For any new rendering features, verify:
Engine/Renderer/ or Engine/Core/?Engine/Platform/SilkNet/?Program.cs DI container?| Violation Type | ā Wrong | ā Correct |
|---|---|---|
| Direct OpenGL | using Silk.NET.OpenGL;GL.DrawElements(...) |
private readonly IRendererAPI _api;_api.DrawIndexed(...) |
| Concrete Types | private SilkNetShader _shader;_shader = new SilkNetShader(path); |
private readonly IShader _shader;_shader = factory.Create(path); |
| Wrong Namespace | Engine/Renderer/OpenGLBuffer.csnamespace Engine.Renderer; |
Engine/Platform/SilkNet/Buffers/namespace Engine.Platform.SilkNet.Buffers; |
When adding graphics features (compute shaders, geometry shaders, etc.), always create interface first:
// 1. Interface in Engine/Renderer/
public interface IComputeShader : IDisposable {
void Dispatch(uint x, uint y, uint z);
}
// 2. Implementation in Engine/Platform/SilkNet/
public class SilkNetComputeShader : IComputeShader { ... }
// 3. Factory for creation
public interface IComputeShaderFactory {
IComputeShader Create(string path);
}
// 4. Engine uses interface
public ParticleSystem(IComputeShaderFactory factory) {
_compute = factory.Create("particles.comp");
}
Core Interfaces (must use in engine code):
IRendererAPI - Draw commands, clear, viewportIShader - Shader programsITexture2D - Texture resourcesIVertexArray - Vertex array objectsIFrameBuffer - Render targetsIVertexBuffer, IIndexBuffer - Vertex/index dataPlatform Implementations (only in Platform/SilkNet):
Engine/Platform/SilkNet/SilkNetContext.GL for OpenGL accessGLDebug.CheckError() after GL callsEngine/Platform/SilkNet/
āāā SilkNetRendererApi.cs # IRendererAPI
āāā SilkNetShader.cs # IShader
āāā SilkNetTexture2D.cs # ITexture2D
āāā SilkNetVertexArray.cs # IVertexArray
āāā Buffers/
ā āāā SilkNetFrameBuffer.cs
ā āāā SilkNetVertexBuffer.cs
ā āāā SilkNetIndexBuffer.cs
āāā Audio/
ā āāā SilkNetAudioEngine.cs # OpenAL
āāā Input/
āāā SilkNetInputSystem.cs
1. Create namespace: Engine/Platform/Vulkan/
2. Implement interfaces:
public class VulkanRendererApi : IRendererAPI { ... }
public class VulkanShader : IShader { ... }
// etc.
3. Update DI registration:
// Program.cs
switch (backend) {
case "OpenGL":
container.Register<IRendererAPI, SilkNetRendererApi>();
break;
case "Vulkan":
container.Register<IRendererAPI, VulkanRendererApi>();
break;
}
4. No engine code changes needed - already uses interfaces!
After fixing violations or adding new features, validate compliance:
dotnet build
Expected: Build succeeds without errors
Run grep commands from Review Checklist Expected: No Silk.NET imports or concrete types in engine code
cd Editor && dotnet run
Expected: Editor launches, rendering works correctly
Ask: "Could I swap SilkNetRendererApi for VulkanRendererApi without changing engine code?"
Expected: Yes - all engine code uses IRendererAPI interfaces
Issue: [Violation description] Location: [File:Line] Type: [Direct OpenGL / Concrete Type / Wrong Namespace / Missing Interface] Fix:
// Current (wrong)
[bad code]
// Should be (correct)
[fixed code]
Priority: [Critical/High/Medium/Low]