Note that high-dpi awareness must be enabled by users and `CORE.Window.render` reports the scaled framebuffer size, while `CORE.Window.screen` reports the logical size.
`ToggleBorderlessWindow()` has also been reviewed to be consistent with scaling, if monitor physical display size is reported as 1920x1080 but there is a content scale of 1.5, then the borderless fullscreen window will be 1280x720, with the 1920x1080 framebuffer
This improvement is just a prove of concept, at this moment `PLATFORM_WEB` is limited in terms of software rendering by `GLFW` that only allows creating a WebGL canvas context with `glfwCreateWindow()`.
We can skip that call but then some GLFW functionality is not available (windowing, inputs). The best solution is replacing GLFW completely by a pure Emscripten implementation for `PLATFORM_WEB`.
Following raylib design, a warning log message is shown and program can continue execution.
Some early return checks have been added on most critical functions.
[rtext] Previous implementation checking `isGpuReady` cross-module variable is not needed any more, resulting in a more decoupled code, load failure is managed at rlgl level
* Make the comments on the camera 2d fields more clear about what space each one is in.
* rlparser: update raylib_api.* by CI
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Fix modulo bias in GetRandomValue(); implement rejection sampling for uniformity
* Replace do-while with for-loop in GetRandomValue rejection sampling
target already gets assigned by the clang macro it points to, overwriting it causes it to target linux instead of android, making it check for usr directories instead of the NDK's directories
When SDL_GameControllerNameForIndex returns null, the app crashes. This was addressed earlier in PR#4859 though the fix submitted on PR #4859 was only fixing the crashing and not addressing the root cause.
* use FLAG_* macros where possible
* rename `FLAG_CHECK()` to `FLAG_IS_SET()`
* remove unnecessary equality checks
* fix issues
---------
Co-authored-by: Ray <raysan5@gmail.com>
* consistency tweak
* unified color and depth buffer
* tweaks
* review the storage of clear values + complete get/set depth value
* copy/blit fast path
* better simd read/write
* framebuffer alignment
* fix 'typo'
my french slipped out
* simplified framebuffer management
* convert texture to rgba32
* remove float copy/blit
* adding SIMD framebuffer read/write
This adds SIMD framebuffer read/write, and also texel fetch.
This supports SSE2/SSE41 and SISD fallback (also includes ARM NEON support, conceptually identical but still needs testing).
* consistency
* tweaks
* review of `sw_texture_sample_linear`
* better quad sorting
unrelated to the PR, but at least it's done
* ignore some pipeline state in certains context
* convention tweaks
---------
Co-authored-by: Ray <raysan5@gmail.com>
SDL3 uses ID when dealing with monitors, unlike SDL2 which uses Index
for the same thing. This problem was already fixed in multiple places
by use of preprocessor branches, so I did the very same thing.
Please, notice that this is a pretty bad solution to this problem,
and I only did it to keep it consistent with the rest of the code.
The more about why it's not correct is mentioned here:
https://github.com/raysan5/raylib/issues/5256#issuecomment-3429156919
Hopefully, someone will refactor it someday :)
Fixes: https://github.com/raysan5/raylib/issues/5256
* add base of rlsw.h
* implement state support
Also replace the triangle rasterization functions with macros that generate specific functions for each state of the rendering system.
Also, add the OpenGL definitions in order to add a binding for rlgl.
* branchless float saturation
* apply perspective correction to colors
* impl line clipping and rasterization
+ tweak function names
* impl face culling
* impl color blending
* fixes and tweaks
* add clear buffer bitmasks
* small optimizations / tweaks
* review ndc to screen projection
* avoid to recalculate MVP when its not needed + tweaks
* review the loading and management of textures
to be closer to the OpenGL API
* texture sampling optimization
* review get pixel functions
+ review unorm/float conversion
* add several buffer format support
Several depth and color formats have been added for the framebuffer.
8-bit, 16-bit, and 24-bit formats are now available for depth.
RGB 8-bit (332), RGB 16-bit (565), and RGB 24-bit (888) formats are now available for color.
Alpha support is no longer present for the framebuffer at the moment, but it can easily be restored by adding the formats and reinterpolating the alpha in the areas that do not perform color blending.
Additionally, this commit brings performance improvements.
* tweaks
* impl line width
* impl points + point size
* fix and improve polygon clipping functions
* impl polygone modes
* add some not planned functions
- `glDepthMask`
- `glColorMask`
* framebuffer resizing + handle init failure
* add quick notes about line clipping algorithms used
* start to impl scissor test + review line clipping
The support for the scissor test has been implemented for clearing as well as for triangle clipping.
The implementation for lines and points is still missing.
I also removed the 2D clipping of lines that used the Cohen-Sutherland algorithm, opting instead to always use the Liang-Barsky algorithm in all cases.
This simplifies the implementation, and the 2D version would have caused issues when interpolating vertices in the future if we want to implement additional features.
* review scissor clear
* review `swScissor`
* impl line scissor clipping
* round screen coordinate (line rasterization)
* impl point scissor clipping
* remove unused defs
* add getter functions
* gl binding
* add `glHint` and `glShadeModel` macros (not implmented)
* binding tweaks
* impl copy framebuffer function + glReadPixels
* review `swCopyFramebuffer`
* update rlgl.h
* update rlgl.h
* texture copy support
* fix typo..
* add get error function
* def sw alloc macros
* reimpl get color buffer func
just in case
* remove normal interpolation
* review texture wrap
* fix ndc projection (viewport/scissor)
* impl framebuffer blit function
* reduce matrix compuations and memory usage
* swBegin tweaks
* preventing a possible division by zero
* remove useless scissor related data
* review color blending system
* greatly improve float saturation
* tweak lerp vertex function
* use opitmized fract function in sw_texture_map
* tweak framebuffer functions for better readability
* optimized copy/blit functions for each dst format
* review framebuffer filling functions
* impl specific quad rendering func
* use of a single global vertex buffer
* fix 'sw_poly_point_render'
* added `SW_RESTRICT` and redesigned `sw_lerp_vertex_PNCTH`
* tweak the pipeline flow regarding the face culling
avoids misprediction, improves vectorization if possible
* new rendering path for axis aligned quads
* oops, translating some comments
* use of `restrict` for blending function parameters
* update rlgl.h
* adding `GRAPHICS_API_OPENGL_11_SOFTWARE` in `DrawMesh`
* add `RL_OPENGL_11_SOFTWARE` enum
* temp tweak
* build fixes
* fix DrawMesh for GL 1.1
* update swClose
* review texture format + fix copy
* set minimum req vertices to 3 (quads)
* check swInit
* review pixelformat
* tweaks
* fix animNormals (DrawMesh)
* fallback color/texcoord (swDrawArrays)
* review swMultMatrixf
* fix texture pool alloc..
* review triangle scanlines
increment all data
* fix `sw_quad_sort_cw`
* impl sdl platform
* rm def
* increase max clipped polygon vertices
* improve triangle rasterization along Y axis
improved robustness against numerical errors
incremental interpolation along Y
simplified function, fewer jumps
* review current vertex data
+ increase max clipped polygon vertices (for extreme cases)
* fix and improve polygon clipping
Sets the vertex count to zero when the polygon is invalid
Stops clipping when the vertex count drops below 3
* fix gradient calculation
* cache texture size minus one + comments
* tweaks
* BGRA copy support
* adding software backend option (cmake)
* update Makefile
* fix face culling
* excluse some exemple with the software backend
* review SW_CLAMP case in sw_texture_map
* review sw_saturate
* review line raster
* fix sw_quad_is_aligned
* review sw_raster_quad_axis_aligned
* tweaks
* codepoint fix (?)
* fix var name...
* rcore_drm software renderering
* cleanup and tweaks
* adding support for `GL_POINT_SIZE` and `GL_LINE_WIDTH` get
* fix sampling issue
* fix swBlendFunc
---------
Co-authored-by: Ray <raysan5@gmail.com>
* gate with OPENGL_11 prototype and definition for rlSetPointSize and rlGetPointSize
* gate with OPENGL_11 prototype and definition for rlSetPointSize and rlGetPointSize
* more coverage for fixing expected texcoords, normals, and colors
* fix guard styling
* fix guard issue, and remove fallback unneccessary else clause (default shader ill work)
* opengl3.3 and es2 need the color array allocated in order to allow for updates later (unlike opengl11)
Currently, scaling doesn't work correctly on macOS (see #5185). This commit
works around this issue by disabling SCALE_FRAMEBUFFER on macOS when
`FLAG_WINDOW_HIGHDPI` is unset.
* fix definition to use SDL3
* [cmake] fix definition to use SDL3
* [build][cmake] prefer USING_VERSION_SDL3 over PLATFORM_DESKTOP_SDL3
* [build][cmake] when libs are added externally, consumer needs to import them too
The following code would crash the previous version when calling MemFree:
// 53 * A
const char maliciousBase64Input[] = "AAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
int decodedSize = 0;
unsigned char *decodedData = DecodeDataBase64(
maliciousBase64Input, &decodedSize);
if (decodedData) {
MemFree(decodedData);
}
The reason is a lack of array bound checks in the decoding loop, which
corrupted here the heap (though this is platform dependent).
Adding the bound checks here prevents the memory corruption.
Tested with encoding random data of sizes 0-1023 and comparing it
with the decoded result.
* add const qualifier to the first arg of TextJoin
* Update raylib_api.* by CI
* Update raylib.h
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Ray <raysan5@gmail.com>
This redesign is a big improvement on font loading time and memory requirements. It only loads glyphs available on font from requested codepoints and only processes those glyphs for packaging. When processing +10K codepoints (CJK), the loading time improves considerably.
Previously stated it was the near plane width in orthographic, in actuality it's the height. The wording has been fixed, with added clarity that it's in world units so no conversion is needed.
* win32 backend
* [rcore][win32] use SwapBuffers instead of wglSwapLayerBuffers
I don't understand OpenGL well enough to know the difference between
SwapBuffers and wglSwapLayerBuffers but the former seems to double
my FPS (from 2000 to about 4000 in core_vr_simulator).
* [rcore][win32] stop lying to the OS about when our window is updated
Instead of calling BeginPaint/EndPaint in WM_PAINT which signals to the
OS that our window content is updated, now when we encounter the WM_PAINT
message instead we return back to the raylib application which will
trigger it to render a new frame. We've replaced the call to BeginPaint
and EndPaint with a call to ValidateRect in SwapBuffers, which, means
we're now correctly telling the OS when our window content is actually
up-to-date.
Note that this doesn't fix the window content not being updated during
a window resize/move beacuse thos have their own message loop which
doesn't return early when it's time to paint.
* [rcore][win32] fallback to finding functions from opengl32.dll
* [rcore][win32] fixes from review/for gcc
* [rcore][win32] incorporate style conventions
* [rcore][win32] workaround unused function error SetupFramebuffer
* [rcore][win32] re-enable sanitize flags check for MSAA_4X
* [rcore][win32] more style changes and remove old DPI cases
Added some more missing spaces after conditional statements. Also
made unsupported MSAA_4X an assert instead of an abort and also
removed dpi-aware cases for older OS's. More changes would be needed
to support those OS versions, namely, removing the dependency
on shcore.
* [rcore][win32] fixes for compling with w64devkit without -DUNICODE
* Update build.zig
* Update build.zig
---------
Co-authored-by: Ray <raysan5@gmail.com>
Added CMake support for SDL3.
Now supports including SDL2 or SDL3 as a subdirectory within the project. The system will first check for SDL3, then SDL2. If neither is found, it will attempt find_package(SDL3), followed by find_package(SDL2). If all these checks fail, the process will terminate with an error.
- make sure that src/external/rl_gputex.h uses it's own macros
for printing warnings and allocating memory
- add few additional macros in order to decouple rl_gputex from headers
that are being included by Raylib (e.g. *_MEMSET, *_NULL and so on)
- make sure that rl_gputex uses RL_*ALLOC, TRACELOG and RLAPI macros
when (and only when) being included by src/rtextures.c
- replace LOG() and RL_GPUTEX_SHOW_LOG_INFO macros with: RL_GPUTEX_WARN
and RL_GPUTEX_SHOW_WARN_INFO (this is a breaking change, but it was
broken and unusable anyway, see:
https://github.com/raysan5/raylib/issues/5039#issuecomment-3065732596 )
- fixes issue all issues mentioned in:
https://github.com/raysan5/raylib/issues/5039#issuecomment-3065732596
- remove logging upon successfully saving a file; Raylib does this
anyway and we want rl_gputex to only print WARNings upon failures;
see: https://discord.com/channels/426912293134270465/541710686468702250/1394406734306480352
- add additional condition when saving a file; now checks for both
fwrite() and fclose() failures; before it would warn about both,
but only return result based on fclose()
- add some notes about the current state of compiling rl_gputex
without depending on Raylib (spoiler: it's still broken...)
- bump rl_gputex version to 1.1 since this is a potential breaking
change (only for people attempting to use it without Raylib)
Fixes: https://github.com/raysan5/raylib/issues/5039
Reference: https://discord.com/channels/426912293134270465/541710686468702250/1394403611852931255
I did this with the intention of fixing
https://github.com/raysan5/raylib/issues/5027
but it's hard to tell if it will help in that case or not.
Anyway, bumping the header with mappings should be done once in a while.
I haven't found any Raylib script for doing this, so here's how I did it
step-by-step with CMake rule provided by GLFW (I'm on Linux, but this
should be similar on any other POSIX system):
```sh
$ git clone https://github.com/raysan5/raylib.git
$ cd raylib/src/external/glfw/
$ cmake -B ./build -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF -DGLFW_BUILD_DOCS=OFF -G "Unix Makefiles"
$ make -C ./build update_mappings
$ rm -fr ./build
```
then I checked, if any mappings were deleted (without updating) with
following shell one-liner:
```sh
# you must be at 'raylib/src/external/glfw/' when executing this
$ for i in $(git diff ./src/mappings.h | sed -n -e 's/^-"\([0-9a-z]*\),.*$/\1/p'); do grep <./src/mappings.h "$i" > /dev/null || echo "$i"; done;
```
which gave me the following IDs:
```txt
0300000066f700000500000000000000
030000000d0f00001600000000007803
03000000efbe0000edfe000000000000
03000000786901006e70000000000000
050000005e040000e002000030110000
03000000790000000600000010010000
030000000d0f00000d00000000010000
030000000d0f0000d800000072056800
03000000c0160000dc27000001010000
030000008916000000fd000024010000
```
I have checked all those IDs with `git log -p` against
https://github.com/mdqinc/SDL_GameControllerDB
and it seems that all of them were deleted by upstream (I was afraid that
maybe some mappings were added manually by a Raylib contributor and then
overwritten by my patch, but they weren't; All good!)
Fixes a regression since 5.5, where `ScanDirectoryFilesRecursively` no
longer does the "recursively" part due to `path` being `static`.
The issue was once already fixed in
5530a3ceb8
but recently made it back it in.
The original implementation created/destroyed framebuffers (FBs) per-frame, leading to kernel overhead and screen tearing. This commit replaces it with a different approach using:
- Asynchronous `drmModePageFlip()` with vblank sync
- Framebuffer caching to reduce repeated FB creation/removal operations
- Proper resource management through BO callbacks and buffer release synchronization
- Added error handling for busy displays, cache overflows, and flip failures
- Event-driven cleanup via page_flip_handler to prevent GPU/scanout conflicts
Co-authored-by: rob-bits
Examining the code shows that the rectangle is drawn winding counterclockwise, starting
with the top left. Therefore the colors used should be in the order: topLeft, bottomLeft,
bottomRight, topRight.
However, the variables actually being used are topLeft, bottomLeft, topRight,
bottomRight. I was confused by this as I was getting striping where I didn't expect any.
Put another way, the last two parameters are misnamed.
This diff swaps the parameter names and their usages. The result is that no runtime
behaviour changes: the same parameter order yields the same visual result both before and
after this change, but the parameter names now correctly reflect what they are actually
used for.
You can actually see this in the implementation of DrawRectangleGradientV, which
(correctly) passes top, bottom, bottom, top to DrawRectangleGradientEx.
I believe it makes sense to only do this when there are no known
touch points. I am not even sure if this should be done at all.
See https://github.com/raysan5/raylib/issues/4872 for more information.
Restore window currently says it sets the window state to:
"not minimized/maximized"
However, if a window is maximized and then minimized, it's typical that
it would restore back to being maximized, which is what seems to happen
from my testing. I've reworded the description to better reflect
this behavior.
raylib app crashing when started and a gamepad is already connected to the PC (even if the gamepad is not used in the app). I only tested this with a gamepad that has a layout which is not recognized. Using SDL3 as backend.
InitWindow() prints CWD during initialization,
but ChangeDirectory() does not, which is quite confusing when you start
messing with CWD. Now said function should log similar message.
Prevents unnecessary work and division by zero (when segments=0) in DrawCircleSector/DrawCircleSectorLines when startAngle equals endAngle, matching existing behavior in DrawRing/DrawRingLines.
This may not be the correct approach, however this appears to work. The idea is that before modifying `CORE.Window.flags` when first creating the window we keep a copy of the flags in order to call `SetWindowState` after initialization has completed, which should behave as if `MaximizeWindow` or `MinimizeWindow`, or conceptually any other flag modifying function were called after `InitWindow`.
This pull request only performs this for the windows platform, modify as needed in the switch statement at the end for others.
Undefine DEBUG to avoid external redefinition
warnings/conflicts. This is probably a common
definition for many external build systems'
debug configurations.
This ensures raylib will not emit
a warning about the DEBUG definition being
redefined in external build systems.
* [rcore] fix crash in InitWindow, due to unchecked result of InitPlatform
Check the result of InitPlatform(), if it isn't 0, report the Error
and return. This prevent crashes and allows for gracefully aborting
or recovering by checking IsWindowReady().
Partially-fixes: https://github.com/raysan5/raylib/issues/4801
* [rcore] style: store the result of InitPlatform() before checking it
Small style change that doesn't impact how the code behaves here.
Variable 'result' is not used anywhere else in this block,
it's just for compliance with Raylib's coding conventions.
Requested in PR: https://github.com/raysan5/raylib/pull/4803#discussion_r1976502788
* [rcore] use LOG_WARNING when InitPlatform() fails
...as this is preferred over LOG_ERROR.
Requested-by: https://github.com/raysan5/raylib/pull/4803#discussion_r1976651724
In the case of a failure within miniaudio on the function: ma_convert_frames, the dynamic memory allocated for the `data` variable will leak on the early return.
Raylib allows for providing custom allocators via macros.
GLFW supports this too, but via function pointers.
Make sure that GLFW uses those Raylib macros, by wrapping them in
function calls and setting them up inside of InitPlatform().
This is possible because of glfwInitAllocator() and GLFWallocator.
Fixes: https://github.com/raysan5/raylib/issues/4776
Relates-to: https://github.com/raysan5/raylib/issues/4751