From: Gerd Hoffmann <kraxel@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: qemu-devel@nongnu.org, Anthony Liguori <aliguori@amazon.com>
Subject: Re: [Qemu-devel] [RfC PATCH 2/3] sdl2: add support for display rendering using opengl.
Date: Fri, 12 Dec 2014 12:04:57 +0100 [thread overview]
Message-ID: <1418382297.23141.23.camel@nilsson.home.kraxel.org> (raw)
In-Reply-To: <5489BEE2.7090107@redhat.com>
Hi,
> > +static void sdl2_gl_render_surface(struct sdl2_console *scon)
> > +{
> > + int gw, gh, ww, wh, stripe;
> > + float sw, sh;
> > + GLuint tex;
> > +
> > + gw = surface_width(scon->surface);
> > + gh = surface_height(scon->surface);
> > + SDL_GetWindowSize(scon->real_window, &ww, &wh);
> > + SDL_GL_MakeCurrent(scon->real_window, scon->winctx);
> > +
> > + sw = (float)ww/gw;
> > + sh = (float)wh/gh;
> > + if (sw < sh) {
> > + stripe = wh - wh*sw/sh;
> > + glViewport(0, stripe / 2, ww, wh - stripe);
> > + } else {
> > + stripe = ww - ww*sh/sw;
> > + glViewport(stripe / 2, 0, ww - stripe, wh);
> > + }
> > +
> > + glMatrixMode(GL_PROJECTION);
> > + glLoadIdentity();
>
> It's been a surprisingly long time since I last saw the OpenGL builtin
> matrix stack. :-)
--verbose please.
> > +
> > + glMatrixMode(GL_MODELVIEW);
> > + glLoadIdentity();
> > +
> > + glClearColor(0.0, 0.0, 0.0, 0);
>
> The alpha value is a float, too. So I'd either write 0 for everything
> and let the compiler handle the implicit conversion or (better, in my
> opinion) use 0.f (or 0.0f). Which brings me to that I'd rather not use
> doubles when the function takes floats...
Ok.
> > + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
>
> But you don't need glClearColor() at all, and you don't need this
> glClear() either. The depth test is disabled and the quad fills the
> whole screen, thus you can just leave the depth and color buffer as they
> are.
The quad fills the whole screen only in case host window and guest
screen have the same aspect ratio, otherwise there is padding top/bottom
or left/right so we don't change the guests screen aspect ratio.
> > +
> > + glGenTextures(1, &tex);
> > + glBindTexture(GL_TEXTURE_2D, tex);
> > + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, gw, gh,
> > + 0, GL_BGRA_EXT,GL_UNSIGNED_BYTE,
>
> I feared this extensions might not be widespread enough, but EXT_bgra is
> from 1997 so it should be fine. :-)
Note to self: This also needs to be extended to handle other surface
formats.
> > + surface_data(scon->surface));
> > + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
> > + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
> > +
> > + glEnable(GL_TEXTURE_2D);
>
> Shouldn't you call this before doing the first operation on that target?
> (that is, before the glBindTexture())
Probably ...
> > + glBegin(GL_QUADS);
> > + glTexCoord2f(0, 1); glVertex3f(-1, -1, 0);
> > + glTexCoord2f(0, 0); glVertex3f(-1, 1, 0);
> > + glTexCoord2f(1, 0); glVertex3f(1, 1, 0);
> > + glTexCoord2f(1, 1); glVertex3f(1, -1, 0);
> > + glEnd();
>
> I've been trained to hate direct mode, but it should be fine for just
> this quad.
--verbose please. Guess for longer sequences it would be much more
efficient to compile this into a shader program?
> First, you may consider using glVertex2f().
>
> Second, as hinted above, I don't like giving ints where floats are
> expected. So I'd like this to be "glTexCoord2f(0.f, 1.f)" etc., or
> (maybe even better because it prevents a discussion about whether to use
> 0.f or 0 :-)) just glTexCoord2i() and glVertex2i().
Using gl*i makes sense indeed.
> > +
> > + SDL_GL_SwapWindow(scon->real_window);
> > +
> > + glDisable(GL_TEXTURE_2D);
> > + glDeleteTextures(1, &tex);
> > +}
>
> Also, it hurts to always enable textures, generate one, load it, disable
> textures and delete them just to render a single quad with a texture
> loaded from main memory... (not to mention glViewport(), the matrix
> operations and SDL_GL_MakeCurrent())
>
> Would it be possible to just enable GL_TEXTURE_2D once, store the GL ID
> of the texture in the sdl2_console object and either use glTexImage2D()
> or, technically better, glTexSubImage2D() here?
Probably. I don't want tie this into sdl too much though. My
longer-term plan is to have some generic gl helper functions in the
console code and have all uis with gl support use these.
> Using glTexSubImage2D() would give us the advantage of being able to
> perform partial updates on the texture; but it seems to fit pretty bad
> into the existing code. To make it fit, I'd call glTexSubImage2D()
> directly in sdl2_gl_update() and just draw the quad here.
Yes, that should work.
cheers,
Gerd
next prev parent reply other threads:[~2014-12-12 11:05 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-11 11:05 [Qemu-devel] [RfC PATCH 0/3] sdl2: add opengl rendering support Gerd Hoffmann
2014-12-11 11:05 ` [Qemu-devel] [RfC PATCH 1/3] configure: opengl overhaul Gerd Hoffmann
2014-12-15 16:46 ` Michael Walle
2014-12-16 9:37 ` Gerd Hoffmann
2014-12-11 11:05 ` [Qemu-devel] [RfC PATCH 2/3] sdl2: add support for display rendering using opengl Gerd Hoffmann
2014-12-11 15:57 ` Max Reitz
2014-12-12 11:04 ` Gerd Hoffmann [this message]
2014-12-12 13:34 ` Max Reitz
2015-01-12 12:46 ` Gerd Hoffmann
2015-01-15 11:15 ` Gerd Hoffmann
2015-01-15 12:17 ` Paolo Bonzini
2015-01-15 12:23 ` Peter Maydell
2015-01-15 14:30 ` Gerd Hoffmann
2015-01-15 16:49 ` Max Reitz
2014-12-11 11:05 ` [Qemu-devel] [RfC PATCH 3/3] sdl2: move SDL_* includes to sdl2.h Gerd Hoffmann
2014-12-11 12:32 ` [Qemu-devel] [RfC PATCH 0/3] sdl2: add opengl rendering support Daniel P. Berrange
2014-12-11 15:29 ` Gerd Hoffmann
2014-12-11 15:46 ` Daniel P. Berrange
2014-12-11 15:54 ` Gerd Hoffmann
2014-12-11 13:28 ` Paolo Bonzini
2014-12-11 15:40 ` Gerd Hoffmann
2014-12-11 17:25 ` Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1418382297.23141.23.camel@nilsson.home.kraxel.org \
--to=kraxel@redhat.com \
--cc=aliguori@amazon.com \
--cc=mreitz@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).