Skip to content

Commit d861e3d

Browse files
committed
Improve the libretro binding to support GL cores
1 parent 8fdd1af commit d861e3d

4 files changed

Lines changed: 62 additions & 0 deletions

File tree

core/environment.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package core
22

33
import (
4+
"fmt"
45
"log"
56
"os/user"
67
"time"
@@ -45,6 +46,10 @@ func environment(cmd uint32, data unsafe.Pointer) bool {
4546
state.Global.FrameTimeCb = libretro.SetFrameTimeCallback(data)
4647
case libretro.EnvironmentSetAudioCallback:
4748
state.Global.AudioCb = libretro.SetAudioCallback(data)
49+
case libretro.EnvironmentSetHWRenderer:
50+
state.Global.HWRenderCb = libretro.SetHWRenderCallback(data)
51+
fmt.Println(state.Global.HWRenderCb)
52+
return true
4853
case libretro.EnvironmentGetCanDupe:
4954
libretro.SetBool(data, true)
5055
case libretro.EnvironmentSetPixelFormat:

libretro/cfuncs.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,18 @@ void bridge_retro_frame_time_callback(retro_frame_time_callback_t f, retro_usec_
2222
f(usec);
2323
}
2424
25+
void bridge_retro_hw_context_reset(retro_hw_context_reset_t f) {
26+
f();
27+
}
28+
29+
void bridge_retro_hw_context_destroy(retro_hw_context_reset_t f) {
30+
f();
31+
}
32+
33+
uintptr_t bridge_retro_hw_get_current_framebuffer(retro_hw_get_current_framebuffer_t f) {
34+
return ((uintptr_t (*)(void))f)();
35+
}
36+
2537
void bridge_retro_audio_callback(retro_audio_callback_t f) {
2638
f();
2739
}

libretro/libretro.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ void bridge_retro_unload_game(void *f);
3232
void bridge_retro_run(void *f);
3333
void bridge_retro_reset(void *f);
3434
void bridge_retro_frame_time_callback(retro_frame_time_callback_t f, retro_usec_t usec);
35+
void bridge_retro_hw_context_reset(retro_hw_context_reset_t f);
36+
uintptr_t bridge_retro_hw_get_current_framebuffer(retro_hw_get_current_framebuffer_t f);
37+
void bridge_retro_hw_context_destroy(retro_hw_context_reset_t f);
3538
void bridge_retro_audio_callback(retro_audio_callback_t f);
3639
void bridge_retro_audio_set_state(retro_audio_set_state_callback_t f, bool state);
3740
@@ -121,6 +124,22 @@ type FrameTimeCallback struct {
121124
Reference int64
122125
}
123126

127+
// HWRenderCallback sets an interface to let a libretro core render with
128+
// hardware acceleration.
129+
type HWRenderCallback struct {
130+
HWContextType uint
131+
ContextReset func()
132+
GetCurrentFramebuffer func() uintptr
133+
GetProcAddress func()
134+
Depth bool
135+
Stencil bool
136+
BottomLeftOrigin bool
137+
VersionMajor, VersionMinor uint
138+
CacheContext bool
139+
ContextDestroy func()
140+
DebugContext bool
141+
}
142+
124143
// AudioCallback stores the audio callback itself and the SetState callback
125144
type AudioCallback struct {
126145
Callback func()
@@ -179,6 +198,7 @@ const (
179198
EnvironmentGetPerfInterface = uint32(C.RETRO_ENVIRONMENT_GET_PERF_INTERFACE)
180199
EnvironmentSetFrameTimeCallback = uint32(C.RETRO_ENVIRONMENT_SET_FRAME_TIME_CALLBACK)
181200
EnvironmentSetAudioCallback = uint32(C.RETRO_ENVIRONMENT_SET_AUDIO_CALLBACK)
201+
EnvironmentSetHWRenderer = uint32(C.RETRO_ENVIRONMENT_SET_HW_RENDER)
182202
)
183203

184204
// Debug levels
@@ -531,6 +551,30 @@ func SetFrameTimeCallback(data unsafe.Pointer) FrameTimeCallback {
531551
return ftc
532552
}
533553

554+
// SetHWRenderCallback is an environment callback helper to set the HWRenderCallback
555+
func SetHWRenderCallback(data unsafe.Pointer) HWRenderCallback {
556+
c := *(*C.struct_retro_hw_render_callback)(data)
557+
hwrc := HWRenderCallback{}
558+
hwrc.HWContextType = uint(c.context_type)
559+
hwrc.ContextReset = func() {
560+
C.bridge_retro_hw_context_reset(c.context_reset)
561+
}
562+
hwrc.GetCurrentFramebuffer = func() uintptr {
563+
return uintptr(C.bridge_retro_hw_get_current_framebuffer(c.get_current_framebuffer))
564+
}
565+
hwrc.Depth = bool(c.depth)
566+
hwrc.Stencil = bool(c.stencil)
567+
hwrc.BottomLeftOrigin = bool(c.bottom_left_origin)
568+
hwrc.VersionMajor = uint(c.version_major)
569+
hwrc.VersionMinor = uint(c.version_minor)
570+
hwrc.CacheContext = bool(c.cache_context)
571+
hwrc.ContextDestroy = func() {
572+
C.bridge_retro_hw_context_destroy(c.context_destroy)
573+
}
574+
hwrc.DebugContext = bool(c.debug_context)
575+
return hwrc
576+
}
577+
534578
// SetAudioCallback is an environment callback helper to set the AudioCallback
535579
func SetAudioCallback(data unsafe.Pointer) AudioCallback {
536580
c := *(*C.struct_retro_audio_callback)(data)

state/state.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ type State struct {
1212
Core libretro.Core // Current libretro core
1313
FrameTimeCb libretro.FrameTimeCallback
1414
AudioCb libretro.AudioCallback
15+
HWRenderCb libretro.HWRenderCallback
1516
CoreRunning bool
1617
MenuActive bool // When set to true, will display the menu layer
1718
Verbose bool

0 commit comments

Comments
 (0)