From 332da38565f7189244cb97a22b94326882a90548 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sat, 10 Aug 2024 18:18:09 +0900 Subject: [PATCH] internal/graphicsdriver/playstation5: update DrawTriangles A Go pointer in a C struct could cause some troubles. --- .../playstation5/graphics_playstation5.go | 42 +++++++------------ .../playstation5/graphics_playstation5.h | 27 ++++-------- 2 files changed, 23 insertions(+), 46 deletions(-) diff --git a/internal/graphicsdriver/playstation5/graphics_playstation5.go b/internal/graphicsdriver/playstation5/graphics_playstation5.go index 187240b42..f04548a2a 100644 --- a/internal/graphicsdriver/playstation5/graphics_playstation5.go +++ b/internal/graphicsdriver/playstation5/graphics_playstation5.go @@ -118,26 +118,24 @@ 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)) + cSrcs := make([]C.int, len(srcs)) for i, src := range srcs { - csrcs[i] = C.int(src) + cSrcs[i] = C.int(src) } + defer runtime.KeepAlive(cSrcs) + cDstRegions := make([]C.ebitengine_DstRegion, len(dstRegions)) + defer runtime.KeepAlive(cDstRegions) 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), - }, + 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), @@ -147,23 +145,15 @@ func (g *Graphics) DrawTriangles(dst graphicsdriver.ImageID, srcs [graphics.Shad 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), + cUniforms := make([]C.uint32_t, len(uniforms)) + defer runtime.KeepAlive(cUniforms) + for i, u := range uniforms { + cUniforms[i] = C.uint32_t(u) } - if err := C.ebitengine_DrawTriangles(&args); !C.ebitengine_IsErrorNil(&err) { + + if err := C.ebitengine_DrawTriangles(C.int(dst), &cSrcs[0], C.int(len(cSrcs)), C.int(shader), &cDstRegions[0], C.int(len(cDstRegions)), C.int(indexOffset), cBlend, &cUniforms[0], C.int(len(cUniforms)), C.int(fillRule)); !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 6e0f780b5..0fd002963 100644 --- a/internal/graphicsdriver/playstation5/graphics_playstation5.h +++ b/internal/graphicsdriver/playstation5/graphics_playstation5.h @@ -34,15 +34,11 @@ static bool ebitengine_IsErrorNil(ebitengine_Error *err) { return err->Message == NULL && err->Code == 0; } -typedef struct ebitengine_Rectangle { +typedef struct ebitengine_DstRegion { int MinX; int MinY; int MaxX; int MaxY; -} ebitengine_Rectangle; - -typedef struct ebitengine_DstRegion { - ebitengine_Rectangle Region; int IndexCount; } ebitengine_DstRegion; @@ -55,26 +51,17 @@ typedef struct ebitengine_Blend { 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_DrawTriangles(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_Error ebitengine_NewShader(int *shader, const char *source); void ebitengine_DisposeShader(int id);