mirror of
https://github.com/raysan5/raylib.git
synced 2026-04-27 09:07:25 -04:00
Code review, format tweaks, defined version to 1.5
This commit is contained in:
465
src/external/rlsw.h
vendored
465
src/external/rlsw.h
vendored
@ -1,6 +1,6 @@
|
|||||||
/**********************************************************************************************
|
/**********************************************************************************************
|
||||||
*
|
*
|
||||||
* rlsw v1.0 - An OpenGL 1.1-style software renderer implementation
|
* rlsw v1.5 - An OpenGL 1.1-style software renderer implementation
|
||||||
*
|
*
|
||||||
* DESCRIPTION:
|
* DESCRIPTION:
|
||||||
* rlsw is a custom OpenGL 1.1-style implementation on software, intended to provide all
|
* rlsw is a custom OpenGL 1.1-style implementation on software, intended to provide all
|
||||||
@ -87,6 +87,8 @@
|
|||||||
#ifndef RLSW_H
|
#ifndef RLSW_H
|
||||||
#define RLSW_H
|
#define RLSW_H
|
||||||
|
|
||||||
|
#define RLGL_VERSION "1.5"
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@ -942,21 +944,21 @@ typedef struct {
|
|||||||
} sw_texture_t;
|
} sw_texture_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
sw_texture_t color;
|
sw_texture_t color; // Default framebuffer color texture
|
||||||
sw_texture_t depth;
|
sw_texture_t depth; // Default framebuffer depth texture
|
||||||
} sw_default_framebuffer_t;
|
} sw_default_framebuffer_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
sw_handle_t colorAttachment;
|
sw_handle_t colorAttachment; // Framebuffer color attachment id
|
||||||
sw_handle_t depthAttachment;
|
sw_handle_t depthAttachment; // Framebuffer depth attachment id
|
||||||
} sw_framebuffer_t;
|
} sw_framebuffer_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void *data; // flat storage [capacity*stride] bytes
|
void *data; // Flat storage [capacity*stride] bytes
|
||||||
uint8_t *gen; // generation per slot [capacity]
|
uint8_t *gen; // Generation per slot [capacity]
|
||||||
uint32_t *freeList; // free indices stack [capacity]
|
uint32_t *freeList; // Free indices stack [capacity]
|
||||||
int freeCount;
|
int freeCount;
|
||||||
int watermark; // next blank index (starts at 1, skips 0)
|
int watermark; // Next blank index (starts at 1, skips 0)
|
||||||
int capacity;
|
int capacity;
|
||||||
size_t stride;
|
size_t stride;
|
||||||
} sw_pool_t;
|
} sw_pool_t;
|
||||||
@ -967,6 +969,7 @@ typedef void (*sw_raster_quad_f)(const sw_vertex_t *v0, const sw_vertex_t *v1, c
|
|||||||
typedef void (*sw_raster_line_f)(const sw_vertex_t *v0, const sw_vertex_t *v1);
|
typedef void (*sw_raster_line_f)(const sw_vertex_t *v0, const sw_vertex_t *v1);
|
||||||
typedef void (*sw_raster_point_f)(const sw_vertex_t *v);
|
typedef void (*sw_raster_point_f)(const sw_vertex_t *v);
|
||||||
|
|
||||||
|
// Graphic context data structure
|
||||||
typedef struct {
|
typedef struct {
|
||||||
sw_default_framebuffer_t framebuffer; // Default framebuffer
|
sw_default_framebuffer_t framebuffer; // Default framebuffer
|
||||||
float clearColor[4]; // Clear color of the framebuffer
|
float clearColor[4]; // Clear color of the framebuffer
|
||||||
@ -1019,11 +1022,11 @@ typedef struct {
|
|||||||
sw_texture_t *boundTexture; // Texture currently bound
|
sw_texture_t *boundTexture; // Texture currently bound
|
||||||
sw_pool_t texturePool; // Texture object pool
|
sw_pool_t texturePool; // Texture object pool
|
||||||
|
|
||||||
SWfactor srcFactor;
|
SWfactor srcFactor; // Source blending factor
|
||||||
SWfactor dstFactor;
|
SWfactor dstFactor; // Destination bleending factor
|
||||||
|
|
||||||
sw_blend_factor_t srcFactorFunc;
|
sw_blend_factor_t srcFactorFunc; // Source blend function
|
||||||
sw_blend_factor_t dstFactorFunc;
|
sw_blend_factor_t dstFactorFunc; // Destination blend function
|
||||||
|
|
||||||
SWface cullFace; // Faces to cull
|
SWface cullFace; // Faces to cull
|
||||||
SWerrcode errCode; // Last error code
|
SWerrcode errCode; // Last error code
|
||||||
@ -1242,10 +1245,7 @@ static inline void sw_add_vertex_grad_PTCH(sw_vertex_t *SW_RESTRICT out, const s
|
|||||||
out->homogeneous[3] += gradients->homogeneous[3];
|
out->homogeneous[3] += gradients->homogeneous[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void sw_add_vertex_grad_scaled_PTCH(
|
static inline void sw_add_vertex_grad_scaled_PTCH(sw_vertex_t *SW_RESTRICT out, const sw_vertex_t *SW_RESTRICT gradients, float scale)
|
||||||
sw_vertex_t *SW_RESTRICT out,
|
|
||||||
const sw_vertex_t *SW_RESTRICT gradients,
|
|
||||||
float scale)
|
|
||||||
{
|
{
|
||||||
// Add gradients to Position
|
// Add gradients to Position
|
||||||
out->position[0] += gradients->position[0]*scale;
|
out->position[0] += gradients->position[0]*scale;
|
||||||
@ -1276,13 +1276,13 @@ static inline uint16_t sw_float_to_half_ui(uint32_t ui)
|
|||||||
int32_t s = (ui >> 16) & 0x8000;
|
int32_t s = (ui >> 16) & 0x8000;
|
||||||
int32_t em = ui & 0x7fffffff;
|
int32_t em = ui & 0x7fffffff;
|
||||||
|
|
||||||
// bias exponent and round to nearest; 112 is relative exponent bias (127-15)
|
// Bias exponent and round to nearest; 112 is relative exponent bias (127-15)
|
||||||
int32_t h = (em - (112 << 23) + (1 << 12)) >> 13;
|
int32_t h = (em - (112 << 23) + (1 << 12)) >> 13;
|
||||||
|
|
||||||
// underflow: flush to zero; 113 encodes exponent -14
|
// Underflow: flush to zero; 113 encodes exponent -14
|
||||||
h = (em < (113 << 23))? 0 : h;
|
h = (em < (113 << 23))? 0 : h;
|
||||||
|
|
||||||
// overflow: infinity; 143 encodes exponent 16
|
// Overflow: infinity; 143 encodes exponent 16
|
||||||
h = (em >= (143 << 23))? 0x7c00 : h;
|
h = (em >= (143 << 23))? 0x7c00 : h;
|
||||||
|
|
||||||
// NaN; note that we convert all types of NaN to qNaN
|
// NaN; note that we convert all types of NaN to qNaN
|
||||||
@ -1296,13 +1296,13 @@ static inline uint32_t sw_half_to_float_ui(uint16_t h)
|
|||||||
uint32_t s = (unsigned)(h & 0x8000) << 16;
|
uint32_t s = (unsigned)(h & 0x8000) << 16;
|
||||||
int32_t em = h & 0x7fff;
|
int32_t em = h & 0x7fff;
|
||||||
|
|
||||||
// bias exponent and pad mantissa with 0; 112 is relative exponent bias (127-15)
|
// Bias exponent and pad mantissa with 0; 112 is relative exponent bias (127-15)
|
||||||
int32_t r = (em + (112 << 10)) << 13;
|
int32_t r = (em + (112 << 10)) << 13;
|
||||||
|
|
||||||
// denormal: flush to zero
|
// Denormal: flush to zero
|
||||||
r = (em < (1 << 10))? 0 : r;
|
r = (em < (1 << 10))? 0 : r;
|
||||||
|
|
||||||
// infinity/NaN; note that we preserve NaN payload as a byproduct of unifying inf/nan cases
|
// Infinity/NaN; note that we preserve NaN payload as a byproduct of unifying inf/nan cases
|
||||||
// 112 is an exponent bias fixup; since we already applied it once, applying it twice converts 31 to 255
|
// 112 is an exponent bias fixup; since we already applied it once, applying it twice converts 31 to 255
|
||||||
r += (em >= (31 << 10))? (112 << 23) : 0;
|
r += (em >= (31 << 10))? (112 << 23) : 0;
|
||||||
|
|
||||||
@ -1344,7 +1344,7 @@ static inline uint32_t sw_compress_8to4(uint8_t v) { return v >> 4; }
|
|||||||
static inline uint32_t sw_compress_8to5(uint8_t v) { return v >> 3; }
|
static inline uint32_t sw_compress_8to5(uint8_t v) { return v >> 3; }
|
||||||
static inline uint32_t sw_compress_8to6(uint8_t v) { return v >> 2; }
|
static inline uint32_t sw_compress_8to6(uint8_t v) { return v >> 2; }
|
||||||
|
|
||||||
static inline uint32_t sw_compress_fto1(float v) { return v >= 0.5f ? 1 : 0; }
|
static inline uint32_t sw_compress_fto1(float v) { return (v >= 0.5f)? 1 : 0; }
|
||||||
static inline uint32_t sw_compress_fto2(float v) { return (uint32_t)(v*3.0f + 0.5f) & 0x03; }
|
static inline uint32_t sw_compress_fto2(float v) { return (uint32_t)(v*3.0f + 0.5f) & 0x03; }
|
||||||
static inline uint32_t sw_compress_fto3(float v) { return (uint32_t)(v*7.0f + 0.5f) & 0x07; }
|
static inline uint32_t sw_compress_fto3(float v) { return (uint32_t)(v*7.0f + 0.5f) & 0x07; }
|
||||||
static inline uint32_t sw_compress_fto4(float v) { return (uint32_t)(v*15.0f + 0.5f) & 0x0F; }
|
static inline uint32_t sw_compress_fto4(float v) { return (uint32_t)(v*15.0f + 0.5f) & 0x0F; }
|
||||||
@ -1752,48 +1752,20 @@ static inline void sw_pixel_get_color8(uint8_t *SW_RESTRICT color, const void *S
|
|||||||
{
|
{
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
case SW_PIXELFORMAT_COLOR_GRAYSCALE:
|
case SW_PIXELFORMAT_COLOR_GRAYSCALE: sw_pixel_get_color8_GRAYSCALE(color, pixels, offset); break;
|
||||||
sw_pixel_get_color8_GRAYSCALE(color, pixels, offset);
|
case SW_PIXELFORMAT_COLOR_GRAYALPHA: sw_pixel_get_color8_GRAYALPHA(color, pixels, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R3G3B2: sw_pixel_get_color8_R3G3B2(color, pixels, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_GRAYALPHA:
|
case SW_PIXELFORMAT_COLOR_R5G6B5: sw_pixel_get_color8_R5G6B5(color, pixels, offset); break;
|
||||||
sw_pixel_get_color8_GRAYALPHA(color, pixels, offset);
|
case SW_PIXELFORMAT_COLOR_R8G8B8: sw_pixel_get_color8_R8G8B8(color, pixels, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R5G5B5A1: sw_pixel_get_color8_R5G5B5A1(color, pixels, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R3G3B2:
|
case SW_PIXELFORMAT_COLOR_R4G4B4A4: sw_pixel_get_color8_R4G4B4A4(color, pixels, offset); break;
|
||||||
sw_pixel_get_color8_R3G3B2(color, pixels, offset);
|
case SW_PIXELFORMAT_COLOR_R8G8B8A8: sw_pixel_get_color8_R8G8B8A8(color, pixels, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R32: sw_pixel_get_color8_R32(color, pixels, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R5G6B5:
|
case SW_PIXELFORMAT_COLOR_R32G32B32: sw_pixel_get_color8_R32G32B32(color, pixels, offset); break;
|
||||||
sw_pixel_get_color8_R5G6B5(color, pixels, offset);
|
case SW_PIXELFORMAT_COLOR_R32G32B32A32: sw_pixel_get_color8_R32G32B32A32(color, pixels, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R16: sw_pixel_get_color8_R16(color, pixels, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R8G8B8:
|
case SW_PIXELFORMAT_COLOR_R16G16B16: sw_pixel_get_color8_R16G16B16(color, pixels, offset); break;
|
||||||
sw_pixel_get_color8_R8G8B8(color, pixels, offset);
|
case SW_PIXELFORMAT_COLOR_R16G16B16A16: sw_pixel_get_color8_R16G16B16A16(color, pixels, offset); break;
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R5G5B5A1:
|
|
||||||
sw_pixel_get_color8_R5G5B5A1(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R4G4B4A4:
|
|
||||||
sw_pixel_get_color8_R4G4B4A4(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R8G8B8A8:
|
|
||||||
sw_pixel_get_color8_R8G8B8A8(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32:
|
|
||||||
sw_pixel_get_color8_R32(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32G32B32:
|
|
||||||
sw_pixel_get_color8_R32G32B32(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32G32B32A32:
|
|
||||||
sw_pixel_get_color8_R32G32B32A32(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16:
|
|
||||||
sw_pixel_get_color8_R16(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16:
|
|
||||||
sw_pixel_get_color8_R16G16B16(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16A16:
|
|
||||||
sw_pixel_get_color8_R16G16B16A16(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SW_PIXELFORMAT_UNKNOWN:
|
case SW_PIXELFORMAT_UNKNOWN:
|
||||||
case SW_PIXELFORMAT_DEPTH_D8:
|
case SW_PIXELFORMAT_DEPTH_D8:
|
||||||
@ -1805,8 +1777,8 @@ static inline void sw_pixel_get_color8(uint8_t *SW_RESTRICT color, const void *S
|
|||||||
color[1] = 0.0f;
|
color[1] = 0.0f;
|
||||||
color[2] = 0.0f;
|
color[2] = 0.0f;
|
||||||
color[3] = 0.0f;
|
color[3] = 0.0f;
|
||||||
break;
|
} break;
|
||||||
}
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1921,55 +1893,27 @@ static inline void sw_pixel_set_color8(void *SW_RESTRICT pixels, const uint8_t *
|
|||||||
{
|
{
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
case SW_PIXELFORMAT_COLOR_GRAYSCALE:
|
case SW_PIXELFORMAT_COLOR_GRAYSCALE: sw_pixel_set_color8_GRAYSCALE(pixels, color, offset); break;
|
||||||
sw_pixel_set_color8_GRAYSCALE(pixels, color, offset);
|
case SW_PIXELFORMAT_COLOR_GRAYALPHA: sw_pixel_set_color8_GRAYALPHA(pixels, color, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R3G3B2: sw_pixel_set_color8_R3G3B2(pixels, color, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_GRAYALPHA:
|
case SW_PIXELFORMAT_COLOR_R5G6B5: sw_pixel_set_color8_R5G6B5(pixels, color, offset); break;
|
||||||
sw_pixel_set_color8_GRAYALPHA(pixels, color, offset);
|
case SW_PIXELFORMAT_COLOR_R8G8B8: sw_pixel_set_color8_R8G8B8(pixels, color, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R5G5B5A1: sw_pixel_set_color8_R5G5B5A1(pixels, color, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R3G3B2:
|
case SW_PIXELFORMAT_COLOR_R4G4B4A4: sw_pixel_set_color8_R4G4B4A4(pixels, color, offset); break;
|
||||||
sw_pixel_set_color8_R3G3B2(pixels, color, offset);
|
case SW_PIXELFORMAT_COLOR_R8G8B8A8: sw_pixel_set_color8_R8G8B8A8(pixels, color, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R32: sw_pixel_set_color8_R32(pixels, color, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R5G6B5:
|
case SW_PIXELFORMAT_COLOR_R32G32B32: sw_pixel_set_color8_R32G32B32(pixels, color, offset); break;
|
||||||
sw_pixel_set_color8_R5G6B5(pixels, color, offset);
|
case SW_PIXELFORMAT_COLOR_R32G32B32A32: sw_pixel_set_color8_R32G32B32A32(pixels, color, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R16: sw_pixel_set_color8_R16(pixels, color, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R8G8B8:
|
case SW_PIXELFORMAT_COLOR_R16G16B16: sw_pixel_set_color8_R16G16B16(pixels, color, offset); break;
|
||||||
sw_pixel_set_color8_R8G8B8(pixels, color, offset);
|
case SW_PIXELFORMAT_COLOR_R16G16B16A16: sw_pixel_set_color8_R16G16B16A16(pixels, color, offset); break;
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R5G5B5A1:
|
|
||||||
sw_pixel_set_color8_R5G5B5A1(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R4G4B4A4:
|
|
||||||
sw_pixel_set_color8_R4G4B4A4(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R8G8B8A8:
|
|
||||||
sw_pixel_set_color8_R8G8B8A8(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32:
|
|
||||||
sw_pixel_set_color8_R32(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32G32B32:
|
|
||||||
sw_pixel_set_color8_R32G32B32(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32G32B32A32:
|
|
||||||
sw_pixel_set_color8_R32G32B32A32(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16:
|
|
||||||
sw_pixel_set_color8_R16(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16:
|
|
||||||
sw_pixel_set_color8_R16G16B16(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16A16:
|
|
||||||
sw_pixel_set_color8_R16G16B16A16(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SW_PIXELFORMAT_UNKNOWN:
|
case SW_PIXELFORMAT_UNKNOWN:
|
||||||
case SW_PIXELFORMAT_DEPTH_D8:
|
case SW_PIXELFORMAT_DEPTH_D8:
|
||||||
case SW_PIXELFORMAT_DEPTH_D16:
|
case SW_PIXELFORMAT_DEPTH_D16:
|
||||||
case SW_PIXELFORMAT_DEPTH_D32:
|
case SW_PIXELFORMAT_DEPTH_D32:
|
||||||
case SW_PIXELFORMAT_COUNT:
|
case SW_PIXELFORMAT_COUNT: break;
|
||||||
break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2062,7 +2006,7 @@ static inline void sw_pixel_get_color_R8G8B8A8(float *SW_RESTRICT color, const v
|
|||||||
_mm_storeu_ps(color, fvals);
|
_mm_storeu_ps(color, fvals);
|
||||||
|
|
||||||
#elif defined(SW_HAS_RVV)
|
#elif defined(SW_HAS_RVV)
|
||||||
// TODO: Sample code generated by AI, needs testing and review
|
// TODO: WARNING: Sample code generated by AI, needs testing and review
|
||||||
size_t vl = __riscv_vsetvl_e8m1(4); // Set vector length for 8-bit input elements
|
size_t vl = __riscv_vsetvl_e8m1(4); // Set vector length for 8-bit input elements
|
||||||
vuint8m1_t vsrc_u8 = __riscv_vle8_v_u8m1(src, vl); // Load 4 unsigned 8-bit integers
|
vuint8m1_t vsrc_u8 = __riscv_vle8_v_u8m1(src, vl); // Load 4 unsigned 8-bit integers
|
||||||
vuint32m1_t vsrc_u32 = __riscv_vwcvt_xu_u_v_u32m1(vsrc_u8, vl); // Widen to 32-bit unsigned integers
|
vuint32m1_t vsrc_u32 = __riscv_vwcvt_xu_u_v_u32m1(vsrc_u8, vl); // Widen to 32-bit unsigned integers
|
||||||
@ -2136,48 +2080,20 @@ static inline void sw_pixel_get_color(float *SW_RESTRICT color, const void *SW_R
|
|||||||
{
|
{
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
case SW_PIXELFORMAT_COLOR_GRAYSCALE:
|
case SW_PIXELFORMAT_COLOR_GRAYSCALE: sw_pixel_get_color_GRAYSCALE(color, pixels, offset); break;
|
||||||
sw_pixel_get_color_GRAYSCALE(color, pixels, offset);
|
case SW_PIXELFORMAT_COLOR_GRAYALPHA: sw_pixel_get_color_GRAYALPHA(color, pixels, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R3G3B2: sw_pixel_get_color_R3G3B2(color, pixels, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_GRAYALPHA:
|
case SW_PIXELFORMAT_COLOR_R5G6B5: sw_pixel_get_color_R5G6B5(color, pixels, offset); break;
|
||||||
sw_pixel_get_color_GRAYALPHA(color, pixels, offset);
|
case SW_PIXELFORMAT_COLOR_R8G8B8: sw_pixel_get_color_R8G8B8(color, pixels, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R5G5B5A1: sw_pixel_get_color_R5G5B5A1(color, pixels, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R3G3B2:
|
case SW_PIXELFORMAT_COLOR_R4G4B4A4: sw_pixel_get_color_R4G4B4A4(color, pixels, offset); break;
|
||||||
sw_pixel_get_color_R3G3B2(color, pixels, offset);
|
case SW_PIXELFORMAT_COLOR_R8G8B8A8: sw_pixel_get_color_R8G8B8A8(color, pixels, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R32: sw_pixel_get_color_R32(color, pixels, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R5G6B5:
|
case SW_PIXELFORMAT_COLOR_R32G32B32: sw_pixel_get_color_R32G32B32(color, pixels, offset); break;
|
||||||
sw_pixel_get_color_R5G6B5(color, pixels, offset);
|
case SW_PIXELFORMAT_COLOR_R32G32B32A32: sw_pixel_get_color_R32G32B32A32(color, pixels, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R16: sw_pixel_get_color_R16(color, pixels, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R8G8B8:
|
case SW_PIXELFORMAT_COLOR_R16G16B16: sw_pixel_get_color_R16G16B16(color, pixels, offset); break;
|
||||||
sw_pixel_get_color_R8G8B8(color, pixels, offset);
|
case SW_PIXELFORMAT_COLOR_R16G16B16A16: sw_pixel_get_color_R16G16B16A16(color, pixels, offset); break;
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R5G5B5A1:
|
|
||||||
sw_pixel_get_color_R5G5B5A1(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R4G4B4A4:
|
|
||||||
sw_pixel_get_color_R4G4B4A4(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R8G8B8A8:
|
|
||||||
sw_pixel_get_color_R8G8B8A8(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32:
|
|
||||||
sw_pixel_get_color_R32(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32G32B32:
|
|
||||||
sw_pixel_get_color_R32G32B32(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32G32B32A32:
|
|
||||||
sw_pixel_get_color_R32G32B32A32(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16:
|
|
||||||
sw_pixel_get_color_R16(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16:
|
|
||||||
sw_pixel_get_color_R16G16B16(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16A16:
|
|
||||||
sw_pixel_get_color_R16G16B16A16(color, pixels, offset);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SW_PIXELFORMAT_UNKNOWN:
|
case SW_PIXELFORMAT_UNKNOWN:
|
||||||
case SW_PIXELFORMAT_DEPTH_D8:
|
case SW_PIXELFORMAT_DEPTH_D8:
|
||||||
@ -2189,8 +2105,8 @@ static inline void sw_pixel_get_color(float *SW_RESTRICT color, const void *SW_R
|
|||||||
color[1] = 0.0f;
|
color[1] = 0.0f;
|
||||||
color[2] = 0.0f;
|
color[2] = 0.0f;
|
||||||
color[3] = 0.0f;
|
color[3] = 0.0f;
|
||||||
break;
|
} break;
|
||||||
}
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2277,7 +2193,7 @@ static inline void sw_pixel_set_color_R8G8B8A8(void *SW_RESTRICT pixels, const f
|
|||||||
_mm_storeu_si32(dst, i8);
|
_mm_storeu_si32(dst, i8);
|
||||||
|
|
||||||
#elif defined(SW_HAS_RVV)
|
#elif defined(SW_HAS_RVV)
|
||||||
// TODO: Sample code generated by AI, needs testing and review
|
// TODO: WARNING: Sample code generated by AI, needs testing and review
|
||||||
// REVIEW: It shouldn't perform so many operations; take inspiration from other versions
|
// REVIEW: It shouldn't perform so many operations; take inspiration from other versions
|
||||||
// NOTE: RVV 1.0 specs define the use of __riscv_ prefix for instrinsic functions
|
// NOTE: RVV 1.0 specs define the use of __riscv_ prefix for instrinsic functions
|
||||||
size_t vl = __riscv_vsetvl_e32m1(4); // Load up to 4 floats into a vector register
|
size_t vl = __riscv_vsetvl_e32m1(4); // Load up to 4 floats into a vector register
|
||||||
@ -2350,55 +2266,26 @@ static inline void sw_pixel_set_color(void *SW_RESTRICT pixels, const float *SW_
|
|||||||
{
|
{
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
case SW_PIXELFORMAT_COLOR_GRAYSCALE:
|
case SW_PIXELFORMAT_COLOR_GRAYSCALE: sw_pixel_set_color_GRAYSCALE(pixels, color, offset); break;
|
||||||
sw_pixel_set_color_GRAYSCALE(pixels, color, offset);
|
case SW_PIXELFORMAT_COLOR_GRAYALPHA: sw_pixel_set_color_GRAYALPHA(pixels, color, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R3G3B2: sw_pixel_set_color_R3G3B2(pixels, color, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_GRAYALPHA:
|
case SW_PIXELFORMAT_COLOR_R5G6B5: sw_pixel_set_color_R5G6B5(pixels, color, offset); break;
|
||||||
sw_pixel_set_color_GRAYALPHA(pixels, color, offset);
|
case SW_PIXELFORMAT_COLOR_R8G8B8: sw_pixel_set_color_R8G8B8(pixels, color, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R5G5B5A1: sw_pixel_set_color_R5G5B5A1(pixels, color, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R3G3B2:
|
case SW_PIXELFORMAT_COLOR_R4G4B4A4: sw_pixel_set_color_R4G4B4A4(pixels, color, offset); break;
|
||||||
sw_pixel_set_color_R3G3B2(pixels, color, offset);
|
case SW_PIXELFORMAT_COLOR_R8G8B8A8: sw_pixel_set_color_R8G8B8A8(pixels, color, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R32: sw_pixel_set_color_R32(pixels, color, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R5G6B5:
|
case SW_PIXELFORMAT_COLOR_R32G32B32: sw_pixel_set_color_R32G32B32(pixels, color, offset); break;
|
||||||
sw_pixel_set_color_R5G6B5(pixels, color, offset);
|
case SW_PIXELFORMAT_COLOR_R32G32B32A32: sw_pixel_set_color_R32G32B32A32(pixels, color, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_COLOR_R16: sw_pixel_set_color_R16(pixels, color, offset); break;
|
||||||
case SW_PIXELFORMAT_COLOR_R8G8B8:
|
case SW_PIXELFORMAT_COLOR_R16G16B16: sw_pixel_set_color_R16G16B16(pixels, color, offset); break;
|
||||||
sw_pixel_set_color_R8G8B8(pixels, color, offset);
|
case SW_PIXELFORMAT_COLOR_R16G16B16A16: sw_pixel_set_color_R16G16B16A16(pixels, color, offset); break;
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R5G5B5A1:
|
|
||||||
sw_pixel_set_color_R5G5B5A1(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R4G4B4A4:
|
|
||||||
sw_pixel_set_color_R4G4B4A4(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R8G8B8A8:
|
|
||||||
sw_pixel_set_color_R8G8B8A8(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32:
|
|
||||||
sw_pixel_set_color_R32(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32G32B32:
|
|
||||||
sw_pixel_set_color_R32G32B32(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R32G32B32A32:
|
|
||||||
sw_pixel_set_color_R32G32B32A32(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16:
|
|
||||||
sw_pixel_set_color_R16(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16:
|
|
||||||
sw_pixel_set_color_R16G16B16(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16A16:
|
|
||||||
sw_pixel_set_color_R16G16B16A16(pixels, color, offset);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SW_PIXELFORMAT_UNKNOWN:
|
case SW_PIXELFORMAT_UNKNOWN:
|
||||||
case SW_PIXELFORMAT_DEPTH_D8:
|
case SW_PIXELFORMAT_DEPTH_D8:
|
||||||
case SW_PIXELFORMAT_DEPTH_D16:
|
case SW_PIXELFORMAT_DEPTH_D16:
|
||||||
case SW_PIXELFORMAT_DEPTH_D32:
|
case SW_PIXELFORMAT_DEPTH_D32:
|
||||||
case SW_PIXELFORMAT_COUNT:
|
case SW_PIXELFORMAT_COUNT: break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2421,12 +2308,9 @@ static inline float sw_pixel_get_depth(const void *pixels, uint32_t offset, sw_p
|
|||||||
{
|
{
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
case SW_PIXELFORMAT_DEPTH_D8:
|
case SW_PIXELFORMAT_DEPTH_D8: return sw_pixel_get_depth_D8(pixels, offset);
|
||||||
return sw_pixel_get_depth_D8(pixels, offset);
|
case SW_PIXELFORMAT_DEPTH_D16: return sw_pixel_get_depth_D16(pixels, offset);
|
||||||
case SW_PIXELFORMAT_DEPTH_D16:
|
case SW_PIXELFORMAT_DEPTH_D32: return sw_pixel_get_depth_D32(pixels, offset);
|
||||||
return sw_pixel_get_depth_D16(pixels, offset);
|
|
||||||
case SW_PIXELFORMAT_DEPTH_D32:
|
|
||||||
return sw_pixel_get_depth_D32(pixels, offset);
|
|
||||||
|
|
||||||
case SW_PIXELFORMAT_UNKNOWN:
|
case SW_PIXELFORMAT_UNKNOWN:
|
||||||
case SW_PIXELFORMAT_COLOR_GRAYSCALE:
|
case SW_PIXELFORMAT_COLOR_GRAYSCALE:
|
||||||
@ -2443,8 +2327,7 @@ static inline float sw_pixel_get_depth(const void *pixels, uint32_t offset, sw_p
|
|||||||
case SW_PIXELFORMAT_COLOR_R16:
|
case SW_PIXELFORMAT_COLOR_R16:
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16:
|
case SW_PIXELFORMAT_COLOR_R16G16B16:
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16A16:
|
case SW_PIXELFORMAT_COLOR_R16G16B16A16:
|
||||||
case SW_PIXELFORMAT_COUNT:
|
case SW_PIXELFORMAT_COUNT: break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
@ -2469,15 +2352,9 @@ static inline void sw_pixel_set_depth(void *pixels, float depth, uint32_t offset
|
|||||||
{
|
{
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
case SW_PIXELFORMAT_DEPTH_D8:
|
case SW_PIXELFORMAT_DEPTH_D8: sw_pixel_set_depth_D8(pixels, depth, offset); break;
|
||||||
sw_pixel_set_depth_D8(pixels, depth, offset);
|
case SW_PIXELFORMAT_DEPTH_D16: w_pixel_set_depth_D16(pixels, depth, offset); break;
|
||||||
break;
|
case SW_PIXELFORMAT_DEPTH_D32: sw_pixel_set_depth_D32(pixels, depth, offset); break;
|
||||||
case SW_PIXELFORMAT_DEPTH_D16:
|
|
||||||
sw_pixel_set_depth_D16(pixels, depth, offset);
|
|
||||||
break;
|
|
||||||
case SW_PIXELFORMAT_DEPTH_D32:
|
|
||||||
sw_pixel_set_depth_D32(pixels, depth, offset);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SW_PIXELFORMAT_UNKNOWN:
|
case SW_PIXELFORMAT_UNKNOWN:
|
||||||
case SW_PIXELFORMAT_COLOR_GRAYSCALE:
|
case SW_PIXELFORMAT_COLOR_GRAYSCALE:
|
||||||
@ -2494,8 +2371,7 @@ static inline void sw_pixel_set_depth(void *pixels, float depth, uint32_t offset
|
|||||||
case SW_PIXELFORMAT_COLOR_R16:
|
case SW_PIXELFORMAT_COLOR_R16:
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16:
|
case SW_PIXELFORMAT_COLOR_R16G16B16:
|
||||||
case SW_PIXELFORMAT_COLOR_R16G16B16A16:
|
case SW_PIXELFORMAT_COLOR_R16G16B16A16:
|
||||||
case SW_PIXELFORMAT_COUNT:
|
case SW_PIXELFORMAT_COUNT: break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//-------------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------------
|
||||||
@ -2812,11 +2688,8 @@ static inline void sw_framebuffer_output_copy(void* dst, const sw_texture_t* buf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void sw_framebuffer_output_blit(
|
static inline void sw_framebuffer_output_blit(void *dst, const sw_texture_t *buffer,
|
||||||
void* dst, const sw_texture_t* buffer,
|
int xDst, int yDst, int wDst, int hDst, int xSrc, int ySrc, int wSrc, int hSrc, sw_pixelformat_t format)
|
||||||
int xDst, int yDst, int wDst, int hDst,
|
|
||||||
int xSrc, int ySrc, int wSrc, int hSrc,
|
|
||||||
sw_pixelformat_t format)
|
|
||||||
{
|
{
|
||||||
const uint8_t *srcBase = buffer->pixels;
|
const uint8_t *srcBase = buffer->pixels;
|
||||||
|
|
||||||
@ -3692,7 +3565,8 @@ static inline bool sw_line_clip_coord(float q, float p, float *t0, float *t1)
|
|||||||
static bool sw_line_clip(sw_vertex_t *v0, sw_vertex_t *v1)
|
static bool sw_line_clip(sw_vertex_t *v0, sw_vertex_t *v1)
|
||||||
{
|
{
|
||||||
float t0 = 0.0f, t1 = 1.0f;
|
float t0 = 0.0f, t1 = 1.0f;
|
||||||
float dH[4], dC[4];
|
float dH[4] = { 0 }
|
||||||
|
float dC[4] = { 0 };
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
@ -4460,7 +4334,7 @@ void swLoadIdentity(void)
|
|||||||
|
|
||||||
void swTranslatef(float x, float y, float z)
|
void swTranslatef(float x, float y, float z)
|
||||||
{
|
{
|
||||||
sw_matrix_t mat;
|
sw_matrix_t mat = { 0 };
|
||||||
sw_matrix_id(mat);
|
sw_matrix_id(mat);
|
||||||
|
|
||||||
mat[12] = x;
|
mat[12] = x;
|
||||||
@ -4490,7 +4364,7 @@ void swRotatef(float angle, float x, float y, float z)
|
|||||||
float cosres = cosf(angle);
|
float cosres = cosf(angle);
|
||||||
float t = 1.0f - cosres;
|
float t = 1.0f - cosres;
|
||||||
|
|
||||||
sw_matrix_t mat;
|
sw_matrix_t mat = { 0 };
|
||||||
|
|
||||||
mat[0] = x*x*t + cosres;
|
mat[0] = x*x*t + cosres;
|
||||||
mat[1] = y*x*t + z*sinres;
|
mat[1] = y*x*t + z*sinres;
|
||||||
@ -4519,7 +4393,7 @@ void swRotatef(float angle, float x, float y, float z)
|
|||||||
|
|
||||||
void swScalef(float x, float y, float z)
|
void swScalef(float x, float y, float z)
|
||||||
{
|
{
|
||||||
sw_matrix_t mat;
|
sw_matrix_t mat = { 0 };
|
||||||
|
|
||||||
mat[0] = x, mat[1] = 0, mat[2] = 0, mat[3] = 0;
|
mat[0] = x, mat[1] = 0, mat[2] = 0, mat[3] = 0;
|
||||||
mat[4] = 0, mat[5] = y, mat[6] = 0, mat[7] = 0;
|
mat[4] = 0, mat[5] = y, mat[6] = 0, mat[7] = 0;
|
||||||
@ -4540,7 +4414,7 @@ void swMultMatrixf(const float *mat)
|
|||||||
|
|
||||||
void swFrustum(double left, double right, double bottom, double top, double znear, double zfar)
|
void swFrustum(double left, double right, double bottom, double top, double znear, double zfar)
|
||||||
{
|
{
|
||||||
sw_matrix_t mat;
|
sw_matrix_t mat = { 0 };
|
||||||
|
|
||||||
double rl = right - left;
|
double rl = right - left;
|
||||||
double tb = top - bottom;
|
double tb = top - bottom;
|
||||||
@ -4573,7 +4447,7 @@ void swFrustum(double left, double right, double bottom, double top, double znea
|
|||||||
|
|
||||||
void swOrtho(double left, double right, double bottom, double top, double znear, double zfar)
|
void swOrtho(double left, double right, double bottom, double top, double znear, double zfar)
|
||||||
{
|
{
|
||||||
sw_matrix_t mat;
|
sw_matrix_t mat = { 0 };
|
||||||
|
|
||||||
double rl = right - left;
|
double rl = right - left;
|
||||||
double tb = top - bottom;
|
double tb = top - bottom;
|
||||||
@ -4695,7 +4569,7 @@ void swVertex4fv(const float *v)
|
|||||||
|
|
||||||
void swColor3ub(uint8_t r, uint8_t g, uint8_t b)
|
void swColor3ub(uint8_t r, uint8_t g, uint8_t b)
|
||||||
{
|
{
|
||||||
float cv[4];
|
float cv[4] = { 0 };
|
||||||
cv[0] = (float)r*SW_INV_255;
|
cv[0] = (float)r*SW_INV_255;
|
||||||
cv[1] = (float)g*SW_INV_255;
|
cv[1] = (float)g*SW_INV_255;
|
||||||
cv[2] = (float)b*SW_INV_255;
|
cv[2] = (float)b*SW_INV_255;
|
||||||
@ -4706,7 +4580,7 @@ void swColor3ub(uint8_t r, uint8_t g, uint8_t b)
|
|||||||
|
|
||||||
void swColor3ubv(const uint8_t *v)
|
void swColor3ubv(const uint8_t *v)
|
||||||
{
|
{
|
||||||
float cv[4];
|
float cv[4] = { 0 };
|
||||||
cv[0] = (float)v[0]*SW_INV_255;
|
cv[0] = (float)v[0]*SW_INV_255;
|
||||||
cv[1] = (float)v[1]*SW_INV_255;
|
cv[1] = (float)v[1]*SW_INV_255;
|
||||||
cv[2] = (float)v[2]*SW_INV_255;
|
cv[2] = (float)v[2]*SW_INV_255;
|
||||||
@ -4717,7 +4591,7 @@ void swColor3ubv(const uint8_t *v)
|
|||||||
|
|
||||||
void swColor3f(float r, float g, float b)
|
void swColor3f(float r, float g, float b)
|
||||||
{
|
{
|
||||||
float cv[4];
|
float cv[4] = { 0 };
|
||||||
cv[0] = r;
|
cv[0] = r;
|
||||||
cv[1] = g;
|
cv[1] = g;
|
||||||
cv[2] = b;
|
cv[2] = b;
|
||||||
@ -4728,7 +4602,7 @@ void swColor3f(float r, float g, float b)
|
|||||||
|
|
||||||
void swColor3fv(const float *v)
|
void swColor3fv(const float *v)
|
||||||
{
|
{
|
||||||
float cv[4];
|
float cv[4] = { 0 };
|
||||||
cv[0] = v[0];
|
cv[0] = v[0];
|
||||||
cv[1] = v[1];
|
cv[1] = v[1];
|
||||||
cv[2] = v[2];
|
cv[2] = v[2];
|
||||||
@ -4739,7 +4613,7 @@ void swColor3fv(const float *v)
|
|||||||
|
|
||||||
void swColor4ub(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
|
void swColor4ub(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
|
||||||
{
|
{
|
||||||
float cv[4];
|
float cv[4] = { 0 };
|
||||||
cv[0] = (float)r*SW_INV_255;
|
cv[0] = (float)r*SW_INV_255;
|
||||||
cv[1] = (float)g*SW_INV_255;
|
cv[1] = (float)g*SW_INV_255;
|
||||||
cv[2] = (float)b*SW_INV_255;
|
cv[2] = (float)b*SW_INV_255;
|
||||||
@ -4750,7 +4624,7 @@ void swColor4ub(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
|
|||||||
|
|
||||||
void swColor4ubv(const uint8_t *v)
|
void swColor4ubv(const uint8_t *v)
|
||||||
{
|
{
|
||||||
float cv[4];
|
float cv[4] = { 0 };
|
||||||
cv[0] = (float)v[0]*SW_INV_255;
|
cv[0] = (float)v[0]*SW_INV_255;
|
||||||
cv[1] = (float)v[1]*SW_INV_255;
|
cv[1] = (float)v[1]*SW_INV_255;
|
||||||
cv[2] = (float)v[2]*SW_INV_255;
|
cv[2] = (float)v[2]*SW_INV_255;
|
||||||
@ -4761,7 +4635,7 @@ void swColor4ubv(const uint8_t *v)
|
|||||||
|
|
||||||
void swColor4f(float r, float g, float b, float a)
|
void swColor4f(float r, float g, float b, float a)
|
||||||
{
|
{
|
||||||
float cv[4];
|
float cv[4] = { 0 };
|
||||||
cv[0] = r;
|
cv[0] = r;
|
||||||
cv[1] = g;
|
cv[1] = g;
|
||||||
cv[2] = b;
|
cv[2] = b;
|
||||||
@ -4891,18 +4765,10 @@ void swDrawElements(SWdraw mode, int count, int type, const void *indices)
|
|||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case SW_UNSIGNED_BYTE:
|
case SW_UNSIGNED_BYTE: indicesUb = (const uint8_t *)indices; break;
|
||||||
indicesUb = (const uint8_t *)indices;
|
case SW_UNSIGNED_SHORT: indicesUs = (const uint16_t *)indices; break;
|
||||||
break;
|
case SW_UNSIGNED_INT: indicesUi = (const uint32_t *)indices; break;
|
||||||
case SW_UNSIGNED_SHORT:
|
default: RLSW.errCode = SW_INVALID_ENUM; return;
|
||||||
indicesUs = (const uint16_t *)indices;
|
|
||||||
break;
|
|
||||||
case SW_UNSIGNED_INT:
|
|
||||||
indicesUi = (const uint32_t *)indices;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
RLSW.errCode = SW_INVALID_ENUM;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
swBegin(mode);
|
swBegin(mode);
|
||||||
@ -5030,9 +4896,7 @@ void swTexStorage2D(int width, int height, SWinternalformat format)
|
|||||||
case SW_DEPTH_COMPONENT24: pixelFormat = SW_PIXELFORMAT_DEPTH_D32; break;
|
case SW_DEPTH_COMPONENT24: pixelFormat = SW_PIXELFORMAT_DEPTH_D32; break;
|
||||||
case SW_DEPTH_COMPONENT32: pixelFormat = SW_PIXELFORMAT_DEPTH_D32; break;
|
case SW_DEPTH_COMPONENT32: pixelFormat = SW_PIXELFORMAT_DEPTH_D32; break;
|
||||||
case SW_DEPTH_COMPONENT32F: pixelFormat = SW_PIXELFORMAT_DEPTH_D32; break;
|
case SW_DEPTH_COMPONENT32F: pixelFormat = SW_PIXELFORMAT_DEPTH_D32; break;
|
||||||
default:
|
default: RLSW.errCode = SW_INVALID_ENUM; return;
|
||||||
RLSW.errCode = SW_INVALID_ENUM;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)sw_texture_alloc(RLSW.boundTexture, NULL, width, height, pixelFormat);
|
(void)sw_texture_alloc(RLSW.boundTexture, NULL, width, height, pixelFormat);
|
||||||
@ -5114,28 +4978,26 @@ void swTexParameteri(int param, int value)
|
|||||||
switch (param)
|
switch (param)
|
||||||
{
|
{
|
||||||
case SW_TEXTURE_MIN_FILTER:
|
case SW_TEXTURE_MIN_FILTER:
|
||||||
|
{
|
||||||
if (!sw_is_texture_filter_valid(value)) { RLSW.errCode = SW_INVALID_ENUM; return; }
|
if (!sw_is_texture_filter_valid(value)) { RLSW.errCode = SW_INVALID_ENUM; return; }
|
||||||
RLSW.boundTexture->minFilter = (SWfilter)value;
|
RLSW.boundTexture->minFilter = (SWfilter)value;
|
||||||
break;
|
} break;
|
||||||
|
|
||||||
case SW_TEXTURE_MAG_FILTER:
|
case SW_TEXTURE_MAG_FILTER:
|
||||||
|
{
|
||||||
if (!sw_is_texture_filter_valid(value)) { RLSW.errCode = SW_INVALID_ENUM; return; }
|
if (!sw_is_texture_filter_valid(value)) { RLSW.errCode = SW_INVALID_ENUM; return; }
|
||||||
RLSW.boundTexture->magFilter = (SWfilter)value;
|
RLSW.boundTexture->magFilter = (SWfilter)value;
|
||||||
break;
|
} break;
|
||||||
|
|
||||||
case SW_TEXTURE_WRAP_S:
|
case SW_TEXTURE_WRAP_S:
|
||||||
|
{
|
||||||
if (!sw_is_texture_wrap_valid(value)) { RLSW.errCode = SW_INVALID_ENUM; return; }
|
if (!sw_is_texture_wrap_valid(value)) { RLSW.errCode = SW_INVALID_ENUM; return; }
|
||||||
RLSW.boundTexture->sWrap = (SWwrap)value;
|
RLSW.boundTexture->sWrap = (SWwrap)value;
|
||||||
break;
|
} break;
|
||||||
|
|
||||||
case SW_TEXTURE_WRAP_T:
|
case SW_TEXTURE_WRAP_T:
|
||||||
|
{
|
||||||
if (!sw_is_texture_wrap_valid(value)) { RLSW.errCode = SW_INVALID_ENUM; return; }
|
if (!sw_is_texture_wrap_valid(value)) { RLSW.errCode = SW_INVALID_ENUM; return; }
|
||||||
RLSW.boundTexture->tWrap = (SWwrap)value;
|
RLSW.boundTexture->tWrap = (SWwrap)value;
|
||||||
break;
|
} break;
|
||||||
|
default: RLSW.errCode = SW_INVALID_ENUM; break;
|
||||||
default:
|
|
||||||
RLSW.errCode = SW_INVALID_ENUM;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5207,58 +5069,37 @@ void swFramebufferTexture2D(SWattachment attach, uint32_t texture)
|
|||||||
switch (attach)
|
switch (attach)
|
||||||
{
|
{
|
||||||
case SW_COLOR_ATTACHMENT:
|
case SW_COLOR_ATTACHMENT:
|
||||||
|
{
|
||||||
fb->colorAttachment = texture;
|
fb->colorAttachment = texture;
|
||||||
RLSW.colorBuffer = sw_pool_get(&RLSW.texturePool, texture);
|
RLSW.colorBuffer = sw_pool_get(&RLSW.texturePool, texture);
|
||||||
break;
|
} break;
|
||||||
case SW_DEPTH_ATTACHMENT:
|
case SW_DEPTH_ATTACHMENT:
|
||||||
|
{
|
||||||
fb->depthAttachment = texture;
|
fb->depthAttachment = texture;
|
||||||
RLSW.depthBuffer = sw_pool_get(&RLSW.texturePool, texture);
|
RLSW.depthBuffer = sw_pool_get(&RLSW.texturePool, texture);
|
||||||
break;
|
} break;
|
||||||
default:
|
default: RLSW.errCode = SW_INVALID_ENUM; break;
|
||||||
RLSW.errCode = SW_INVALID_ENUM;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SWfbstatus swCheckFramebufferStatus(void)
|
SWfbstatus swCheckFramebufferStatus(void)
|
||||||
{
|
{
|
||||||
if (RLSW.boundFramebufferId == SW_HANDLE_NULL)
|
if (RLSW.boundFramebufferId == SW_HANDLE_NULL) return SW_FRAMEBUFFER_COMPLETE;
|
||||||
{
|
|
||||||
return SW_FRAMEBUFFER_COMPLETE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RLSW.colorBuffer == NULL)
|
if (RLSW.colorBuffer == NULL) return SW_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
|
||||||
{
|
|
||||||
return SW_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sw_is_texture_complete(RLSW.colorBuffer))
|
if (!sw_is_texture_complete(RLSW.colorBuffer)) return SW_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||||
{
|
|
||||||
return SW_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RLSW.colorBuffer->format != SW_FRAMEBUFFER_COLOR_FORMAT)
|
if (RLSW.colorBuffer->format != SW_FRAMEBUFFER_COLOR_FORMAT) return SW_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||||
{
|
|
||||||
return SW_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RLSW.depthBuffer)
|
if (RLSW.depthBuffer)
|
||||||
{
|
{
|
||||||
if (!sw_is_texture_complete(RLSW.depthBuffer))
|
if (!sw_is_texture_complete(RLSW.depthBuffer)) return SW_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||||
{
|
|
||||||
return SW_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RLSW.depthBuffer->format != SW_FRAMEBUFFER_DEPTH_FORMAT)
|
if (RLSW.depthBuffer->format != SW_FRAMEBUFFER_DEPTH_FORMAT) return SW_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||||
{
|
|
||||||
return SW_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((RLSW.colorBuffer->width != RLSW.depthBuffer->width) ||
|
if ((RLSW.colorBuffer->width != RLSW.depthBuffer->width) ||
|
||||||
(RLSW.colorBuffer->height != RLSW.depthBuffer->height))
|
(RLSW.colorBuffer->height != RLSW.depthBuffer->height)) return SW_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
|
||||||
{
|
|
||||||
return SW_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return SW_FRAMEBUFFER_COMPLETE;
|
return SW_FRAMEBUFFER_COMPLETE;
|
||||||
@ -5285,23 +5126,11 @@ void swGetFramebufferAttachmentParameteriv(SWattachment attachment, SWattachget
|
|||||||
{
|
{
|
||||||
case SW_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
|
case SW_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
|
||||||
{
|
{
|
||||||
switch (attachment)
|
if (attachment == SW_COLOR_ATTACHMENT) *v = fb->colorAttachment;
|
||||||
{
|
else if (attachment == SW_DEPTH_ATTACHMENT) *v = fb->depthAttachment;
|
||||||
case SW_COLOR_ATTACHMENT:
|
} break;
|
||||||
*v = fb->colorAttachment;
|
case SW_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: *v = GL_TEXTURE; break;
|
||||||
break;
|
default: break;
|
||||||
case SW_DEPTH_ATTACHMENT:
|
|
||||||
*v = fb->depthAttachment;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SW_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
|
|
||||||
{
|
|
||||||
*v = GL_TEXTURE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5538,10 +5367,8 @@ static void SW_RASTER_TRIANGLE(const sw_vertex_t *v0, const sw_vertex_t *v1, con
|
|||||||
{
|
{
|
||||||
vLeft.screen[1] = vRight.screen[1] = y;
|
vLeft.screen[1] = vRight.screen[1] = y;
|
||||||
|
|
||||||
if (vLeft.screen[0] < vRight.screen[0])
|
if (vLeft.screen[0] < vRight.screen[0]) SW_RASTER_TRIANGLE_SPAN(&vLeft, &vRight, dVXdy02.texcoord[0], dVXdy02.texcoord[1]);
|
||||||
SW_RASTER_TRIANGLE_SPAN(&vLeft, &vRight, dVXdy02.texcoord[0], dVXdy02.texcoord[1]);
|
else SW_RASTER_TRIANGLE_SPAN(&vRight, &vLeft, dVXdy02.texcoord[0], dVXdy02.texcoord[1]);
|
||||||
else
|
|
||||||
SW_RASTER_TRIANGLE_SPAN(&vRight, &vLeft, dVXdy02.texcoord[0], dVXdy02.texcoord[1]);
|
|
||||||
|
|
||||||
sw_add_vertex_grad_PTCH(&vLeft, &dVXdy02);
|
sw_add_vertex_grad_PTCH(&vLeft, &dVXdy02);
|
||||||
vLeft.screen[0] += dXdy02;
|
vLeft.screen[0] += dXdy02;
|
||||||
|
|||||||
Reference in New Issue
Block a user