Compare commits

..
Author SHA1 Message Date
t3hn3rd aac376fa22 progress: ImGui Port - Desktop UI + ImGui rendering performance overhaul
Full ImGui desktop environment (desktop.pas):
- Gradient wallpaper, taskbar with clock, start menu
- Desktop icons with click-to-open
- Windowed apps: System Info, Terminal, File Browser, Task Manager
- Terminal dispatches to registered kernel commands with output capture

Performance: Software rasterizer rewrite (imgui.pas, imgbridge.c)
- Quad detection: merge consecutive triangle pairs into fast rect fills
- 3 new fast-path rect fillers (solid/gradient/textured) using REP STOSD
  and 16.16 fixed-point integer inner loops
- Triangle rasterizer rewritten with fixed-point edge functions
- Back-buffer clear: DrawPixel loop -> REP STOSD (~200x faster)
- Render stat debug counters added

ISR-safe input buffering (imgbridge.c)
- Keyboard/mouse events buffered in lock-free ring buffers from ISR context
- Drained once per frame from main loop to prevent data races

Other changes:
- imguitypes.pas: InputTextFlags renumbered for cimgui 1.91+
- video.pas: backBufferLocation getter added
- kernel.pas: VFS init moved earlier, main loop uses desktop_frame,
  mouse hook uses ISR-safe buffering
- lmemorymanager.pas: kalloc/kfree exported with public aliases for C linkage
- scheduler.pas: Root_Task moved to interface for desktop task manager
- terminal.pas: freeParams exposed in interface
2026-02-25 23:28:12 +00:00
t3hn3rd 51a29244ed Imgui initial changes & shim (Claude Opus 4.6)
Can now draw ImGui demo.
2026-02-22 21:06:59 +00:00
41 changed files with 5564 additions and 41290 deletions

No files matched your search

-14
View File
@@ -50,17 +50,3 @@ steps:
- | - |
curl -X PUT https://gitea.spexeah.com/api/packages/Spexeah/generic/asuro-iso/latest/Asuro.iso \ curl -X PUT https://gitea.spexeah.com/api/packages/Spexeah/generic/asuro-iso/latest/Asuro.iso \
-H "Authorization: token $GITEA_TOKEN" --upload-file "Asuro-$(git rev-parse --short HEAD).iso" -H "Authorization: token $GITEA_TOKEN" --upload-file "Asuro-$(git rev-parse --short HEAD).iso"
- name: msg status
image: appleboy/drone-discord
failure: ignore
depends_on:
- compile
when:
status: [success, failure, changed]
settings:
webhook_id:
from_secret: discord_webhook_id
webhook_token:
from_secret: discord_webhook_secret
message: "**Asuro Build**\n\n{{#success build.status}}✅ Build successful!\n\n{{else}}❌ Build failed!\n\n{{/success}}Repository: `{{repo.namespace}}/{{repo.name}}`\nBranch: `{{commit.branch}}`\nCommit: `{{commit.sha}}`\nAuthor: `{{commit.author}} <{{commit.email}}>`\n\nGitea Diff: [Link](<{{commit.link}}>)\nDrone Build: [Link](<{{build.link}}>)\n\nMessage: {{commit.message}}"
-4
View File
@@ -11,7 +11,3 @@
/*.img /*.img
src/include/asuro.pas src/include/asuro.pas
localenv.json localenv.json
/lvgl/
dockerout.txt
AGENTS.md
*.log
-13
View File
@@ -1,13 +0,0 @@
# Map all Aaron identities to a single preferred identity
Aaron Hance <[email protected]> aaron <aaron@6dbc8c32-bb84-406f-8558-d1cf31a0ab0c>
Aaron Hance <[email protected]> aaronhance <[email protected]>
Aaron Hance <[email protected]> aaron hance <[email protected]>
Aaron Hance <[email protected]> Aaron <[email protected]>
# Map all Kieron identities to a single preferred identity
Kieron Morris <[email protected]> kieron <kieron@6dbc8c32-bb84-406f-8558-d1cf31a0ab0c>
Kieron Morris <[email protected]> Kieron <[email protected]>
Kieron Morris <[email protected]> t3hn3rd <[email protected]>
# Map goose's multiple identities
goose <goose@6dbc8c32-bb84-406f-8558-d1cf31a0ab0c> goose <[email protected]>
+5 -2
View File
@@ -5,11 +5,14 @@ VOLUME ["/code"]
ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_FRONTEND=noninteractive
RUN dpkg --add-architecture i386 RUN dpkg --add-architecture i386
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
curl dos2unix wget git make nasm binutils xorriso grub-pc-bin gcc gcc-multilib && \ curl dos2unix wget git make nasm binutils xorriso grub-pc-bin \
gcc-multilib g++-multilib && \
apt-get clean my room apt-get clean my room
RUN git clone --depth=1 --recurse-submodules https://github.com/cimgui/cimgui.git /cimgui
SHELL ["/bin/bash", "-c"] SHELL ["/bin/bash", "-c"]
ARG FPC_VERSION=3.2.2 ARG FPC_VERSION=2.6.4
RUN curl -sL https://sourceforge.net/projects/freepascal/files/Linux/$FPC_VERSION/fpc-$FPC_VERSION.i386-linux.tar/download | tar -xf - && \ RUN curl -sL https://sourceforge.net/projects/freepascal/files/Linux/$FPC_VERSION/fpc-$FPC_VERSION.i386-linux.tar/download | tar -xf - && \
pushd fpc-$FPC_VERSION.i386-linux && ./install.sh && popd && \ pushd fpc-$FPC_VERSION.i386-linux && ./install.sh && popd && \
rm -rf fpc-$FPC_VERSION.i386-linux rm -rf fpc-$FPC_VERSION.i386-linux
+2 -2
View File
@@ -7,7 +7,7 @@ echo "Asuro Compilation"
echo " " echo " "
#Compile Stub.asm #Compile Stub.asm
rm -f lib/* rm lib/*
runOrFail() { runOrFail() {
local binary=$1 local binary=$1
@@ -23,7 +23,7 @@ runOrFail() {
declare -a run_steps=( declare -a run_steps=(
"compile_stub.sh" "Failed to compile stub!" "compile_stub.sh" "Failed to compile stub!"
"compile_vergen.sh" "Versions failed to compile" "compile_vergen.sh" "Versions failed to compile"
"compile_lvgl.sh" "Failed to compile LVGL!" "compile_imgui.sh" "Failed to compile ImGui!"
"compile_sources.sh" "Failed to compile FPC Sources!" "compile_sources.sh" "Failed to compile FPC Sources!"
"compile_link.sh" "Failed linking!" "compile_link.sh" "Failed linking!"
"compile_isogen.sh" "Failed to create ISO!" "compile_isogen.sh" "Failed to create ISO!"
+90
View File
@@ -0,0 +1,90 @@
#!/usr/bin/env bash
echo " "
echo "======================="
echo " "
echo "Compiling ImGui (cimgui)..."
echo " "
IMGUI_DIR=/cimgui
IMGUI_SRC=$IMGUI_DIR/imgui
BRIDGE_SRC=src/driver/video/imgui
# Flags shared by all C/C++ compilation units:
# -m32 -> i386 target
# -ffreestanding -> no implicit stdlib inclusion
# -fno-builtin -> don't inline memcpy/memset/etc. so our stubs are used
# -O2 -> optimise for speed
# -ffunction-sections -fdata-sections -> allow --gc-sections in linker
C_FLAGS="-m32 -ffreestanding -fno-builtin -O2 -ffunction-sections -fdata-sections"
# Extra flags for C++ translation units (cimgui/imgui sources):
# -fno-exceptions -> no stack-unwinding machinery
# -fno-rtti -> no typeinfo / dynamic_cast
# -fno-use-cxa-atexit -> don't emit __cxa_atexit calls for static dtors
# -fno-threadsafe-statics -> no guard-variable emission for local statics
# NOTE: *not* -ffreestanding / -fno-builtin here — imgui includes <cmath> and
# other hosted headers that refuse to compile in freestanding mode.
# The object files are archived into a static lib and linked freestanding;
# any hosted-stdlib calls (malloc/free/sin/cos/…) resolve to crtshim.c.
CPP_FLAGS="-m32 -O2 -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics -fno-stack-protector -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -DNDEBUG -DIMGUI_ENABLE_STB_TRUETYPE"
INCLUDE="-I$IMGUI_DIR -I$IMGUI_SRC"
echo "Compiling C runtime shim..."
gcc $C_FLAGS $INCLUDE \
-c $BRIDGE_SRC/crtshim.c \
-o lib/imgui_crtshim.o || { echo "Failed: crtshim.c"; exit 1; }
echo "Compiling render bridge..."
# imgbridge is compiled as C++ so it sees cimgui.h function declarations
# (C++ mode is required; the .c extension is overridden with -x c++)
g++ $CPP_FLAGS $INCLUDE \
-x c++ \
-DCIMGUI_DEFINE_ENUMS_AND_STRUCTS \
-c $BRIDGE_SRC/imgbridge.c \
-o lib/imgui_bridge.o || { echo "Failed: imgbridge.c"; exit 1; }
echo "Compiling cimgui wrapper..."
g++ $CPP_FLAGS $INCLUDE \
-c $IMGUI_DIR/cimgui.cpp \
-o lib/imgui_cimgui.o || { echo "Failed: cimgui.cpp"; exit 1; }
echo "Compiling imgui core..."
g++ $CPP_FLAGS $INCLUDE \
-c $IMGUI_SRC/imgui.cpp \
-o lib/imgui_core.o || { echo "Failed: imgui.cpp"; exit 1; }
echo "Compiling imgui draw..."
g++ $CPP_FLAGS $INCLUDE \
-c $IMGUI_SRC/imgui_draw.cpp \
-o lib/imgui_draw.o || { echo "Failed: imgui_draw.cpp"; exit 1; }
echo "Compiling imgui tables..."
g++ $CPP_FLAGS $INCLUDE \
-c $IMGUI_SRC/imgui_tables.cpp \
-o lib/imgui_tables.o || { echo "Failed: imgui_tables.cpp"; exit 1; }
echo "Compiling imgui widgets..."
g++ $CPP_FLAGS $INCLUDE \
-c $IMGUI_SRC/imgui_widgets.cpp \
-o lib/imgui_widgets.o || { echo "Failed: imgui_widgets.cpp"; exit 1; }
echo "Compiling imgui demo..."
g++ $CPP_FLAGS $INCLUDE \
-c $IMGUI_SRC/imgui_demo.cpp \
-o lib/imgui_demo.o || { echo "Failed: imgui_demo.cpp"; exit 1; }
echo "Archiving cimgui.a..."
# NOTE: imgui_bridge.o and imgui_crtshim.o are NOT in the archive because
# compile_link.sh already picks them up individually via find lib/ -name "*.o".
# Including them here would cause duplicate symbol errors.
ar rcs lib/cimgui.a \
lib/imgui_cimgui.o \
lib/imgui_core.o \
lib/imgui_draw.o \
lib/imgui_tables.o \
lib/imgui_widgets.o \
lib/imgui_demo.o || { echo "Failed: ar"; exit 1; }
echo "ImGui compiled successfully."
exit 0
+2 -5
View File
@@ -14,9 +14,6 @@ done;
objstring=lib/stub.o" "$objstring objstring=lib/stub.o" "$objstring
echo "Object Files: "$objstring echo "Object Files: "$objstring
echo " " echo " "
# Find libgcc for i386 (needed by LVGL compiled with gcc)
LIBGCC=$(gcc -m32 -print-libgcc-file-name) LIBGCC=$(gcc -m32 -print-libgcc-file-name)
echo "libgcc: ${LIBGCC}" ld -m elf_i386 -s --gc-sections -Tlinker.script -o bin/kernel.bin $objstring \
--start-group lib/cimgui.a $LIBGCC --end-group
ld -m elf_i386 -s --gc-sections -Tlinker.script -o bin/kernel.bin $objstring --start-group lib/liblvgl.a ${LIBGCC} --end-group
-117
View File
@@ -1,117 +0,0 @@
#!/usr/bin/env bash
# compile_lvgl.sh — Download LVGL v9.2 source and compile into lib/liblvgl.a
# Clone & compile in /tmp (fast container-local fs).
# Copy source + objects to /lvgl (host mount) for debugging.
set -e
LVGL_VERSION="v9.2.2"
LVGL_REPO="https://github.com/lvgl/lvgl.git"
LVGL_DIR="/tmp/lvgl"
OBJ_DIR="/tmp/lvgl_obj"
CONF_DIR="$(pwd)/lvglh"
OUT_DIR="$(pwd)/lib"
CC="gcc"
CFLAGS="-m32 -march=i686 -ffreestanding \
-fno-builtin -fno-stack-protector -fno-pic -fno-pie \
-O2 -Wall -Wno-unused-function -Wno-unused-variable \
-I${CONF_DIR} \
-I${LVGL_DIR} \
-I${LVGL_DIR}/.. \
-DLV_CONF_INCLUDE_SIMPLE"
echo " "
echo "======================="
echo " "
echo "Compiling LVGL..."
echo " "
# Clone LVGL into /tmp (container-local)
rm -rf "$LVGL_DIR"
echo "Downloading LVGL ${LVGL_VERSION}..."
git clone --depth 1 --branch "${LVGL_VERSION}" "${LVGL_REPO}" "${LVGL_DIR}" 2>&1
echo "Download complete."
# Gather all LVGL .c source files (core library only, no demos/examples)
SOURCES=$(find "${LVGL_DIR}/src" -name '*.c' -not -path '*/test/*')
TOTAL=$(echo "$SOURCES" | wc -l)
echo "Found ${TOTAL} LVGL source files."
# Compile each .c file to .o (container-local)
rm -rf "$OBJ_DIR"
mkdir -p "$OBJ_DIR"
COUNT=0
ERRORS=0
for src in $SOURCES; do
COUNT=$((COUNT + 1))
rel="${src#${LVGL_DIR}/src/}"
obj_path="${OBJ_DIR}/${rel%.c}.o"
mkdir -p "$(dirname "$obj_path")"
if ! $CC $CFLAGS -c "$src" -o "$obj_path" 2>&1; then
echo "FAILED: $rel"
ERRORS=$((ERRORS + 1))
fi
if [ $((COUNT % 50)) -eq 0 ]; then
echo " Compiled ${COUNT}/${TOTAL}..."
fi
done
echo "Compiled ${COUNT} files (${ERRORS} errors)."
if [ "$ERRORS" -ne 0 ]; then
echo "LVGL compilation FAILED with ${ERRORS} errors."
exit 1
fi
# Archive into static library
OBJECTS=$(find "$OBJ_DIR" -name '*.o')
ar rcs "${OUT_DIR}/liblvgl.a" $OBJECTS
echo "Created ${OUT_DIR}/liblvgl.a"
# Compile custom LVGL extension files from lvglh/
LVGLH_SOURCES=$(find "${CONF_DIR}" -name '*.c' 2>/dev/null || true)
if [ -n "$LVGLH_SOURCES" ]; then
echo " "
echo "Compiling custom LVGL files from lvglh/..."
LVGLH_OBJ_DIR="/tmp/lvglh_obj"
rm -rf "$LVGLH_OBJ_DIR"
mkdir -p "$LVGLH_OBJ_DIR"
HCOUNT=0
HERRORS=0
for src in $LVGLH_SOURCES; do
HCOUNT=$((HCOUNT + 1))
rel="${src#${CONF_DIR}/}"
obj_path="${LVGLH_OBJ_DIR}/${rel%.c}.o"
mkdir -p "$(dirname "$obj_path")"
echo " [lvglh] $rel"
if ! $CC $CFLAGS -c "$src" -o "$obj_path" 2>&1; then
echo " FAILED: $rel"
HERRORS=$((HERRORS + 1))
fi
done
echo "Compiled ${HCOUNT} custom files (${HERRORS} errors)."
if [ "$HERRORS" -ne 0 ]; then
echo "Custom LVGL compilation FAILED."
exit 1
fi
# Append custom objects into the existing archive
HOBJECTS=$(find "$LVGLH_OBJ_DIR" -name '*.o')
ar rcs "${OUT_DIR}/liblvgl.a" $HOBJECTS
echo "Updated ${OUT_DIR}/liblvgl.a with custom objects."
else
echo "No custom LVGL files in lvglh/."
fi
# Copy source + objects to /lvgl host mount for debugging
echo "Copying LVGL source and objects to host mount..."
rm -rf /lvgl/* /lvgl/.[!.]* /lvgl/..?* 2>/dev/null || true
cp -a "$LVGL_DIR/src" /lvgl/src
cp -a "$OBJ_DIR" /lvgl/obj
echo "Done."
echo " "
echo "LVGL compilation complete."
echo " "
+1 -1
View File
@@ -4,4 +4,4 @@ echo "======================="
echo " " echo " "
echo "Compiling FPC Sources..." echo "Compiling FPC Sources..."
echo " " echo " "
fpc -Aelf -gw -g -gl -n -v0ew -O3 -OpPENTIUM3 -Si -Sc -Sg -Xd -CX -XXs -CfSSE -CfSSE2 -Rintel -Pi386 -Tlinux -FElib/ -Fusrc/* -Fusrc/driver/* -Fusrc/driver/net/* src/kernel.pas fpc -Aelf -gw -g -gl -n -vlewn -O3 -Op3 -Si -Sc -Sg -Xd -CX -XXs -CfSSE -CfSSE2 -Rintel -Pi386 -Tlinux -FElib/ -Fusrc/* -Fusrc/driver/* -Fusrc/driver/net/* -Fusrc/driver/video/* -Fusrc/driver/video/imgui/* src/kernel.pas
-1
View File
@@ -3,4 +3,3 @@ services:
build: . build: .
volumes: volumes:
- .:/code - .:/code
- ./lvgl:/lvgl
+20
View File
@@ -0,0 +1,20 @@
4023:CIMGUI_API float igGetWindowDpiScale(void);
4081:CIMGUI_API const ImVec4_c* igGetStyleColorVec4(ImGuiCol idx);
4082:CIMGUI_API ImVec2_c igGetCursorScreenPos(void);
4084:CIMGUI_API ImVec2_c igGetContentRegionAvail(void);
4085:CIMGUI_API ImVec2_c igGetCursorPos(void);
4086:CIMGUI_API float igGetCursorPosX(void);
4087:CIMGUI_API float igGetCursorPosY(void);
4091:CIMGUI_API ImVec2_c igGetCursorStartPos(void);
4350:CIMGUI_API void igBeginDisabled(bool disabled);
4372:CIMGUI_API ImVec2_c igGetItemRectMin(void);
4373:CIMGUI_API ImVec2_c igGetItemRectMax(void);
4374:CIMGUI_API ImVec2_c igGetItemRectSize(void);
4377:CIMGUI_API ImDrawList* igGetBackgroundDrawList(ImGuiViewport* viewport);
4378:CIMGUI_API ImDrawList* igGetForegroundDrawList_ViewportPtr(ImGuiViewport* viewport);
4387:CIMGUI_API ImVec2_c igCalcTextSize(const char* text,const char* text_end,bool hide_text_after_double_hash,float wrap_width);
4388:CIMGUI_API ImVec4_c igColorConvertU32ToFloat4(ImU32 in);
4405:CIMGUI_API bool igIsMouseDoubleClicked_Nil(ImGuiMouseButton button);
5092:CIMGUI_API ImDrawList* igGetForegroundDrawList_WindowPtr(ImGuiWindow* window);
5161:CIMGUI_API void igBeginDisabledOverrideReenable(void);
5244:CIMGUI_API bool igIsMouseDoubleClicked_ID(ImGuiMouseButton button,ImGuiID owner_id);
-374
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+45
View File
@@ -838,6 +838,18 @@ const
MAX_WINDOWS = 255; //< Maximum number of Windows open. MAX_WINDOWS = 255; //< Maximum number of Windows open.
DefaultWND = 0; //< The Window assigned for output when no Window is specified. (Default). DefaultWND = 0; //< The Window assigned for output when no Window is specified. (Default).
type
TWNDCaptureCallback = procedure(s: pchar);
var
WND_CaptureActive : boolean = false;
WND_CaptureHWND : uint32 = 0;
WND_CaptureBuf : array[0..511] of char;
WND_CaptureBufIdx : uint32 = 0;
WND_CaptureCallback : TWNDCaptureCallback = nil;
procedure flushCapture;
implementation implementation
uses uses
@@ -2259,6 +2271,7 @@ var
x,y: Byte; x,y: Byte;
begin begin
if WND_CaptureActive and (WND = WND_CaptureHWND) then exit;
if WindowManager.Windows[WND] <> nil then begin if WindowManager.Windows[WND] <> nil then begin
for y:=0 to Console_Properties.MAX_CELL_Y do begin for y:=0 to Console_Properties.MAX_CELL_Y do begin
for x:=0 to Console_Properties.MAX_CELL_X do begin for x:=0 to Console_Properties.MAX_CELL_X do begin
@@ -2419,8 +2432,26 @@ begin
console.writeintlnexWND(i, Console_Properties.Default_Attribute, WND); console.writeintlnexWND(i, Console_Properties.Default_Attribute, WND);
end; end;
procedure flushCapture;
begin
if WND_CaptureActive and (WND_CaptureCallback <> nil) and (WND_CaptureBufIdx > 0) then begin
WND_CaptureBuf[WND_CaptureBufIdx] := #0;
WND_CaptureCallback(@WND_CaptureBuf[0]);
WND_CaptureBufIdx := 0;
WND_CaptureBuf[0] := #0;
end;
end;
procedure writecharexWND(character: char; attributes: uint32; WND : uint32); procedure writecharexWND(character: char; attributes: uint32; WND : uint32);
begin begin
if WND_CaptureActive and (WND = WND_CaptureHWND) and (WND_CaptureCallback <> nil) then begin
if WND_CaptureBufIdx < 511 then begin
WND_CaptureBuf[WND_CaptureBufIdx] := character;
inc(WND_CaptureBufIdx);
WND_CaptureBuf[WND_CaptureBufIdx] := #0;
end;
exit;
end;
if WindowManager.Windows[WND] <> nil then begin if WindowManager.Windows[WND] <> nil then begin
WindowManager.Windows[WND]^.Buffer[WindowManager.Windows[WND]^.Cursor.Y][WindowManager.Windows[WND]^.Cursor.X].Character:= character; WindowManager.Windows[WND]^.Buffer[WindowManager.Windows[WND]^.Cursor.Y][WindowManager.Windows[WND]^.Cursor.X].Character:= character;
WindowManager.Windows[WND]^.Buffer[WindowManager.Windows[WND]^.Cursor.Y][WindowManager.Windows[WND]^.Cursor.X].Attributes:= attributes; WindowManager.Windows[WND]^.Buffer[WindowManager.Windows[WND]^.Cursor.Y][WindowManager.Windows[WND]^.Cursor.X].Attributes:= attributes;
@@ -2603,6 +2634,13 @@ end;
procedure backspaceWND(WND : uint32); procedure backspaceWND(WND : uint32);
begin begin
if WND_CaptureActive and (WND = WND_CaptureHWND) then begin
if WND_CaptureBufIdx > 0 then begin
dec(WND_CaptureBufIdx);
WND_CaptureBuf[WND_CaptureBufIdx] := #0;
end;
exit;
end;
if WindowManager.Windows[WND] <> nil then begin if WindowManager.Windows[WND] <> nil then begin
Dec(WindowManager.Windows[WND]^.Cursor.X); Dec(WindowManager.Windows[WND]^.Cursor.X);
writecharWND(' ', WND); writecharWND(' ', WND);
@@ -2659,6 +2697,13 @@ end;
procedure _safeincrement_y_WND(WND : uint32); procedure _safeincrement_y_WND(WND : uint32);
begin begin
if WND_CaptureActive and (WND = WND_CaptureHWND) and (WND_CaptureCallback <> nil) then begin
WND_CaptureBuf[WND_CaptureBufIdx] := #0;
WND_CaptureCallback(@WND_CaptureBuf[0]);
WND_CaptureBufIdx := 0;
WND_CaptureBuf[0] := #0;
exit;
end;
if WindowManager.Windows[WND] <> nil then begin if WindowManager.Windows[WND] <> nil then begin
WindowManager.Windows[WND]^.Cursor.Y:= WindowManager.Windows[WND]^.Cursor.Y+1; WindowManager.Windows[WND]^.Cursor.Y:= WindowManager.Windows[WND]^.Cursor.Y+1;
if WindowManager.Windows[WND]^.Cursor.Y > WindowManager.Windows[WND]^.WND_H-1 then begin if WindowManager.Windows[WND]^.Cursor.Y > WindowManager.Windows[WND]^.WND_H-1 then begin
File diff suppressed because it is too large. Load diff
+1 -4
View File
@@ -58,19 +58,16 @@ begin
end; end;
function sinb(port : uint16) : uint8; function sinb(port : uint16) : uint8;
var
tmp : uint8;
begin begin
asm asm
PUSH EAX PUSH EAX
PUSH EDX PUSH EDX
MOV DX, port MOV DX, port
IN AL, DX IN AL, DX
MOV tmp, AL MOV sinb, AL
POP EDX POP EDX
POP EAX POP EAX
end; end;
sinb := tmp;
io_wait; io_wait;
end; end;
+6 -14
View File
@@ -491,26 +491,22 @@ begin
{ Create a new header to the use in our DHCP REQUEST packet } { Create a new header to the use in our DHCP REQUEST packet }
SendHeader:= createHeader(); SendHeader:= createHeader();
CopyIPv4(@getIPv4Config^.Address[0], puint8(@SendHeader^.Client_IP[0])); CopyIPv4(puint8(@Header^.Your_IP[0]), puint8(@SendHeader^.Client_IP[0]));
CopyIPv4(puint8(@Header^.Server_IP[0]), puint8(@SendHeader^.Server_IP[0])); CopyIPv4(puint8(@Header^.Server_IP[0]), puint8(@SendHeader^.Server_IP[0]));
processHeader(SendHeader); processHeader(SendHeader);
{ Setup Options } { Setup Options }
SendOptions:= newOptions(); SendOptions:= newOptions();
{ Create a message type option and assign it the value REQUEST } { Create a message type option and assign it the value REQUEST }
SendMsgType:= ord(TDHCPMessageType.REQUEST); SendMsgType:= ord(TDHCPMessageType.REQUEST);
NewOption(SendOptions, TDHCPOpCode.DHCP_MESSAGE_TYPE, void(@SendMsgType), 1, false); NewOption(SendOptions, TDHCPOpCode.DHCP_MESSAGE_TYPE, void(@SendMsgType), 1, false);
{ Create a Requested IP option and assign it the value from the OFFER packet header } { Create a Requested IP option and assign it the value from the OFFER packet header }
NewOption(SendOptions, TDHCPOpCode.REQUESTED_IP_ADDRESS, void(@Header^.Your_IP[0]), 4, false); NewOption(SendOptions, TDHCPOpCode.REQUESTED_IP_ADDRESS, void(@SendHeader^.Client_IP[0]), 4, false);
{ Create a Server Identifier Option and assign it the value from the OFFER packet options } { Create a Server Identifier Option and assign it the value from the OFFER packet options }
Option:= getOptionByOpcode(Options, TDHCPOpCode.SERVER_IDENTIFIER); Option:= getOptionByOpcode(Options, TDHCPOpCode.SERVER_IDENTIFIER);
if Option <> nil then begin if Option <> nil then begin
NewOption(SendOptions, TDHCPOpCode.SERVER_IDENTIFIER, void(@Option^.Value[0]), 4, false); NewOption(SendOptions, TDHCPOpCode.SERVER_IDENTIFIER, void(@Option^.Value[0]), 4, false);
end; end;
{ Create a Parameter Request List, Request the following: Netmask, Gateway, DNS Name & DNS Server } { Create a Parameter Request List, Request the following: Netmask, Gateway, DNS Name & DNS Server }
RequestParams[0]:= Ord(TDHCPOpCode.SUBNET_MASK); RequestParams[0]:= Ord(TDHCPOpCode.SUBNET_MASK);
RequestParams[1]:= Ord(TDHCPOpCode.ROUTER); RequestParams[1]:= Ord(TDHCPOpCode.ROUTER);
@@ -526,13 +522,9 @@ begin
MAC:= getMAC(); MAC:= getMAC();
packetCtx:= PPacketContext(Kalloc(sizeof(TPacketContext))); packetCtx:= PPacketContext(Kalloc(sizeof(TPacketContext)));
packetCtx^.TTL:= 128; packetCtx^.TTL:= 128;
{ Copy over MAC - src: broadcast - dst: DHCP Server }
copyMAC(MAC, @packetCtx^.MAC.Source[0]);
copyMAC(@BROADCAST_MAC[0], @packetCtx^.MAC.Destination[0]); copyMAC(@BROADCAST_MAC[0], @packetCtx^.MAC.Destination[0]);
copyMAC(MAC, @packetCtx^.MAC.Source[0]);
{ Copy over IP - src: NULL - dst: Broadcast } copyIPv4(@NULL_IP[0], @packetCtx^.IP.Source[0]);
CopyIPv4(@getIPv4Config^.Address[0], @packetCtx^.IP.Source[0]);
copyIPv4(@BROADCAST_IP[0], @packetCtx^.IP.Destination[0]); copyIPv4(@BROADCAST_IP[0], @packetCtx^.IP.Destination[0]);
{ Setup UDPContext (UDP) & copy in the correct details } { Setup UDPContext (UDP) & copy in the correct details }
@@ -578,7 +570,7 @@ begin
{ Check the frame is for us and then process } { Check the frame is for us and then process }
MAC:= getMAC; MAC:= getMAC;
if MACEqual(@context^.PacketContext^.MAC.Destination[0], MAC) or MACEqual(@context^.PacketContext^.MAC.Destination[0], BROADCAST_MAC) then begin if MACEqual(@context^.PacketContext^.MAC.Destination[0], MAC) then begin
Outputln('DHCP','Frame is addressed to us.'); Outputln('DHCP','Frame is addressed to us.');
{ Check the message type is client specific } { Check the message type is client specific }
If Header^.Message_Type = $02 then begin If Header^.Message_Type = $02 then begin
@@ -663,7 +655,7 @@ begin
copyMAC(@BROADCAST_MAC[0], @packetCtx^.MAC.Destination[0]); copyMAC(@BROADCAST_MAC[0], @packetCtx^.MAC.Destination[0]);
MAC:= getMAC; MAC:= getMAC;
copyMAC(MAC, @packetCtx^.MAC.Source[0]); copyMAC(MAC, @packetCtx^.MAC.Source[0]);
CopyIPv4(@getIPv4Config^.Address[0], @packetCtx^.IP.Source[0]); copyIPv4(@NULL_IP[0], @packetCtx^.IP.Source[0]);
copyIPv4(@BROADCAST_IP[0], @packetCtx^.IP.Destination[0]); copyIPv4(@BROADCAST_IP[0], @packetCtx^.IP.Destination[0]);
{ Setup UDPContext (UDP) } { Setup UDPContext (UDP) }
+15 -1
View File
@@ -92,6 +92,7 @@ var
Root : PVFSObject; Root : PVFSObject;
CurrentDirectory : pchar = nil; CurrentDirectory : pchar = nil;
PushPopDirectory : PLinkedListBase; PushPopDirectory : PLinkedListBase;
MountDepth : uint32 = 0;
procedure init(); procedure init();
Function OpenFile(Filename : pchar; OpenMode : TOpenMode; WriteMode : TWriteMode; Lock : Boolean; Error : PError) : TFileHandle; Function OpenFile(Filename : pchar; OpenMode : TOpenMode; WriteMode : TWriteMode; Lock : Boolean; Error : PError) : TFileHandle;
@@ -104,6 +105,7 @@ function GetDirectories(Handle : uint32; Path : pchar) : PHashMap;
function PathValid(Path : pchar) : TIsPathValid; function PathValid(Path : pchar) : TIsPathValid;
function changeDirectory(Path : pchar) : TIsPathValid; function changeDirectory(Path : pchar) : TIsPathValid;
function getWorkingDirectory : pchar; function getWorkingDirectory : pchar;
function GetDirectoryListing(Path : pchar) : PHashMap;
//VFS Functions //VFS Functions
function newVirtualDirectory(Path : pchar) : TError; function newVirtualDirectory(Path : pchar) : TError;
@@ -288,6 +290,7 @@ begin
NewObj:= PVFSObject(hashmap.get(ht, item)); NewObj:= PVFSObject(hashmap.get(ht, item));
if NewObj = nil then begin if NewObj = nil then begin
GetObjectFromPath:= nil; GetObjectFromPath:= nil;
STRLL_Free(SplitPath);
tracer.push_trace('vfs.GetObjectFromPath.shortexit_1'); tracer.push_trace('vfs.GetObjectFromPath.shortexit_1');
exit; exit;
end; end;
@@ -304,6 +307,7 @@ begin
end; end;
end; end;
GetObjectFromPath:= Obj; GetObjectFromPath:= Obj;
STRLL_Free(SplitPath);
tracer.push_trace('vfs.GetObjectFromPath.exit'); tracer.push_trace('vfs.GetObjectFromPath.exit');
end; end;
@@ -348,7 +352,17 @@ begin
GetDirectoryListing:= nil; GetDirectoryListing:= nil;
end; end;
otMOUNT:begin otMOUNT:begin
{ Safety: cap mount-follow depth to prevent infinite recursion
from circular mounts. Use a simple static counter. }
if MountDepth < 16 then begin
Inc(MountDepth);
GetDirectoryListing:= GetDirectoryListing(PVFSMount(Obj^.Reference)^.Path); GetDirectoryListing:= GetDirectoryListing(PVFSMount(Obj^.Reference)^.Path);
Dec(MountDepth);
end else
GetDirectoryListing:= nil;
end;
else begin
GetDirectoryListing:= nil;
end; end;
end; end;
end else begin end else begin
@@ -420,7 +434,7 @@ begin
NewObj^.Reference:= void(NewDev); NewObj^.Reference:= void(NewDev);
hashmap.add(ht, stringCopy(DeviceName), void(NewDev)); hashmap.add(ht, stringCopy(DeviceName), void(NewObj));
end; end;
{ Filesystem Functions } { Filesystem Functions }
File diff suppressed because it is too large. Load diff
+27 -11
View File
@@ -54,13 +54,8 @@ end;
procedure Flush(FrontBuffer : PVideoBuffer; BackBuffer : PVideoBuffer); procedure Flush(FrontBuffer : PVideoBuffer; BackBuffer : PVideoBuffer);
var var
idx : uint32;
Back,Front : uint32; Back,Front : uint32;
BufferSize : uint32; Count64 : uint32;
const
//COPY_WIDTH = 64; //Use this for 64bit copies
COPY_WIDTH = 128; //Use this for SSE copies
begin begin
//tracer.push_trace('doublebuffer.Flush.enter'); //tracer.push_trace('doublebuffer.Flush.enter');
@@ -68,11 +63,32 @@ begin
if ((FrontBuffer^.Width > BackBuffer^.Width) or (FrontBuffer^.Height > BackBuffer^.Height)) then exit; if ((FrontBuffer^.Width > BackBuffer^.Width) or (FrontBuffer^.Height > BackBuffer^.Height)) then exit;
Back:= BackBuffer^.Location; Back:= BackBuffer^.Location;
Front:= FrontBuffer^.Location; Front:= FrontBuffer^.Location;
BufferSize:= ( ( BackBuffer^.Width * BackBuffer^.Height * BackBuffer^.BitsPerPixel) div COPY_WIDTH ) - 1; { Number of 64-byte blocks: total_bytes / 64 = (W * H * BPP/8) / 64 }
for idx:=0 to BufferSize do begin Count64:= ( BackBuffer^.Width * BackBuffer^.Height * BackBuffer^.BitsPerPixel) div 512;
//Front[idx]:= Back[idx]; if Count64 = 0 then exit;
// -- TODO: Get SSE working here for 128bit copies -- { Bulk SSE copy: 4 x MOVAPS (64 bytes) per iteration.
__SSE_128_memcpy(Back + (idx * 16), Front + (idx * 16)); 4x fewer loop iterations than the old per-16-byte function-call loop. }
asm
PUSH ESI
PUSH EDI
MOV ESI, Back
MOV EDI, Front
MOV ECX, Count64
@sseloop:
MOVAPS XMM0, [ESI]
MOVAPS XMM1, [ESI + 16]
MOVAPS XMM2, [ESI + 32]
MOVAPS XMM3, [ESI + 48]
MOVAPS [EDI], XMM0
MOVAPS [EDI + 16], XMM1
MOVAPS [EDI + 32], XMM2
MOVAPS [EDI + 48], XMM3
ADD ESI, 64
ADD EDI, 64
DEC ECX
JNZ @sseloop
POP EDI
POP ESI
end; end;
//tracer.push_trace('doublebuffer.Flush.exit'); //tracer.push_trace('doublebuffer.Flush.exit');
end; end;
Loaded 20 of 41 files, more files were not shown because too many files have changed in this diff. Show more