Enable native desktop applications and synchronized resolution changes

This commit is contained in:
Aaron committed 2026-11-08 09:02:34 +00:00
1 parent b71e6d67b4
commit e462165049
28 files changed
+459 -428

No files matched your search

+1 -1
View File
@@ -22,7 +22,7 @@ unit app.base64;
interface interface
uses uses
io.stdio, core.util, arch.x86.util, core.strings, debug.tracer, core.enc.base64, memory.heap; io.stdio, core.util, arch.platform.cpu, core.strings, debug.tracer, core.enc.base64, memory.heap;
procedure init(); procedure init();
+2 -2
View File
@@ -25,7 +25,7 @@ uses
core.strings, core.strings,
io.stdio, io.stdio,
debug.tracer, debug.tracer,
core.util, arch.x86.util, core.util, arch.platform.cpu,
driver.storage.vol.mgr; driver.storage.vol.mgr;
var var
@@ -254,7 +254,7 @@ begin
{ Allocate a zero buffer - 64 sectors at a time } { Allocate a zero buffer - 64 sectors at a time }
bufSects := 64; bufSects := 64;
buf := puint32(kalloc(bufSects * device^.sectorSize)); buf := puint32(kalloc(bufSects * device^.sectorSize));
memset(uint32(buf), 0, bufSects * device^.sectorSize); memset(PtrUInt(buf), 0, bufSects * device^.sectorSize);
print('Wiping device '); print('Wiping device ');
printint(idx); printint(idx);
+12 -11
View File
@@ -34,7 +34,7 @@ uses
driver.video, driver.video,
driver.storage.vol.mgr, driver.storage.vol.mgr,
driver.video.windows, driver.video.windows,
core.util, arch.x86.util; core.util, arch.platform.cpu;
const const
WIN_W = 740; WIN_W = 740;
@@ -129,9 +129,9 @@ begin
item := PUIText(kalloc(sizeof(TUIText)+n+m+1)); item := PUIText(kalloc(sizeof(TUIText)+n+m+1));
if item = nil then exit; if item = nil then exit;
item^.Next := TextTemps; TextTemps := item; item^.Next := TextTemps; TextTemps := item;
dest := pchar(uint32(item)+sizeof(TUIText)); dest := pchar(PtrUInt(item)+sizeof(TUIText));
if n > 0 then memcpy(uint32(a), uint32(dest), n); if n > 0 then memcpy(PtrUInt(a), PtrUInt(dest), n);
if m > 0 then memcpy(uint32(b), uint32(dest)+n, m); if m > 0 then memcpy(PtrUInt(b), PtrUInt(dest)+n, m);
dest[n+m] := #0; uiConcat := dest; dest[n+m] := #0; uiConcat := dest;
end; end;
@@ -606,7 +606,7 @@ begin
end; end;
end; end;
memset(uint32(@part), 0, sizeof(TPartition_table)); memset(PtrUInt(@part), 0, sizeof(TPartition_table));
driver.storage.vol.mbr.setup_partition(@part, lba, sectors); driver.storage.vol.mbr.setup_partition(@part, lba, sectors);
cbCtx := begin_partition_ui(1); cbCtx := begin_partition_ui(1);
if cbCtx = nil then exit; if cbCtx = nil then exit;
@@ -702,18 +702,19 @@ end;
procedure operation_done(error : TError; userdata : pointer); procedure operation_done(error : TError; userdata : pointer);
var var
ctx : PFmtUICallbackCtx; ctx : PFmtUICallbackCtx;
flags : uint32; flags : PtrUInt;
begin begin
ctx := PFmtUICallbackCtx(userdata); ctx := PFmtUICallbackCtx(userdata);
if ctx <> nil then begin if ctx <> nil then begin
asm pushfd; cli; pop flags end; flags := arch.platform.cpu.lock;
if ctx^.SessionID = ui_session_id then begin if ctx^.SessionID = ui_session_id then begin
fmt_done_error := error; fmt_done_error := error;
fmt_done_vol_idx := ctx^.VolumeIdx; fmt_done_vol_idx := ctx^.VolumeIdx;
done_kind := ctx^.Kind; done_device := ctx^.DeviceIdx; done_kind := ctx^.Kind;
done_device := ctx^.DeviceIdx;
puint32(@fmt_done_flag)^ := 1; puint32(@fmt_done_flag)^ := 1;
end; end;
if (flags and $200) <> 0 then asm sti end; arch.platform.cpu.unlock(flags);
kfree(void(ctx)); kfree(void(ctx));
end; end;
end; end;
@@ -824,7 +825,7 @@ begin
fs := driver.storage.fs.mgr.get_filesystem(selIdx); fs := driver.storage.fs.mgr.get_filesystem(selIdx);
if fs = nil then begin closeMsgBox; exit; end; if fs = nil then begin closeMsgBox; exit; end;
memset(uint32(@params), 0, sizeof(TFSFormatParams)); memset(PtrUInt(@params), 0, sizeof(TFSFormatParams));
params.Version := FS_FORMAT_PARAMS_VERSION_1; params.Version := FS_FORMAT_PARAMS_VERSION_1;
paramPtr := nil; paramPtr := nil;
@@ -874,7 +875,7 @@ begin
if fs^.validateLabelCallback(text,normalized) <> eNone then begin if fs^.validateLabelCallback(text,normalized) <> eNone then begin
set_fmt_param_error('Use up to 11 ASCII characters without punctuation such as / or :'); exit; set_fmt_param_error('Use up to 11 ASCII characters without punctuation such as / or :'); exit;
end; end;
memcpy(uint32(@normalized[0]),uint32(@params.LabelText[0]),12); memcpy(PtrUInt(@normalized[0]),PtrUInt(@params.LabelText[0]),12);
params.Flags := params.Flags or FS_FORMAT_PARAM_LABEL; paramPtr := @params; params.Flags := params.Flags or FS_FORMAT_PARAM_LABEL; paramPtr := @params;
end; end;
+9 -9
View File
@@ -32,7 +32,7 @@ uses
core.gfx.fileicons, core.gfx.fileicons,
debug.tracer, debug.tracer,
core.util, core.util,
arch.x86.util; arch.platform.cpu;
const const
WIN_W = 800; WIN_W = 800;
@@ -785,9 +785,9 @@ begin
dir_names := PNameBuf(kalloc(sizeof(TNameBuf))); dir_names := PNameBuf(kalloc(sizeof(TNameBuf)));
file_names := PNameBuf(kalloc(sizeof(TNameBuf))); file_names := PNameBuf(kalloc(sizeof(TNameBuf)));
file_sizes := PSizeBuf(kalloc(sizeof(TSizeBuf))); file_sizes := PSizeBuf(kalloc(sizeof(TSizeBuf)));
memset(uint32(dir_names), 0, sizeof(TNameBuf)); memset(PtrUInt(dir_names), 0, sizeof(TNameBuf));
memset(uint32(file_names), 0, sizeof(TNameBuf)); memset(PtrUInt(file_names), 0, sizeof(TNameBuf));
memset(uint32(file_sizes), 0, sizeof(TSizeBuf)); memset(PtrUInt(file_sizes), 0, sizeof(TSizeBuf));
{ Load directory from VFS — this may do disk I/O } { Load directory from VFS — this may do disk I/O }
Map := driver.storage.vfs.GetDirectoryListingFrom(state^.cur_path, '/'); Map := driver.storage.vfs.GetDirectoryListingFrom(state^.cur_path, '/');
@@ -1330,7 +1330,7 @@ begin
parent := stringCopy('/') parent := stringCopy('/')
else begin else begin
parent := pchar(kalloc(uint32(i) + 1)); parent := pchar(kalloc(uint32(i) + 1));
memcpy(uint32(cur), uint32(parent), uint32(i)); memcpy(PtrUInt(cur), PtrUInt(parent), uint32(i));
parent[i] := char(0); parent[i] := char(0);
end; end;
navigate_to(state, parent); navigate_to(state, parent);
@@ -1440,7 +1440,7 @@ begin
{ Segment name label } { Segment name label }
segBuf := pchar(kalloc(segEnd - segStart + 1)); segBuf := pchar(kalloc(segEnd - segStart + 1));
memcpy(uint32(@path[segStart]), uint32(segBuf), segEnd - segStart); memcpy(PtrUInt(@path[segStart]), uint32(segBuf), segEnd - segStart);
segBuf[segEnd - segStart] := char(0); segBuf[segEnd - segStart] := char(0);
lbl := lv_label_create(btn); lbl := lv_label_create(btn);
lv_label_set_text(lbl, segBuf); lv_label_set_text(lbl, segBuf);
@@ -1979,7 +1979,7 @@ begin
if state^.tabs[idx] <> nil then if state^.tabs[idx] <> nil then
free_tab_snapshot(state^.tabs[idx]); free_tab_snapshot(state^.tabs[idx]);
snap := PTabSnapshot(kalloc(sizeof(TTabSnapshot))); snap := PTabSnapshot(kalloc(sizeof(TTabSnapshot)));
memset(uint32(snap), 0, sizeof(TTabSnapshot)); memset(PtrUInt(snap), 0, sizeof(TTabSnapshot));
if state^.cur_path <> nil then if state^.cur_path <> nil then
snap^.cur_path := stringCopy(state^.cur_path) snap^.cur_path := stringCopy(state^.cur_path)
else else
@@ -2090,7 +2090,7 @@ begin
save_tab(state, state^.active_tab); save_tab(state, state^.active_tab);
{ Create snapshot for new tab } { Create snapshot for new tab }
snap := PTabSnapshot(kalloc(sizeof(TTabSnapshot))); snap := PTabSnapshot(kalloc(sizeof(TTabSnapshot)));
memset(uint32(snap), 0, sizeof(TTabSnapshot)); memset(PtrUInt(snap), 0, sizeof(TTabSnapshot));
snap^.cur_path := stringCopy(path); snap^.cur_path := stringCopy(path);
snap^.hist_len := 0; snap^.hist_len := 0;
snap^.hist_pos := 0; snap^.hist_pos := 0;
@@ -3053,7 +3053,7 @@ begin
{ Allocate and zero-initialise state } { Allocate and zero-initialise state }
state := PFileBrowserState(kalloc(sizeof(TFileBrowserState))); state := PFileBrowserState(kalloc(sizeof(TFileBrowserState)));
memset(uint32(state), 0, sizeof(TFileBrowserState)); memset(PtrUInt(state), 0, sizeof(TFileBrowserState));
state^.win_id := g_win_id; state^.win_id := g_win_id;
state^.cur_path := stringCopy('/'); state^.cur_path := stringCopy('/');
state^.view_mode := vmDetail; state^.view_mode := vmDetail;
+5 -5
View File
@@ -64,7 +64,7 @@ uses
core.strings.helpers, core.strings.helpers,
io.syslog, io.syslog,
debug.tracer, debug.tracer,
core.util, arch.x86.util, core.util, arch.platform.cpu,
driver.storage.vfs; driver.storage.vfs;
const const
@@ -325,9 +325,9 @@ begin
dir_names := PNameBuf(kalloc(sizeof(TNameBuf))); dir_names := PNameBuf(kalloc(sizeof(TNameBuf)));
file_names := PNameBuf(kalloc(sizeof(TNameBuf))); file_names := PNameBuf(kalloc(sizeof(TNameBuf)));
file_sizes := PSizeBuf(kalloc(sizeof(TSizeBuf))); file_sizes := PSizeBuf(kalloc(sizeof(TSizeBuf)));
memset(uint32(dir_names), 0, sizeof(TNameBuf)); memset(PtrUInt(dir_names), 0, sizeof(TNameBuf));
memset(uint32(file_names), 0, sizeof(TNameBuf)); memset(PtrUInt(file_names), 0, sizeof(TNameBuf));
memset(uint32(file_sizes), 0, sizeof(TSizeBuf)); memset(PtrUInt(file_sizes), 0, sizeof(TSizeBuf));
{ Sync path bar } { Sync path bar }
if p^.path_bar <> nil then if p^.path_bar <> nil then
@@ -898,7 +898,7 @@ begin
io.syslog.logln('FPCIK', 'make_picker: enter'); io.syslog.logln('FPCIK', 'make_picker: enter');
p := PPicker(kalloc(sizeof(TPicker))); p := PPicker(kalloc(sizeof(TPicker)));
memset(uint32(p), 0, sizeof(TPicker)); memset(PtrUInt(p), 0, sizeof(TPicker));
p^.cb := cb; p^.cb := cb;
p^.userdata := userdata; p^.userdata := userdata;
p^.is_save := is_save; p^.is_save := is_save;
+7 -2
View File
@@ -22,7 +22,7 @@ unit app.md5sum;
interface interface
uses uses
io.stdio, core.util, arch.x86.util, core.strings, debug.tracer, core.enc.md5; memory.heap, io.stdio, core.util, arch.platform.cpu, core.strings, debug.tracer, core.enc.md5;
procedure init(); procedure init();
@@ -36,6 +36,10 @@ var
i : uint32; i : uint32;
begin begin
if paramCount(Params) = 0 then begin
io.stdio.bufWriteStrLn(stderr_buf, 'Usage: MD5SUM <word>');
exit;
end;
md5word:= getParam(0, Params); md5word:= getParam(0, Params);
wordlen:= stringSize(md5word); wordlen:= stringSize(md5word);
MD5_Hash := MD5Buffer(puint8(md5word), wordlen); MD5_Hash := MD5Buffer(puint8(md5word), wordlen);
@@ -43,6 +47,7 @@ begin
io.stdio.bufWriteHexPair(stdout_buf, MD5_Hash^[i]); io.stdio.bufWriteHexPair(stdout_buf, MD5_Hash^[i]);
end; end;
io.stdio.bufWriteStrLn(stdout_buf, ' '); io.stdio.bufWriteStrLn(stdout_buf, ' ');
memory.heap.kfree(void(MD5_Hash));
end; end;
procedure init(); procedure init();
@@ -51,4 +56,4 @@ begin
io.stdio.registerCommand('MD5SUM', @Run, 'Perform MD5SUM on a word.'); io.stdio.registerCommand('MD5SUM', @Run, 'Perform MD5SUM on a word.');
end; end;
end. end.
+23 -43
View File
@@ -22,7 +22,7 @@ unit app.meminfo;
interface interface
uses uses
io.stdio, arch.x86.multiboot, arch.x86.memory.physical, memory.heap, debug.tracer; io.stdio, arch.platform.memory, memory.heap, debug.tracer;
procedure init(); procedure init();
@@ -30,50 +30,30 @@ implementation
procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf); procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf);
var var
pmm_total, pmm_free, pmm_used : uint32; total, available: uint64;
lmm_pages, lmm_free : uint32; heapPages: uint32;
begin begin
{ Multiboot memory info } total := arch.platform.memory.totalPhysicalBytes;
io.stdio.bufWriteStrLn(stdout_buf, '--- Multiboot ---'); available := arch.platform.memory.freePhysicalBytes;
io.stdio.bufWriteStr(stdout_buf, 'Lower Memory : '); io.stdio.bufWriteStr(stdout_buf, 'Usable Physical: ');
io.stdio.bufWriteInt(stdout_buf, multibootinfo^.mem_lower); io.stdio.bufWriteInt(stdout_buf, total div 1024);
io.stdio.bufWriteStrLn(stdout_buf, ' KB'); io.stdio.bufWriteStrLn(stdout_buf, ' KiB');
io.stdio.bufWriteStr(stdout_buf, 'Upper Memory : '); io.stdio.bufWriteStr(stdout_buf, 'Free Physical : ');
io.stdio.bufWriteInt(stdout_buf, multibootinfo^.mem_upper); io.stdio.bufWriteInt(stdout_buf, available div 1024);
io.stdio.bufWriteStrLn(stdout_buf, ' KB'); io.stdio.bufWriteStrLn(stdout_buf, ' KiB');
io.stdio.bufWriteStr(stdout_buf, 'Total Memory : '); io.stdio.bufWriteStr(stdout_buf, 'Used Physical : ');
io.stdio.bufWriteInt(stdout_buf, ((multibootinfo^.mem_upper + 1000) div 1024) + 1); io.stdio.bufWriteInt(stdout_buf, (total - available) div 1024);
io.stdio.bufWriteStrLn(stdout_buf, ' MB'); io.stdio.bufWriteStrLn(stdout_buf, ' KiB');
heapPages := memory.heap.lmm_page_count;
{ PMM stats } io.stdio.bufWriteStr(stdout_buf, 'Heap Regions : ');
io.stdio.bufWriteStrLn(stdout_buf, '--- PMM (4 MB blocks) ---'); io.stdio.bufWriteIntLn(stdout_buf, heapPages);
pmm_total := arch.x86.memory.physical.pmm_total_blocks; io.stdio.bufWriteStr(stdout_buf, 'Heap Size : ');
pmm_free := arch.x86.memory.physical.pmm_free_blocks; io.stdio.bufWriteInt(stdout_buf, uint64(heapPages) * PAGE_SIZE_LMM div 1024);
pmm_used := pmm_total - pmm_free; io.stdio.bufWriteStrLn(stdout_buf, ' KiB');
io.stdio.bufWriteStr(stdout_buf, 'Total Blocks : '); io.stdio.bufWriteStr(stdout_buf, 'Heap Free : ');
io.stdio.bufWriteIntLn(stdout_buf, pmm_total); io.stdio.bufWriteInt(stdout_buf, memory.heap.lmm_total_free div 1024);
io.stdio.bufWriteStr(stdout_buf, 'Free Blocks : '); io.stdio.bufWriteStrLn(stdout_buf, ' KiB');
io.stdio.bufWriteIntLn(stdout_buf, pmm_free);
io.stdio.bufWriteStr(stdout_buf, 'Used Blocks : ');
io.stdio.bufWriteIntLn(stdout_buf, pmm_used);
io.stdio.bufWriteStr(stdout_buf, 'Free Physical : ');
io.stdio.bufWriteInt(stdout_buf, pmm_free * 4);
io.stdio.bufWriteStrLn(stdout_buf, ' MB');
{ LMM heap stats }
io.stdio.bufWriteStrLn(stdout_buf, '--- LMM (Heap) ---');
lmm_pages := memory.heap.lmm_page_count;
lmm_free := memory.heap.lmm_total_free;
io.stdio.bufWriteStr(stdout_buf, 'Heap Pages : ');
io.stdio.bufWriteIntLn(stdout_buf, lmm_pages);
io.stdio.bufWriteStr(stdout_buf, 'Heap Size : ');
io.stdio.bufWriteInt(stdout_buf, lmm_pages * 4);
io.stdio.bufWriteStrLn(stdout_buf, ' MB');
io.stdio.bufWriteStr(stdout_buf, 'Heap Free : ');
io.stdio.bufWriteInt(stdout_buf, lmm_free div 1024);
io.stdio.bufWriteStrLn(stdout_buf, ' KB');
end; end;
procedure init(); procedure init();
begin begin
debug.tracer.push_trace('meminfo.init'); debug.tracer.push_trace('meminfo.init');
+14 -29
View File
@@ -11,8 +11,7 @@
- Status bar showing Line, Col, filename, and dirty flag - Status bar showing Line, Col, filename, and dirty flag
Key design notes: Key design notes:
- lv_event_t.stop_processing (bit 1 at struct byte offset 24) is set - lv_event_stop_processing prevents LVGL's default textarea handler from also
directly to prevent LVGL's default textarea key handler from also
acting on keys we have fully handled ourselves. acting on keys we have fully handled ourselves.
- Shift state is read from driver.hid.keyboard.is_shift / driver.hid.keyboard.is_ctrl. - Shift state is read from driver.hid.keyboard.is_shift / driver.hid.keyboard.is_ctrl.
- selection anchor (sel_anchor) is stored as a sint32 byte offset; - selection anchor (sel_anchor) is stored as a sint32 byte offset;
@@ -43,7 +42,7 @@ uses
io.syslog, io.syslog,
io.stdio, io.stdio,
debug.tracer, debug.tracer,
core.util, arch.x86.util, core.util, arch.platform.cpu,
driver.storage.vfs, driver.storage.vfs,
driver.video, driver.video,
driver.video.windows; driver.video.windows;
@@ -62,19 +61,6 @@ const
FILE_BUF_SIZE = 65536; { 64 KB read / write buffer } FILE_BUF_SIZE = 65536; { 64 KB read / write buffer }
{
Byte offset and bitmask for lv_event_t.stop_processing.
struct lv_event_t (32-bit ABI):
offset 0: current_target (ptr)
offset 4: original_target (ptr)
offset 8: code (uint32 — lv_event_code_t)
offset 12: user_data (ptr)
offset 16: param (ptr)
offset 20: prev (ptr)
offset 24: flags byte [bit0=deleted, bit1=stop_processing, bit2=stop_bubbling]
}
LV_EVT_STOP_OFF = 24;
LV_EVT_STOP_BIT = 2; { bit 1 = stop_processing }
type type
PNotepadState = ^TNotepadState; PNotepadState = ^TNotepadState;
@@ -130,8 +116,7 @@ procedure removeInstance(state: PNotepadState); forward;
============================================================ } ============================================================ }
procedure stopEvent(e: Plv_event); procedure stopEvent(e: Plv_event);
begin begin
puint8(uint32(e) + LV_EVT_STOP_OFF)^ := lv_event_stop_processing(e);
puint8(uint32(e) + LV_EVT_STOP_OFF)^ or LV_EVT_STOP_BIT;
end; end;
{ ============================================================ { ============================================================
@@ -157,18 +142,18 @@ begin
if to_idx < from_idx then to_idx := from_idx; if to_idx < from_idx then to_idx := from_idx;
result_len := from_idx + ins_len + (src_len - to_idx); result_len := from_idx + ins_len + (src_len - to_idx);
buf := pchar(kalloc(result_len + 1)); buf := pchar(kalloc(result_len + 1));
memset(uint32(buf), 0, result_len + 1); memset(PtrUInt(buf), 0, result_len + 1);
pos := 0; pos := 0;
if from_idx > 0 then begin if from_idx > 0 then begin
memcpy(uint32(src), uint32(buf), from_idx); memcpy(PtrUInt(src), PtrUInt(buf), from_idx);
pos := from_idx; pos := from_idx;
end; end;
if ins_len > 0 then begin if ins_len > 0 then begin
memcpy(uint32(insert), uint32(@buf[pos]), ins_len); memcpy(PtrUInt(insert), PtrUInt(@buf[pos]), ins_len);
pos := pos + ins_len; pos := pos + ins_len;
end; end;
if to_idx < src_len then if to_idx < src_len then
memcpy(uint32(@src[to_idx]), uint32(@buf[pos]), src_len - to_idx); memcpy(PtrUInt(@src[to_idx]), PtrUInt(@buf[pos]), src_len - to_idx);
buildSplicedString := buf; buildSplicedString := buf;
end; end;
@@ -198,12 +183,12 @@ begin
{ Generous output buffer: original + 4 bytes per line (worst case ~512 lines) } { Generous output buffer: original + 4 bytes per line (worst case ~512 lines) }
out_buf := pchar(kalloc(src_len + 2049)); out_buf := pchar(kalloc(src_len + 2049));
memset(uint32(out_buf), 0, src_len + 2049); memset(PtrUInt(out_buf), 0, src_len + 2049);
out_pos := 0; out_pos := 0;
{ Copy everything before the affected region verbatim } { Copy everything before the affected region verbatim }
if first_ls > 0 then begin if first_ls > 0 then begin
memcpy(uint32(src), uint32(out_buf), first_ls); memcpy(PtrUInt(src), PtrUInt(out_buf), first_ls);
out_pos := first_ls; out_pos := first_ls;
end; end;
@@ -215,7 +200,7 @@ begin
if i >= sel_end then begin if i >= sel_end then begin
{ Past the affected region: copy the remainder verbatim } { Past the affected region: copy the remainder verbatim }
if i < src_len then begin if i < src_len then begin
memcpy(uint32(@src[i]), uint32(@out_buf[out_pos]), src_len - i); memcpy(PtrUInt(@src[i]), PtrUInt(@out_buf[out_pos]), src_len - i);
out_pos := out_pos + (src_len - i); out_pos := out_pos + (src_len - i);
end; end;
break; break;
@@ -426,8 +411,8 @@ begin
len := stringSize(txt); len := stringSize(txt);
if len > FILE_BUF_SIZE - 1 then len := FILE_BUF_SIZE - 1; if len > FILE_BUF_SIZE - 1 then len := FILE_BUF_SIZE - 1;
buf := pchar(kalloc(FILE_BUF_SIZE)); buf := pchar(kalloc(FILE_BUF_SIZE));
memset(uint32(buf), 0, FILE_BUF_SIZE); memset(PtrUInt(buf), 0, FILE_BUF_SIZE);
memcpy(uint32(txt), uint32(buf), len); memcpy(PtrUInt(txt), PtrUInt(buf), len);
fHandle := driver.storage.vfs.OpenFile(state^.currentPath, omReadWrite, @fError); fHandle := driver.storage.vfs.OpenFile(state^.currentPath, omReadWrite, @fError);
if fHandle = 0 then if fHandle = 0 then
fHandle := driver.storage.vfs.OpenFile(state^.currentPath, omCreate, @fError); fHandle := driver.storage.vfs.OpenFile(state^.currentPath, omCreate, @fError);
@@ -477,7 +462,7 @@ begin
exit; exit;
end; end;
buf := pchar(kalloc(FILE_BUF_SIZE)); buf := pchar(kalloc(FILE_BUF_SIZE));
memset(uint32(buf), 0, FILE_BUF_SIZE); memset(PtrUInt(buf), 0, FILE_BUF_SIZE);
driver.storage.vfs.ReadFile(fHandle, 0, puint8(buf), FILE_BUF_SIZE - 1); driver.storage.vfs.ReadFile(fHandle, 0, puint8(buf), FILE_BUF_SIZE - 1);
driver.storage.vfs.CloseFile(fHandle); driver.storage.vfs.CloseFile(fHandle);
if state^.currentPath <> nil then kfree(void(state^.currentPath)); if state^.currentPath <> nil then kfree(void(state^.currentPath));
@@ -943,7 +928,7 @@ begin
{ Allocate and zero-initialise state } { Allocate and zero-initialise state }
state := PNotepadState(kalloc(sizeof(TNotepadState))); state := PNotepadState(kalloc(sizeof(TNotepadState)));
memset(uint32(state), 0, sizeof(TNotepadState)); memset(PtrUInt(state), 0, sizeof(TNotepadState));
state^.win_id := wid; state^.win_id := wid;
state^.sel_anchor := -1; state^.sel_anchor := -1;
addInstance(state); addInstance(state);
+6 -2
View File
@@ -14,7 +14,7 @@ unit app.setres;
interface interface
uses uses
io.stdio, driver.video.gpu, core.util, arch.x86.util, core.strings, debug.tracer, io.syslog; io.stdio, driver.video.lvgl, driver.video.gpu, core.util, arch.platform.cpu, core.strings, debug.tracer, io.syslog;
procedure init(); procedure init();
@@ -25,6 +25,7 @@ var
w, h : uint32; w, h : uint32;
wStr, hStr : pchar; wStr, hStr : pchar;
info : TGPUModeInfo; info : TGPUModeInfo;
changed: boolean;
begin begin
debug.tracer.push_trace('setres.run'); debug.tracer.push_trace('setres.run');
@@ -55,7 +56,10 @@ begin
io.stdio.bufWriteStrLn(stdout_buf, 'x32...'); io.stdio.bufWriteStrLn(stdout_buf, 'x32...');
{ Step 1: Set display mode via GPU framework (tries BGA first, then VBE) } { Step 1: Set display mode via GPU framework (tries BGA first, then VBE) }
if not driver.video.gpu.setMode(w, h, 32, info) then begin driver.video.lvgl.lvgl_lock;
changed := driver.video.gpu.setMode(w, h, 32, info);
driver.video.lvgl.lvgl_unlock;
if not changed then begin
io.stdio.bufWriteStrLn(stderr_buf, 'Error: Mode switch failed. Mode may not be supported.'); io.stdio.bufWriteStrLn(stderr_buf, 'Error: Mode switch failed. Mode may not be supported.');
debug.tracer.pop_trace; debug.tracer.pop_trace;
exit; exit;
+1 -1
View File
@@ -19,7 +19,7 @@ unit app.uidebug;
interface interface
uses uses
driver.video.lvgl, driver.video.windows, driver.hid.mouse, driver.video, arch.x86.multiboot, debug.tracer; driver.video.lvgl, driver.video.windows, driver.hid.mouse, driver.video, boot.multiboot, debug.tracer;
{ Call once per frame from the main loop (before lvgl_handler). } { Call once per frame from the main loop (before lvgl_handler). }
procedure update; procedure update;
File diff suppressed because it is too large. Load diff
+11 -7
View File
@@ -12,9 +12,6 @@ unit driver.hid.mouse;
interface interface
uses
driver.video;
type type
TMouseEventType = ( TMouseEventType = (
MOUSE_MOVE, MOUSE_MOVE,
@@ -36,6 +33,7 @@ function getMouseRMB: boolean;
function getMouseScroll: sint32; function getMouseScroll: sint32;
{ Setters - called by driver.hid.mouse drivers (PS/2, driver.bus.usb) } { Setters - called by driver.hid.mouse drivers (PS/2, driver.bus.usb) }
procedure setBounds(width, height: uint32);
procedure setMousePos(x, y: sint32); procedure setMousePos(x, y: sint32);
procedure setMouseLMB(down: boolean); procedure setMouseLMB(down: boolean);
procedure setMouseRMB(down: boolean); procedure setMouseRMB(down: boolean);
@@ -53,6 +51,7 @@ const
MAX_MOUSE_HOOKS = 8; MAX_MOUSE_HOOKS = 8;
var var
maxW, maxH : sint32;
MouseX : sint32 = 0; MouseX : sint32 = 0;
MouseY : sint32 = 0; MouseY : sint32 = 0;
MouseLMB : boolean = false; MouseLMB : boolean = false;
@@ -87,12 +86,17 @@ begin
ScrollAccum := 0; ScrollAccum := 0;
end; end;
procedure setBounds(width, height: uint32);
begin
if width > $7FFFFFFF then width := $7FFFFFFF;
if height > $7FFFFFFF then height := $7FFFFFFF;
maxW := sint32(width);
maxH := sint32(height);
setMousePos(MouseX, MouseY);
end;
procedure setMousePos(x, y: sint32); procedure setMousePos(x, y: sint32);
var
maxW, maxH : sint32;
begin begin
maxW := sint32(driver.video.frontBufferWidth);
maxH := sint32(driver.video.frontBufferHeight);
if x < 0 then x := 0; if x < 0 then x := 0;
if y < 0 then y := 0; if y < 0 then y := 0;
if (maxW > 0) and (x >= maxW) then x := maxW - 1; if (maxW > 0) and (x >= maxW) then x := maxW - 1;
+24 -16
View File
@@ -12,18 +12,17 @@ unit driver.hid.ps2.keyboard;
interface interface
uses uses
boot.mgr,
driver.hid.keyboard, driver.hid.keyboard,
io.syslog, io.syslog,
core.util, arch.x86.util, core.util, arch.platform.cpu,
arch.x86.isr.ps2keyboard; arch.platform.interrupts, arch.common.legacyirq;
var var
key_matrix : array [1..256] of TKeyInfo; key_matrix : array [0..255] of TKeyInfo;
key_matrix_shift : array [1..256] of TKeyInfo; key_matrix_shift : array [0..255] of TKeyInfo;
procedure init(); procedure init();
procedure init_layout(keyboard_layout : array of TKeyInfo); procedure init_layout(const keyboard_layout : array of TKeyInfo);
procedure disable; procedure disable;
procedure lang_USA(); procedure lang_USA();
@@ -32,14 +31,16 @@ implementation
uses uses
driver.mgr; driver.mgr;
procedure callback(scan_code : void); var enabled: boolean = false;
procedure callback(scan_code : uint8);
var var
info : TKeyInfo; info : TKeyInfo;
raw : uint8; raw : uint8;
baseCode : uint8; baseCode : uint8;
isBreak : boolean; isBreak : boolean;
begin begin
raw := uint8(scan_code); raw := scan_code;
{ In PS/2 scancode set 1, bit 7 set = key release (break code) } { In PS/2 scancode set 1, bit 7 set = key release (break code) }
isBreak := (raw AND $80) <> 0; isBreak := (raw AND $80) <> 0;
@@ -71,26 +72,36 @@ begin
end; end;
end; end;
procedure keyboardIRQ;
var
code: uint8;
begin
if (inb($64) and $21) <> 1 then exit;
code := inb($60);
if enabled then callback(code);
end;
function load(ptr : void) : boolean; function load(ptr : void) : boolean;
begin begin
arch.x86.isr.ps2keyboard.register(); enabled := true;
arch.x86.isr.ps2keyboard.hook(uint32(@callback)); arch.platform.interrupts.registerIRQ(33, @keyboardIRQ);
arch.common.legacyirq.enableLine(1);
io.syslog.logln('PS/2 KEYBOARD', 'LOADED.'); io.syslog.logln('PS/2 KEYBOARD', 'LOADED.');
load := true; load := true;
end; end;
procedure disable; procedure disable;
begin begin
arch.x86.isr.ps2keyboard.unhook(uint32(@callback)); enabled := false;
io.syslog.logln('PS/2 KEYBOARD', 'Disabled (driver.bus.usb driver.hid.keyboard active).'); io.syslog.logln('PS/2 KEYBOARD', 'Disabled (driver.bus.usb driver.hid.keyboard active).');
end; end;
procedure init_layout(keyboard_layout : array of TKeyInfo); procedure init_layout(const keyboard_layout : array of TKeyInfo);
var var
devid : TDeviceIdentifier; devid : TDeviceIdentifier;
begin begin
io.syslog.logln('PS/2 KEYBOARD', 'INIT BEGIN.'); io.syslog.logln('PS/2 KEYBOARD', 'INIT BEGIN.');
if keyboard_layout[1].key_code = 0 then lang_USA(); if (High(keyboard_layout) < 1) or (keyboard_layout[1].key_code = 0) then lang_USA();
devid.bus := biUnknown; devid.bus := biUnknown;
devid.id0 := 0; devid.id0 := 0;
devid.id1 := 0; devid.id1 := 0;
@@ -354,7 +365,4 @@ begin
key_matrix_shift[53].key_code := $3F; key_matrix_shift[53].key_code := $3F;
end; end;
initialization
boot.mgr.registerBoot('driver.hid.ps2.keyboard', @init, 'PS/2 Keyboard Driver', BOOT_MGR_BARRIER_DEVICE);
end. end.
+12 -9
View File
@@ -11,15 +11,14 @@ unit driver.hid.ps2.mouse;
interface interface
uses uses
boot.mgr,
debug.tracer, debug.tracer,
driver.hid.mouse, driver.hid.mouse,
io.syslog, io.syslog,
driver.video, driver.video,
core.util, arch.x86.util, core.util, arch.platform.cpu,
memory.heap, memory.heap,
core.strings, core.strings,
arch.x86.isr.mgr, arch.platform.interrupts, arch.common.legacyirq,
driver.mgr; driver.mgr;
type type
@@ -114,6 +113,7 @@ end;
procedure main(); procedure main();
var var
i : integer; i : integer;
bytesRead: uint32;
b : byte; b : byte;
packet : TMousePacket; packet : TMousePacket;
x, y, f : byte; x, y, f : byte;
@@ -124,7 +124,9 @@ begin
When it returns true, data is ready — read it directly with inb($60). When it returns true, data is ready — read it directly with inb($60).
Do NOT call mouse_read here: it uses mouse_wait_long (100k iterations) Do NOT call mouse_read here: it uses mouse_wait_long (100k iterations)
and would spin-block the ISR if the next packet byte hasn't arrived yet. } and would spin-block the ISR if the next packet byte hasn't arrived yet. }
while mouse_wait(0) do begin bytesRead := 0;
while (bytesRead < 32) and ((inb($64) and $21) = $21) do begin
inc(bytesRead);
b := inb($60); b := inb($60);
if Cycle = 0 then begin if Cycle = 0 then begin
if (b AND $08) = $08 then begin if (b AND $08) = $08 then begin
@@ -213,8 +215,10 @@ var
status : uint8; status : uint8;
devid_byte : uint8; devid_byte : uint8;
tmp : uint8; tmp : uint8;
irqFlags: PtrUInt;
begin begin
push_trace('driver.hid.ps2.mouse.load'); push_trace('driver.hid.ps2.mouse.load');
irqFlags := arch.platform.cpu.lock;
{ Disable both PS/2 ports while configuring } { Disable both PS/2 ports while configuring }
mouse_wait_long(1); mouse_wait_long(1);
@@ -290,10 +294,12 @@ begin
mouse_write($F4); mouse_write($F4);
mouse_read(); mouse_read();
arch.x86.isr.mgr.registerISR(44, @Main); arch.platform.interrupts.registerIRQ(44, @Main);
arch.common.legacyirq.enableLine(12);
io.syslog.logln('PS/2 MOUSE', 'LOADED.'); io.syslog.logln('PS/2 MOUSE', 'LOADED.');
io.syslog.log('PS/2 MOUSE', 'Memory: '); io.syslog.log('PS/2 MOUSE', 'Memory: ');
io.syslog.writehexln(uint32(@current)); io.syslog.writehexln(PtrUInt(@current));
arch.platform.cpu.unlock(irqFlags);
load := true; load := true;
pop_trace; pop_trace;
end; end;
@@ -320,7 +326,4 @@ begin
pop_trace; pop_trace;
end; end;
initialization
boot.mgr.registerBoot('driver.hid.ps2.mouse', @init, 'PS/2 Mouse Driver', BOOT_MGR_BARRIER_DEVICE);
end. end.
+43 -25
View File
@@ -17,9 +17,8 @@ unit driver.video.bga;
interface interface
uses uses
boot.mgr, core.util, arch.platform.cpu, io.syslog, debug.tracer, driver.video.gpu, driver.bus.pci, driver.types, driver.mgr,
core.util, arch.x86.util, io.syslog, debug.tracer, driver.video.gpu, driver.bus.pci, driver.types, driver.mgr, arch.platform.memory, memory.heap;
arch.x86.memory.virtual, memory.heap;
procedure init; procedure init;
@@ -58,6 +57,7 @@ const
var var
BGAPresent : boolean = false; BGAPresent : boolean = false;
BGAFramebuffer: uint32 = 0; BGAFramebuffer: uint32 = 0;
BGAMemoryBytes: uint64 = 0;
BGAPCIBus : uint8 = 0; BGAPCIBus : uint8 = 0;
BGAPCISlot : uint8 = 0; BGAPCISlot : uint8 = 0;
BGAPCIFunc : uint8 = 0; BGAPCIFunc : uint8 = 0;
@@ -76,22 +76,6 @@ begin
bgaReadReg := inw(BGA_PORT_DATA); bgaReadReg := inw(BGA_PORT_DATA);
end; end;
{ Map the framebuffer physical memory pages so we can access it }
procedure mapFramebuffer(address, width, height : uint32; bpp : uint8);
var
framebufferSize : uint32;
lowerPage, upperPage, page : uint32;
begin
push_trace('driver.video.bga.mapFramebuffer');
framebufferSize := (width * height * uint32(bpp)) div 8;
lowerPage := (address SHR 22) - 1;
upperPage := ((address + framebufferSize) SHR 22) + 1;
for page := lowerPage to upperPage do begin
kpalloc(page SHL 22);
end;
pop_trace;
end;
{ Drivermanagement load callback: called when driver.bus.pci finds a matching device } { Drivermanagement load callback: called when driver.bus.pci finds a matching device }
function load(ptr : void) : boolean; function load(ptr : void) : boolean;
var var
@@ -141,6 +125,18 @@ begin
id := bgaReadReg(BGA_REG_ID); id := bgaReadReg(BGA_REG_ID);
if (id >= BGA_ID_MIN) and (id <= BGA_ID_MAX) then begin if (id >= BGA_ID_MIN) and (id <= BGA_ID_MAX) then begin
BGAPresent := true; BGAPresent := true;
{ PCI's legacy device_id field contains the vendor ID. VirtualBox's
BGA data port returns VRAM bytes on a 32-bit read; index $0A is its
monitor-count interface, not the Bochs 64 KiB memory register.
See VirtualBox DevVGA.cpp, vgaIoPortReadVbeData. }
if (dev^.device_id = $80EE) or (dev^.device_id = $15AD) then
BGAMemoryBytes := inl(BGA_PORT_DATA)
else if id >= $B0C5 then
BGAMemoryBytes := uint64(bgaReadReg($0A)) * 65536
else if id = $B0C4 then
BGAMemoryBytes := 8 * 1024 * 1024
else
BGAMemoryBytes := 4 * 1024 * 1024;
io.syslog.log('BGA', 'Detected BGA version $'); io.syslog.log('BGA', 'Detected BGA version $');
io.syslog.writehexln(id); io.syslog.writehexln(id);
@@ -164,6 +160,10 @@ end;
{ GPU framework: setMode callback } { GPU framework: setMode callback }
function bgaSetMode(width, height : uint32; bpp : uint8; function bgaSetMode(width, height : uint32; bpp : uint8;
var info : TGPUModeInfo) : boolean; var info : TGPUModeInfo) : boolean;
var
mapped: pointer;
bytes: uint64;
oldWidth, oldHeight, oldBPP, oldEnable: uint16;
begin begin
push_trace('driver.video.bga.bgaSetMode'); push_trace('driver.video.bga.bgaSetMode');
bgaSetMode := false; bgaSetMode := false;
@@ -173,6 +173,18 @@ begin
exit; exit;
end; end;
if (width = 0) or (height = 0) or (width > 65535) or
(height > 65535) or (bpp <> 32) then exit;
bytes := uint64(width) * height * 4;
if (BGAMemoryBytes = 0) or (bytes > BGAMemoryBytes) or
(bytes > High(SizeUInt)) then exit;
mapped := arch.platform.memory.mapDevice(BGAFramebuffer, SizeUInt(bytes));
if mapped = nil then exit;
oldWidth := bgaReadReg(BGA_REG_XRES);
oldHeight := bgaReadReg(BGA_REG_YRES);
oldBPP := bgaReadReg(BGA_REG_BPP);
oldEnable := bgaReadReg(BGA_REG_ENABLE);
{ Disable the display while changing mode } { Disable the display while changing mode }
bgaWriteReg(BGA_REG_ENABLE, BGA_DISABLED); bgaWriteReg(BGA_REG_ENABLE, BGA_DISABLED);
@@ -191,20 +203,28 @@ begin
bgaWriteReg(BGA_REG_ENABLE, BGA_ENABLED or BGA_LFB_ENABLED); bgaWriteReg(BGA_REG_ENABLE, BGA_ENABLED or BGA_LFB_ENABLED);
{ Verify mode was set } { Verify mode was set }
if bgaReadReg(BGA_REG_XRES) <> (width and $FFFF) then begin if (bgaReadReg(BGA_REG_XRES) <> width) or
(bgaReadReg(BGA_REG_YRES) <> height) or
(bgaReadReg(BGA_REG_BPP) <> bpp) then begin
bgaWriteReg(BGA_REG_ENABLE, BGA_DISABLED);
bgaWriteReg(BGA_REG_XRES, oldWidth);
bgaWriteReg(BGA_REG_YRES, oldHeight);
bgaWriteReg(BGA_REG_BPP, oldBPP);
bgaWriteReg(BGA_REG_VIRT_WIDTH, oldWidth);
bgaWriteReg(BGA_REG_VIRT_HEIGHT, oldHeight);
bgaWriteReg(BGA_REG_ENABLE, oldEnable);
io.syslog.logln('BGA', 'setMode: XRES verify failed.'); io.syslog.logln('BGA', 'setMode: XRES verify failed.');
pop_trace; pop_trace;
exit; exit;
end; end;
{ Map the framebuffer pages }
mapFramebuffer(BGAFramebuffer, width, height, bpp);
{ Fill in the mode info for the caller } { Fill in the mode info for the caller }
info.Width := width; info.Width := width;
info.Height := height; info.Height := height;
info.BPP := bpp; info.BPP := bpp;
info.Framebuffer := BGAFramebuffer; info.Framebuffer := PtrUInt(mapped);
info.Pitch := (width * uint32(bpp)) div 8; info.Pitch := (width * uint32(bpp)) div 8;
io.syslog.log('BGA', 'Mode set: '); io.syslog.log('BGA', 'Mode set: ');
@@ -247,7 +267,5 @@ begin
pop_trace; pop_trace;
end; end;
initialization
boot.mgr.registerBoot('driver.video.bga', @init, 'BGA Display Driver Initialization', 'driver.video');
end. end.
File diff suppressed because it is too large. Load diff
+25 -24
View File
@@ -22,17 +22,26 @@ unit driver.video.doublebuffer;
interface interface
uses uses
memory.heap, debug.tracer, driver.video.types, driver.io.serial, core.util, arch.x86.util; memory.heap, debug.tracer, driver.video.types, driver.io.serial, core.util, arch.platform.cpu;
//Init the driver, and register with the driver.video interface in a state ready for execution. //Init the driver, and register with the driver.video interface in a state ready for execution.
procedure init(Register : FRegisterDriver); procedure init(Register : FRegisterDriver);
implementation implementation
function allocateBackBuffer(Width : uint32; Height : uint32; BitsPerPixel : uint8) : uint64; function allocateBackBuffer(Width : uint32; Height : uint32; BitsPerPixel : uint8) : PtrUInt;
var
bytes: uint64;
begin begin
allocateBackBuffer := 0;
if (Width = 0) or (Height = 0) or (BitsPerPixel = 0) or
(BitsPerPixel mod 8 <> 0) then exit;
bytes := uint64(Width) * (BitsPerPixel div 8);
if bytes > High(uint32) then exit;
bytes := bytes * Height;
if bytes > High(SizeUInt) then exit;
debug.tracer.push_trace('driver.video.doublebuffer.allocateBackBuffer.enter'); debug.tracer.push_trace('driver.video.doublebuffer.allocateBackBuffer.enter');
allocateBackBuffer:= uint64(klalloc((Width * Height * BitsPerPixel) div 8)); allocateBackBuffer := PtrUInt(klalloc(SizeUInt(bytes)));
debug.tracer.push_trace('driver.video.doublebuffer.allocateBackBuffer.exit'); debug.tracer.push_trace('driver.video.doublebuffer.allocateBackBuffer.exit');
end; end;
@@ -44,6 +53,7 @@ begin
if (VInterface^.BackBuffer.Location <> 0) then begin if (VInterface^.BackBuffer.Location <> 0) then begin
VInterface^.BackBuffer.Width:= Width; VInterface^.BackBuffer.Width:= Width;
VInterface^.BackBuffer.Height:= Height; VInterface^.BackBuffer.Height:= Height;
VInterface^.BackBuffer.Pitch := Width * (BitsPerPixel div 8);
VInterface^.BackBuffer.BitsPerPixel:= BitsPerPixel; VInterface^.BackBuffer.BitsPerPixel:= BitsPerPixel;
VInterface^.BackBuffer.Initialized:= True; VInterface^.BackBuffer.Initialized:= True;
end; end;
@@ -53,27 +63,18 @@ end;
procedure Flush(FrontBuffer : PVideoBuffer; BackBuffer : PVideoBuffer); procedure Flush(FrontBuffer : PVideoBuffer; BackBuffer : PVideoBuffer);
var var
idx : uint32; row, bytes : uint32;
Back,Front : uint32;
BufferSize : uint32;
const
//COPY_WIDTH = 64; //Use this for 64bit copies
COPY_WIDTH = 128; //Use this for SSE copies
begin begin
//debug.tracer.push_trace('driver.video.doublebuffer.Flush.enter'); if not (FrontBuffer^.Initialized and BackBuffer^.Initialized) then exit;
if not(BackBuffer^.Initialized) then exit; if (BackBuffer^.Width > FrontBuffer^.Width) or
if ((FrontBuffer^.Width > BackBuffer^.Width) or (FrontBuffer^.Height > BackBuffer^.Height)) then exit; (BackBuffer^.Height > FrontBuffer^.Height) or
Back:= BackBuffer^.Location; (BackBuffer^.BitsPerPixel <> FrontBuffer^.BitsPerPixel) then exit;
Front:= FrontBuffer^.Location; bytes := BackBuffer^.Pitch;
BufferSize:= ( ( BackBuffer^.Width * BackBuffer^.Height * BackBuffer^.BitsPerPixel) div COPY_WIDTH ) - 1; if (bytes = 0) or (bytes > FrontBuffer^.Pitch) or
for idx:=0 to BufferSize do begin (BackBuffer^.Height = 0) then exit;
//Front[idx]:= Back[idx]; for row := 0 to BackBuffer^.Height - 1 do
// -- TODO: Get SSE working here for 128bit copies -- memcpy(BackBuffer^.Location + SizeUInt(row) * bytes,
__SSE_128_memcpy(Back + (idx * 16), Front + (idx * 16)); FrontBuffer^.Location + SizeUInt(row) * FrontBuffer^.Pitch, bytes);
end;
//debug.tracer.push_trace('driver.video.doublebuffer.Flush.exit');
end; end;
function enable(VideoInterface : PVideoInterface) : boolean; function enable(VideoInterface : PVideoInterface) : boolean;
@@ -96,4 +97,4 @@ begin
debug.tracer.push_trace('driver.video.doublebuffer.init.exit'); debug.tracer.push_trace('driver.video.doublebuffer.init.exit');
end; end;
end. end.
+4 -6
View File
@@ -15,8 +15,7 @@ unit driver.video.gpu;
interface interface
uses uses
boot.mgr, core.util, arch.platform.cpu, io.syslog, debug.tracer, core.strings;
core.util, arch.x86.util, io.syslog, debug.tracer, core.strings;
const const
GPU_MAX_DRIVERS = 8; GPU_MAX_DRIVERS = 8;
@@ -28,7 +27,7 @@ type
Width : uint32; Width : uint32;
Height : uint32; Height : uint32;
BPP : uint8; BPP : uint8;
Framebuffer : uint32; { physical address of linear framebuffer } Framebuffer : PtrUInt; { mapped address of linear framebuffer }
Pitch : uint32; { bytes per scanline } Pitch : uint32; { bytes per scanline }
end; end;
PGPUModeInfo = ^TGPUModeInfo; PGPUModeInfo = ^TGPUModeInfo;
@@ -173,6 +172,7 @@ procedure fireModeChangeCallbacks(const info : TGPUModeInfo);
var var
i : uint8; i : uint8;
begin begin
if CallbackCount = 0 then exit;
for i := 0 to CallbackCount - 1 do begin for i := 0 to CallbackCount - 1 do begin
if Callbacks[i] <> nil then if Callbacks[i] <> nil then
Callbacks[i](info); Callbacks[i](info);
@@ -185,6 +185,7 @@ var
begin begin
push_trace('driver.video.gpu.setMode'); push_trace('driver.video.gpu.setMode');
setMode := false; setMode := false;
if DriverCount = 0 then exit;
for i := 0 to DriverCount - 1 do begin for i := 0 to DriverCount - 1 do begin
if Drivers[i].Available and (Drivers[i].SetMode <> nil) then begin if Drivers[i].Available and (Drivers[i].SetMode <> nil) then begin
@@ -224,7 +225,4 @@ begin
activeDriverName := 'none'; activeDriverName := 'none';
end; end;
initialization
boot.mgr.registerBoot('driver.video.gpu', @init, 'GPU Driver Framework Initialization', 'driver.mgr');
end. end.
File diff suppressed because it is too large. Load diff
+20 -34
View File
@@ -22,8 +22,8 @@ unit driver.video;
interface interface
uses uses
boot.mgr, io.syslog, io.syslog,
memory.heap, debug.tracer, core.gfx.color, driver.video.types, core.ds.hashmap, core.util, arch.x86.util, core.gfx.texture, driver.video.gpu, core.gfx.fonts; memory.heap, debug.tracer, core.gfx.color, driver.video.types, core.ds.hashmap, core.util, arch.platform.cpu, core.gfx.texture, driver.video.gpu, core.gfx.fonts;
procedure init(); procedure init();
procedure DrawPixel(X : uint32; Y : uint32; Pixel : TRGB32); procedure DrawPixel(X : uint32; Y : uint32; Pixel : TRGB32);
@@ -31,7 +31,7 @@ procedure DrawLine(x1,y1,x2,y2 : uint32; thickness : uint32; Color : TRGB32);
procedure DrawRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Color : TRGB32); procedure DrawRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Color : TRGB32);
procedure FillRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Line_Color : TRGB32; Fill_Color : TRGB32); procedure FillRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Line_Color : TRGB32; Fill_Color : TRGB32);
procedure Flush(); procedure Flush();
procedure reinit(fb_addr, width, height, pitch : uint32; bpp : uint8); procedure reinit(fb_addr : PtrUInt; width, height, pitch : uint32; bpp : uint8);
function register(DriverIdentifier : pchar; EnableCallback : FEnableDriver) : boolean; function register(DriverIdentifier : pchar; EnableCallback : FEnableDriver) : boolean;
function enable(DriverIdentifier : pchar) : boolean; function enable(DriverIdentifier : pchar) : boolean;
@@ -42,12 +42,12 @@ function frontBufferBpp : uint8;
function backBufferWidth : uint32; function backBufferWidth : uint32;
function backBufferHeight : uint32; function backBufferHeight : uint32;
function backBufferBpp : uint8; function backBufferBpp : uint8;
function backBufferLocation : uint32; function backBufferLocation : PtrUInt;
function frontBufferLocation : uint32; function frontBufferLocation : PtrUInt;
Procedure basicFDrawTexture(Buffer : PVideoBuffer; X : uint32; Y : uint32; Texture : PTexture); Procedure basicFDrawTexture(Buffer : PVideoBuffer; X : uint32; Y : uint32; Texture : PTexture);
{ Text drawing — renders 8x16 bitmap font glyphs directly to the { Text drawing — renders 8x16 bitmap font glyphs directly to the
framebuffer via DrawPixel. Useful for panic screens and other framebuffer via DrawPixel. Useful for panic screens and other
contexts where LVGL is unavailable. } contexts where LVGL is unavailable. }
function DrawChar(X, Y : uint32; C : char; Color : TRGB32) : uint32; function DrawChar(X, Y : uint32; C : char; Color : TRGB32) : uint32;
@@ -58,8 +58,9 @@ function DrawInt(X, Y : uint32; Value : uint32; Color : TRGB32) : uint32;
implementation implementation
uses uses
driver.hid.mouse,
driver.video.vesa8, driver.video.vesa16, driver.video.vesa24, driver.video.vesa32, driver.video.vesa8, driver.video.vesa16, driver.video.vesa24, driver.video.vesa32,
driver.video.lvgl, driver.video.doublebuffer, driver.video.vesa; driver.video.doublebuffer;
Procedure dummyFDrawPixel(Buffer : PVideoBuffer; X : uint32; Y : uint32; Pixel : TRGB32); Procedure dummyFDrawPixel(Buffer : PVideoBuffer; X : uint32; Y : uint32; Pixel : TRGB32);
begin begin
@@ -206,7 +207,7 @@ var
DriverMap : PHashMap; DriverMap : PHashMap;
{ ============================================================ { ============================================================
GPU mode-change callback — reinits front/back buffers GPU mode-change callback — reinits front/back buffers
============================================================ } ============================================================ }
procedure videoModeChanged(const info : TGPUModeInfo); procedure videoModeChanged(const info : TGPUModeInfo);
begin begin
@@ -221,6 +222,7 @@ var
begin begin
debug.tracer.push_trace('driver.video.init.enter'); debug.tracer.push_trace('driver.video.init.enter');
io.syslog.logln('VIDEO', 'Initializing Base Video Driver.'); io.syslog.logln('VIDEO', 'Initializing Base Video Driver.');
driver.hid.mouse.setBounds(0, 0);
//Ensure the frontbuffer is empty & nil, ready for initialization by a driver. //Ensure the frontbuffer is empty & nil, ready for initialization by a driver.
VideoInterface.FrontBuffer.Initialized:= false; VideoInterface.FrontBuffer.Initialized:= false;
VideoInterface.FrontBuffer.Width:= 0; VideoInterface.FrontBuffer.Width:= 0;
@@ -255,23 +257,6 @@ begin
debug.tracer.push_trace('driver.video.init.exit'); debug.tracer.push_trace('driver.video.init.exit');
end; end;
procedure lateInit();
begin
driver.video.vesa.init(@driver.video.register);
driver.video.doublebuffer.init(@driver.video.register);
io.syslog.logln('VIDEO', 'VESA Enable.');
driver.video.enable('VESA');
io.syslog.logln('VIDEO', 'Double Buffer Enable.');
driver.video.enable('BASIC_DOUBLE_BUFFER');
{ Initialize LVGL early so the boot.splash screen can use it }
io.syslog.logln('VIDEO', 'LVGL: INIT BEGIN.');
lvgl_init(driver.video.frontBufferWidth, driver.video.frontBufferHeight);
io.syslog.logln('VIDEO', 'LVGL: INIT END.');
end;
function register(DriverIdentifier : pchar; EnableCallback : FEnableDriver) : boolean; function register(DriverIdentifier : pchar; EnableCallback : FEnableDriver) : boolean;
var var
Value : Void; Value : Void;
@@ -297,6 +282,7 @@ begin
Value:= core.ds.hashmap.get(DriverMap, DriverIdentifier); Value:= core.ds.hashmap.get(DriverMap, DriverIdentifier);
if (Value <> nil) then begin if (Value <> nil) then begin
enable:= FEnableDriver(Value)(@VideoInterface); enable:= FEnableDriver(Value)(@VideoInterface);
driver.hid.mouse.setBounds(frontBufferWidth, frontBufferHeight);
end; end;
debug.tracer.push_trace('driver.video.enable.exit'); debug.tracer.push_trace('driver.video.enable.exit');
end; end;
@@ -304,7 +290,9 @@ end;
procedure DrawPixel(X : uint32; Y : uint32; Pixel : TRGB32); procedure DrawPixel(X : uint32; Y : uint32; Pixel : TRGB32);
begin begin
//debug.tracer.push_trace('driver.video.DrawPixel.enter'); //debug.tracer.push_trace('driver.video.DrawPixel.enter');
VideoInterface.DrawRoutines.DrawPixel(VideoInterface.DefaultBuffer, X, Y, Pixel); if (X < VideoInterface.DefaultBuffer^.Width) and
(Y < VideoInterface.DefaultBuffer^.Height) then
VideoInterface.DrawRoutines.DrawPixel(VideoInterface.DefaultBuffer, X, Y, Pixel);
//debug.tracer.push_trace('driver.video.DrawPixel.exit'); //debug.tracer.push_trace('driver.video.DrawPixel.exit');
end; end;
@@ -360,18 +348,18 @@ begin
backBufferBpp:= VideoInterface.BackBuffer.BitsPerPixel; backBufferBpp:= VideoInterface.BackBuffer.BitsPerPixel;
end; end;
function backBufferLocation : uint32; function backBufferLocation : PtrUInt;
begin begin
backBufferLocation:= VideoInterface.BackBuffer.Location; backBufferLocation:= VideoInterface.BackBuffer.Location;
end; end;
function frontBufferLocation : uint32; function frontBufferLocation : PtrUInt;
begin begin
frontBufferLocation:= VideoInterface.FrontBuffer.Location; frontBufferLocation:= VideoInterface.FrontBuffer.Location;
end; end;
{ ============================================================ { ============================================================
Text drawing — 8x16 bitmap font via Std_Font Text drawing — 8x16 bitmap font via Std_Font
============================================================ } ============================================================ }
const const
@@ -445,7 +433,7 @@ begin
DrawInt := DrawString(X, Y, @buf[0], Color); DrawInt := DrawString(X, Y, @buf[0], Color);
end; end;
procedure reinit(fb_addr, width, height, pitch : uint32; bpp : uint8); procedure reinit(fb_addr : PtrUInt; width, height, pitch : uint32; bpp : uint8);
begin begin
debug.tracer.push_trace('driver.video.reinit.enter'); debug.tracer.push_trace('driver.video.reinit.enter');
{ Free old back buffer if allocated } { Free old back buffer if allocated }
@@ -468,8 +456,10 @@ begin
{ Set front buffer directly from GPU mode info } { Set front buffer directly from GPU mode info }
VideoInterface.FrontBuffer.Location := fb_addr; VideoInterface.FrontBuffer.Location := fb_addr;
VideoInterface.FrontBuffer.Pitch := pitch;
VideoInterface.FrontBuffer.Width := width; VideoInterface.FrontBuffer.Width := width;
VideoInterface.FrontBuffer.Height := height; VideoInterface.FrontBuffer.Height := height;
driver.hid.mouse.setBounds(width, height);
VideoInterface.FrontBuffer.BitsPerPixel := bpp; VideoInterface.FrontBuffer.BitsPerPixel := bpp;
if fb_addr <> 0 then if fb_addr <> 0 then
VideoInterface.FrontBuffer.Initialized := true; VideoInterface.FrontBuffer.Initialized := true;
@@ -488,8 +478,4 @@ begin
debug.tracer.push_trace('driver.video.reinit.exit'); debug.tracer.push_trace('driver.video.reinit.exit');
end; end;
initialization
boot.mgr.registerBoot('driver.video', @init, 'Video Driver Initialization', 'driver.video.gpu');
boot.mgr.registerBoot('driver.video_late', @lateInit, 'Video Driver Late Initialization', 'driver.video.*');
end. end.
Loaded 20 of 28 files, more files were not shown because too many files have changed in this diff. Show more