Commit graph

136 commits

Author SHA1 Message Date
Jelle Raaijmakers
2ac415f728 LibGL: Keep track of active matrix and stack
This simplifies a lot of code in `GLContext` and prevents potential
errors when testing against the current matrix mode.
2022-03-10 20:20:05 +01:00
Jelle Raaijmakers
5d0a64bfde LibGL: Only normalize in glRotate* if possible
Vectors of length 0 cannot be normalized, so prevent dividing by zero
in the `glRotate*` API. This fixes the skybox rendering of Quake2.
2022-03-10 20:20:05 +01:00
Stephan Unverwerth
096e44285a LibGL: Merge GLContext and SoftwareGLContext
This merges GLContext and SoftwareGLContext into a single GLContext
class. Since the hardware abstraction is handled via the GPU device
interface we do not need the virtual base of GLContext anymore. All
context handling functionality from the old GLContext has been moved
into the new version. All methods in GLContext are now non virtual and
the class is marked as final.
2022-03-09 22:51:01 +01:00
Jelle Raaijmakers
c87d3521e4 LibGL: East-const glTex* methods 2022-03-08 15:32:35 +01:00
Jesse Buhagiar
371d49c0f6 LibGL: Implement glMateriali{v} 2022-01-26 16:44:11 +01:00
Jesse Buhagiar
170739fe39 LibGL: Implement glLighti{v} 2022-01-26 16:44:11 +01:00
Jesse Buhagiar
68e50759b4 LibGL: Implement glGetMaterial 2022-01-26 16:44:11 +01:00
Jesse Buhagiar
f5cde1b6fb LibGL: Implement glGetLight 2022-01-26 16:44:11 +01:00
Stephan Unverwerth
044582b0ce LibGL: Add stubs for multitexturing and announce GL_ARB_multitexture
This makes glquake recognize multitexture support and choose the
multitexture rendering path.
2022-01-19 19:57:49 +01:00
Jelle Raaijmakers
11c807ebd1 LibGL+LibSoftGPU: Implement the stencil buffer
This implements an 8-bit front stencil buffer. Stencil operations are
SIMD optimized. LibGL changes include:

* New `glStencilMask` and `glStencilMaskSeparate` functions
* New context parameter `GL_STENCIL_CLEAR_VALUE`
2022-01-17 12:49:00 +01:00
Jelle Raaijmakers
a4d98c4622 LibGL: Add context lifetime debug output
Also, make `::create_context` return a `NonnullOwnPtr`.
2022-01-14 21:38:09 +01:00
Jelle Raaijmakers
8e935ad3b1 LibGL+LibSoftGPU: Implement glColorMaterial and GL_COLOR_MATERIAL
When `GL_COLOR_MATERIAL` is enabled, specific material parameters can
be overwritten by the current color per-vertex during the lighting
calculations. Which parameter is controlled by `glColorMaterial`.

Also move the lighting calculations _before_ clipping, because the spec
says so. As a result, we interpolate the resulting vertex color instead
of the input color.
2022-01-13 12:13:58 +01:00
Luke Wilde
1fc611877f LibGL: Implement glIsTexture
Required by Xash3D for the r_showtextures command, where it shows every
allocated texture on screen.

Description of glIsTexture from the spec:
"glIsTexture returns GL_TRUE if texture is currently the name of a
texture. If texture is zero, or is a non-zero value that is not
currently the name of a texture, or if an error occurs, glIsTexture
returns GL_FALSE.

A name returned by glGenTextures, but not yet associated with a texture
by calling glBindTexture, is not the name of a texture."

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsTexture.xhtml
2022-01-13 12:13:40 +01:00
Jelle Raaijmakers
a4e2d93aa2 Ports+LibGL: Replace LibGL context check by ScummVM patch
According to the OpenGL spec, invoking functions without an active
context results in undefined behavior. Since ScummVM seems to be the
only port having issues with our behavior, patch their code instead.
2022-01-12 14:54:18 +01:00
Jesse Buhagiar
92373ab0b6 LibGL: Flesh out glMaterialf{v}
These two functions have been turned from stubs into actually doing
something. They now set the correspondingmaterial data member based on
the value passed into the `pname`argument.

Co-authored-by: Stephan Unverwerth <s.unverwerth@serenityos.org>
2022-01-12 13:36:56 +01:00
Jesse Buhagiar
bf294612a7 LibGL: Implement glLightf{v} and fix gl.h prototype
This implements the `glLightf{v}` family of functions used to set
lighting parameters per light in the GL. It also fixes an incorrect
prototype for the user exposed version of `glLightf{v}` in which
`params` was not marked as `const`.
2022-01-12 13:36:56 +01:00
Jelle Raaijmakers
8cf91a5ae5 LibGL: Change gl_tex_gen param to GLint
The singular form of `glTexGeni/f/d` only supports constants, not
floating point values as its parameter.
2021-12-30 14:24:29 +01:00
Jelle Raaijmakers
ccf6769d95 LibGL: Stub more API calls
These stubs are largely implemented the same: their API is exposed, but
they print to the debug console and sometimes `TODO()`. These changes
allow GLU and Tux Racer to build.

Methods stubbed:

* `glTexImage1D`
* `glTexImage3D`
* `glTexCoord2d(v)`
* `glNormalPointer`
* `glTexGen(d|f|i)`
* `glTexGenfv`
2021-12-27 11:58:43 +01:00
Jelle Raaijmakers
dae63352a3 LibGL: Implement glGetTexLevelParameteriv 2021-12-27 11:58:43 +01:00
Jelle Raaijmakers
d83702cb92 LibGL: Implement glRectf and glRecti 2021-12-27 11:58:43 +01:00
Jelle Raaijmakers
70c6907546 LibGL: Add glext.h and lots of new defines in gl.h
These constants are used by GLU and Tux Racer.
2021-12-27 11:58:43 +01:00
Jelle Raaijmakers
b79642ef74 LibGL: Support missing context in glGetError and glGetIntegerv
In its current state, ScummVM seems to invoke these methods just after
destroying the current GL context. According to the OpenGL spec:

    "Issuing GL commands when the program does not have a current
     context results in undefined behavior, up to and including program
     termination."

Our old behavior was to deref a `nullptr`, which isn't that great. For
now, protect these two methods. If other ports seem to misbehave as
well, we can always expand the check to other methods.
2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
6643775999 LibGL: Add stub for glCopyTexImage2D 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
401472c9a4 LibGL: Implement glDrawPixels and add stub for glBitmap 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
c2960e68a8 LibGL: Implement glLightModelf and glLightModelfv 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
0453cad46c LibGL: Add stubs for glPushAttrib and glPopAttrib 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
fbed7a5ba8 LibGL: Implement glLineWidth 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
506abf2a61 LibGL: Implement glIsList 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
9c9fa33495 LibGL: Implement glClearStencil 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
9dbc8d7e3c LibGL: Add stubs for glMaterialf and glMaterialfv 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
4eb6295a57 LibGL: Implement glRasterPos2i 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
78d0674228 LibGL: Implement glNormal3f and glNormal3fv 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
ea6bcda79c LibGL: Implement glStencil* functions
This implements the context state for stencil testing functions and
operations. No rasterization is implemented.
2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
11fea6b597 LibGL: Implement glListBase 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
1056bac49a LibGL: Implement glCallLists 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
7ac8cd057e LibGL: Implement glMultMatrixf 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
40724a426f LibGL: Implement glGetDoublev 2021-12-12 21:51:08 +01:00
Jelle Raaijmakers
5e370e6f96 LibGL: Implement GL_(UN)PACK_ALIGNMENT
These enums are used to indicate byte-alignment when reading from and
to textures. The `GL_UNPACK_ROW_LENGTH` value was reimplemented to
support overriding the source data row width.
2021-12-11 23:15:24 +01:00
Jelle Raaijmakers
e27b077c2a LibGL: Add GL::present_context()
This provides a convenience method that performs the virtual resolution
for `::present` on the provided `GLContext`.
2021-12-01 12:35:08 +01:00
Jelle Raaijmakers
bb58f6ccab LibGL: Implement glScissor() 2021-11-28 09:20:58 -08:00
Jelle Raaijmakers
a36ee213b9 LibGL: Implement glIsEnabled() 2021-10-17 21:01:52 -07:00
Stephan Unverwerth
e7d3483618 LibGL: Implement glTexSubImage2D 2021-09-02 21:00:24 +04:30
Stephan Unverwerth
15299b763c LibGL: Implement glPolygonOffset 2021-09-02 21:00:24 +04:30
Stephan Unverwerth
7cbaaf8366 LibGL: Implement glDrawBuffer 2021-09-02 21:00:24 +04:30
Stephan Unverwerth
b54573739c LibGL: Implement glTexEnvf
This controls how fetched texels are combined with the color that was
produced by a preceding texture unit or with the vertex color if it is
the first texture unit.

Currently only a small subset of possible combine modes is implemented
as required by glquake.
2021-08-26 19:54:31 +02:00
Stephan Unverwerth
19a08ff187 LibGL: Implement glPixelStorei
This sets the length of a row for the image to be transferred. This
value is measured in pixels. When a rectangle with a width less than
this value is transferred the remaining pixels of this row are skipped.
2021-08-26 19:53:57 +02:00
Jesse Buhagiar
d73cc3d0eb LibGL: Implement glFogi 2021-08-25 23:50:54 +04:30
Jesse Buhagiar
f55d2a22af LibGL: Implement glFogf 2021-08-25 23:50:54 +04:30
Jesse Buhagiar
7f1cd54b80 LibGL: Implement glFogfv
This currently just sets the fog colour in the rasterizer.
2021-08-25 23:50:54 +04:30
Jesse Buhagiar
89eddb5bff LibGL: Implement glPolygonMode
Currently just sets the renderer option for what polygon mode we
want the rasterizer to draw in. GLQuake only uses `GL_FRONT_AND_BACK`
with `GL_FILL` )which implies both back and front facing triangles
are to be filled completely by the rasterizer), so keeping this as
a small stub is perfectly fine for now.
2021-08-20 20:04:06 +04:30