mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 02:38:53 +01:00
opengl: Consider framebuffer size on iOS
This commit is contained in:
parent
98fccb563e
commit
83ab4352f8
@ -41,9 +41,11 @@ func (p Program) id() programID {
|
||||
}
|
||||
|
||||
type context struct {
|
||||
gl mgl.Context
|
||||
worker mgl.Worker
|
||||
initialized chan struct{}
|
||||
gl mgl.Context
|
||||
worker mgl.Worker
|
||||
initialized chan struct{}
|
||||
screenFramebufferWidth int
|
||||
screenFramebufferHeight int
|
||||
}
|
||||
|
||||
func NewContext() (*Context, error) {
|
||||
@ -79,11 +81,22 @@ func NewContext() (*Context, error) {
|
||||
c.BlendFunc(CompositeModeSourceOver)
|
||||
f := c.gl.GetInteger(mgl.FRAMEBUFFER_BINDING)
|
||||
c.screenFramebuffer = Framebuffer(mgl.Framebuffer{uint32(f)})
|
||||
// It is invalid to get the size of the deafult framebuffer.
|
||||
if c.screenFramebuffer.Value != 0 {
|
||||
width := c.gl.GetRenderbufferParameteri(mgl.RENDERBUFFER, mgl.RENDERBUFFER_WIDTH)
|
||||
height := c.gl.GetRenderbufferParameteri(mgl.RENDERBUFFER, mgl.RENDERBUFFER_HEIGHT)
|
||||
c.screenFramebufferWidth = width
|
||||
c.screenFramebufferHeight = height
|
||||
}
|
||||
close(c.initialized)
|
||||
}()
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (c *Context) ScreenFramebufferSize() (int, int) {
|
||||
return c.screenFramebufferWidth, c.screenFramebufferHeight
|
||||
}
|
||||
|
||||
func (c *Context) Resume() error {
|
||||
c.locationCache = newLocationCache()
|
||||
c.lastFramebuffer = invalidFramebuffer
|
||||
@ -94,12 +107,12 @@ func (c *Context) Resume() error {
|
||||
c.BlendFunc(CompositeModeSourceOver)
|
||||
f := c.gl.GetInteger(mgl.FRAMEBUFFER_BINDING)
|
||||
c.screenFramebuffer = Framebuffer(mgl.Framebuffer{uint32(f)})
|
||||
// TODO: Need to update screenFramebufferWidth/Height?
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Context) WaitUntilInitializingDone() {
|
||||
// TODO: Call this function at an approriate place
|
||||
<-c.initialized
|
||||
func (c *Context) InitializedCh() <-chan struct{} {
|
||||
return c.initialized
|
||||
}
|
||||
|
||||
func (c *Context) Worker() mgl.Worker {
|
||||
|
@ -36,6 +36,13 @@ func Render(chError <-chan error) error {
|
||||
return errors.New("ui: chError must not be nil")
|
||||
}
|
||||
// TODO: Check this is called on the rendering thread
|
||||
if chGLInitialized != nil {
|
||||
if err := doGLWorks(chError, glContext.InitializedCh()); err != nil {
|
||||
return err
|
||||
}
|
||||
close(chGLInitialized)
|
||||
<-chGLInitializedEnd
|
||||
}
|
||||
select {
|
||||
case chRender <- struct{}{}:
|
||||
return doGLWorks(chError, chRenderEnd)
|
||||
@ -67,16 +74,19 @@ loop:
|
||||
}
|
||||
|
||||
type userInterface struct {
|
||||
width int
|
||||
height int
|
||||
scale int
|
||||
sizeChanged bool
|
||||
width int
|
||||
height int
|
||||
scale int
|
||||
framebufferScale int
|
||||
sizeChanged bool
|
||||
}
|
||||
|
||||
var (
|
||||
chRender = make(chan struct{})
|
||||
chRenderEnd = make(chan struct{})
|
||||
currentUI = &userInterface{
|
||||
chRender = make(chan struct{})
|
||||
chRenderEnd = make(chan struct{})
|
||||
chGLInitialized = make(chan struct{})
|
||||
chGLInitializedEnd = make(chan struct{})
|
||||
currentUI = &userInterface{
|
||||
sizeChanged: true,
|
||||
}
|
||||
)
|
||||
@ -99,6 +109,11 @@ func (u *userInterface) Terminate() error {
|
||||
|
||||
func (u *userInterface) Update() (interface{}, error) {
|
||||
// TODO: Need lock?
|
||||
if chGLInitialized != nil {
|
||||
<-chGLInitialized
|
||||
chGLInitialized = nil
|
||||
close(chGLInitializedEnd)
|
||||
}
|
||||
if u.sizeChanged {
|
||||
u.sizeChanged = false
|
||||
e := ScreenSizeEvent{
|
||||
@ -132,7 +147,17 @@ func (u *userInterface) ScreenScale() int {
|
||||
}
|
||||
|
||||
func (u *userInterface) actualScreenScale() int {
|
||||
return u.scale
|
||||
if u.framebufferScale == 0 {
|
||||
width, _ := glContext.ScreenFramebufferSize()
|
||||
if width == 0 {
|
||||
// Android
|
||||
u.framebufferScale = 1
|
||||
} else {
|
||||
// iOS
|
||||
u.framebufferScale = width / u.width
|
||||
}
|
||||
}
|
||||
return u.scale * u.framebufferScale
|
||||
}
|
||||
|
||||
func UpdateTouches(touches []Touch) {
|
||||
|
Loading…
Reference in New Issue
Block a user