Compare commits

...

2 Commits

Author SHA1 Message Date
Hajime Hoshi
aba652c323 internal/graphicsdriver/playstation5: add DrawTriangles 2024-08-04 19:13:36 +09:00
Hajime Hoshi
6555375b06 all: add .clang-format 2024-08-04 19:06:59 +09:00
4 changed files with 107 additions and 17 deletions

1
.clang-format Normal file
View File

@ -0,0 +1 @@
CommentPragmas: '^go:build'

View File

@ -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) {}

View File

@ -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
}

View File

@ -19,6 +19,7 @@
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
@ -33,10 +34,47 @@ static bool ebitengine_IsErrorNil(ebitengine_Error* err) {
return err->Message == NULL && err->Code == 0;
}
typedef struct ebitengine_Rectangle {
int MinX;
int MinY;
int MaxX;
int MaxY;
} ebitengine_Rectangle;
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);
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);