internal/graphicsdriver/metal: Set framebufferOnly true

Updates #1196
This commit is contained in:
Hajime Hoshi 2021-07-07 00:38:50 +09:00
parent bd3f16dbba
commit 9cb1ff9cea
5 changed files with 21 additions and 2 deletions

View File

@ -147,6 +147,18 @@ func (ml MetalLayer) NextDrawable() (MetalDrawable, error) {
return MetalDrawable{md}, nil
}
// SetFramebufferOnly sets a Boolean value that determines whether the layers textures are used only for rendering.
//
// https://developer.apple.com/documentation/quartzcore/cametallayer/1478168-framebufferonly
func (ml MetalLayer) SetFramebufferOnly(framebufferOnly bool) {
switch framebufferOnly {
case true:
C.MetalLayer_SetFramebufferOnly(ml.metalLayer, 1)
case false:
C.MetalLayer_SetFramebufferOnly(ml.metalLayer, 0)
}
}
// MetalDrawable is a displayable resource that can be rendered or written to by Metal.
//
// Reference: https://developer.apple.com/documentation/quartzcore/cametaldrawable.

View File

@ -30,5 +30,6 @@ void MetalLayer_SetDisplaySyncEnabled(void *metalLayer,
uint8_t displaySyncEnabled);
void MetalLayer_SetDrawableSize(void *metalLayer, double width, double height);
void *MetalLayer_NextDrawable(void *metalLayer);
void MetalLayer_SetFramebufferOnly(void *metalLayer, uint8_t framebufferOnly);
void *MetalDrawable_Texture(void *drawable);

View File

@ -98,3 +98,7 @@ void *MetalLayer_NextDrawable(void *metalLayer) {
void *MetalDrawable_Texture(void *metalDrawable) {
return ((id<CAMetalDrawable>)metalDrawable).texture;
}
void MetalLayer_SetFramebufferOnly(void *metalLayer, uint8_t framebufferOnly) {
[((CAMetalLayer *)metalLayer) setFramebufferOnly:framebufferOnly];
}

View File

@ -1215,7 +1215,7 @@ func (i *Image) mtlTexture() mtl.Texture {
if i.screen {
g := i.graphics
if g.screenDrawable == (ca.MetalDrawable{}) {
drawable := g.view.drawable()
drawable := g.view.nextDrawable()
if drawable == (ca.MetalDrawable{}) {
return mtl.Texture{}
}

View File

@ -73,10 +73,12 @@ func (v *view) reset() error {
// The vsync state might be reset. Set the state again (#1364).
v.ml.SetDisplaySyncEnabled(v.vsync)
v.ml.SetFramebufferOnly(true)
return nil
}
func (v *view) drawable() ca.MetalDrawable {
func (v *view) nextDrawable() ca.MetalDrawable {
d, err := v.ml.NextDrawable()
if err != nil {
// Drawable is nil. This can happen at the initial state. Let's wait and see.