From aba652c323b445d2c8db2a9d4a3372f6cdfc71f6 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 4 Aug 2024 19:09:35 +0900 Subject: [PATCH] internal/graphicsdriver/playstation5: add DrawTriangles --- .../playstation5/graphics_playstation5.cpp | 22 ++++---- .../playstation5/graphics_playstation5.go | 47 ++++++++++++++++ .../playstation5/graphics_playstation5.h | 54 ++++++++++++++++--- 3 files changed, 106 insertions(+), 17 deletions(-) diff --git a/internal/graphicsdriver/playstation5/graphics_playstation5.cpp b/internal/graphicsdriver/playstation5/graphics_playstation5.cpp index 2d95896bc..e1fce3fb8 100644 --- a/internal/graphicsdriver/playstation5/graphics_playstation5.cpp +++ b/internal/graphicsdriver/playstation5/graphics_playstation5.cpp @@ -18,24 +18,28 @@ #include "graphics_playstation5.h" -extern "C" ebitengine_Error ebitengine_InitializeGraphics(void) { +extern "C" ebitengine_Error ebitengine_InitializeGraphics(void) { return {}; } + +extern "C" ebitengine_Error ebitengine_NewImage(int *image, int width, + int height) { return {}; } -extern "C" ebitengine_Error ebitengine_NewImage(int* image, int width, int height) { +extern "C" ebitengine_Error +ebitengine_NewScreenFramebufferImage(int *image, int width, int height) { return {}; } -extern "C" ebitengine_Error ebitengine_NewScreenFramebufferImage(int* image, int width, int height) { +extern "C" void ebitengine_DisposeImage(int id) {} + +extern "C" ebitengine_Error +ebitengine_DrawTriangles(ebitengine_DrawTrianglesArgs *args) { return {}; } -extern "C" void ebitengine_DisposeImage(int id) { -} - -extern "C" ebitengine_Error ebitengine_NewShader(int* shader, const char* source) { +extern "C" ebitengine_Error ebitengine_NewShader(int *shader, + const char *source) { return {}; } -extern "C" void ebitengine_DisposeShader(int id) { -} +extern "C" void ebitengine_DisposeShader(int id) {} diff --git a/internal/graphicsdriver/playstation5/graphics_playstation5.go b/internal/graphicsdriver/playstation5/graphics_playstation5.go index 63cd09091..187240b42 100644 --- a/internal/graphicsdriver/playstation5/graphics_playstation5.go +++ b/internal/graphicsdriver/playstation5/graphics_playstation5.go @@ -21,6 +21,7 @@ import "C" import ( "fmt" + "runtime" "github.com/hajimehoshi/ebiten/v2/internal/graphics" "github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver" @@ -117,6 +118,52 @@ func (g *Graphics) NewShader(program *shaderir.Program) (graphicsdriver.Shader, } func (g *Graphics) DrawTriangles(dst graphicsdriver.ImageID, srcs [graphics.ShaderSrcImageCount]graphicsdriver.ImageID, shader graphicsdriver.ShaderID, dstRegions []graphicsdriver.DstRegion, indexOffset int, blend graphicsdriver.Blend, uniforms []uint32, fillRule graphicsdriver.FillRule) error { + csrcs := make([]C.int, len(srcs)) + for i, src := range srcs { + csrcs[i] = C.int(src) + } + cDstRegions := make([]C.ebitengine_DstRegion, len(dstRegions)) + for i, r := range dstRegions { + cDstRegions[i] = C.ebitengine_DstRegion{ + Region: C.ebitengine_Rectangle{ + MinX: C.int(r.Region.Min.X), + MinY: C.int(r.Region.Min.Y), + MaxX: C.int(r.Region.Max.X), + MaxY: C.int(r.Region.Max.Y), + }, + IndexCount: C.int(r.IndexCount), + } + } + cUniforms := make([]C.uint32_t, len(uniforms)) + for i, u := range uniforms { + cUniforms[i] = C.uint32_t(u) + } + cBlend := C.ebitengine_Blend{ + BlendFactorSourceRGB: C.uint8_t(blend.BlendFactorSourceRGB), + BlendFactorSourceAlpha: C.uint8_t(blend.BlendFactorSourceAlpha), + BlendFactorDestinationRGB: C.uint8_t(blend.BlendFactorDestinationRGB), + BlendFactorDestinationAlpha: C.uint8_t(blend.BlendFactorDestinationAlpha), + BlendOperationRGB: C.uint8_t(blend.BlendOperationRGB), + BlendOperationAlpha: C.uint8_t(blend.BlendOperationAlpha), + } + + args := C.ebitengine_DrawTrianglesArgs{ + Dst: C.int(dst), + Srcs: &csrcs[0], + SrcCount: C.int(len(csrcs)), + Shader: C.int(shader), + DstRegions: &cDstRegions[0], + DstRegionCount: C.int(len(cDstRegions)), + IndexOffset: C.int(indexOffset), + Blend: cBlend, + Uniforms: &cUniforms[0], + UniformCount: C.int(len(cUniforms)), + FillRule: C.int(fillRule), + } + if err := C.ebitengine_DrawTriangles(&args); !C.ebitengine_IsErrorNil(&err) { + return newPlaystation5Error("(*playstation5.Graphics).DrawTriangles", err) + } + runtime.KeepAlive(args) return nil } diff --git a/internal/graphicsdriver/playstation5/graphics_playstation5.h b/internal/graphicsdriver/playstation5/graphics_playstation5.h index 8299eff5e..6e0f780b5 100644 --- a/internal/graphicsdriver/playstation5/graphics_playstation5.h +++ b/internal/graphicsdriver/playstation5/graphics_playstation5.h @@ -19,26 +19,64 @@ #include #include +#include #ifdef __cplusplus extern "C" { #endif typedef struct ebitengine_Error { - const char* Message; - int Code; + const char *Message; + int Code; } ebitengine_Error; -static bool ebitengine_IsErrorNil(ebitengine_Error* err) { +static bool ebitengine_IsErrorNil(ebitengine_Error *err) { return err->Message == NULL && err->Code == 0; } -ebitengine_Error ebitengine_InitializeGraphics(void); -ebitengine_Error ebitengine_NewImage(int* image, int width, int height); -ebitengine_Error ebitengine_NewScreenFramebufferImage(int* image, int width, int height); -void ebitengine_DisposeImage(int id); +typedef struct ebitengine_Rectangle { + int MinX; + int MinY; + int MaxX; + int MaxY; +} ebitengine_Rectangle; -ebitengine_Error ebitengine_NewShader(int* shader, const char* source); +typedef struct ebitengine_DstRegion { + ebitengine_Rectangle Region; + int IndexCount; +} ebitengine_DstRegion; + +typedef struct ebitengine_Blend { + uint8_t BlendFactorSourceRGB; + uint8_t BlendFactorSourceAlpha; + uint8_t BlendFactorDestinationRGB; + uint8_t BlendFactorDestinationAlpha; + uint8_t BlendOperationRGB; + uint8_t BlendOperationAlpha; +} ebitengine_Blend; + +typedef struct ebitengine_DrawTrianglesArgs { + int Dst; + int *Srcs; + int SrcCount; + int Shader; + ebitengine_DstRegion *DstRegions; + int DstRegionCount; + int IndexOffset; + ebitengine_Blend Blend; + uint32_t *Uniforms; + int UniformCount; + int FillRule; +} ebitengine_DrawTrianglesArgs; + +ebitengine_Error ebitengine_InitializeGraphics(void); +ebitengine_Error ebitengine_NewImage(int *image, int width, int height); +ebitengine_Error ebitengine_NewScreenFramebufferImage(int *image, int width, + int height); +void ebitengine_DisposeImage(int id); +ebitengine_Error ebitengine_DrawTriangles(ebitengine_DrawTrianglesArgs *args); + +ebitengine_Error ebitengine_NewShader(int *shader, const char *source); void ebitengine_DisposeShader(int id); #ifdef __cplusplus