Page 1 of 1
Вопросы по устройству графической подсистемы.
Posted: Sun Mar 23, 2014 10:07 am
by Akyltist
Вопрос, что лежит конкретно в [CURRENT_TASK]? Понимаю что это текущий процесс, но как устроен этот dd
Code: Select all
OS_BASE equ 0x80000000
window_data equ (OS_BASE+0x0001000)
CURRENT_TASK equ (OS_BASE+0x0003000)
window._.sys_set_window
Code: Select all
mov eax, [CURRENT_TASK] ; грузим значение текущего процесса
shl eax, 5 ; зачем сдвиг при этом еще и на 5 ?
add eax, window_data ; прибавляем указатель на данные
Вероятно так мы добираемся до WDATA, но почему сдвиг на 5 и зачем. Где посмотреть, что пишется в CURRENT_TASK?
Re: Вопросы по устройству графической подсистемы.
Posted: Sun Mar 23, 2014 12:30 pm
by Serge
это номер слота активного потока.
Re: Вопросы по устройству графической подсистемы.
Posted: Sun Mar 23, 2014 12:42 pm
by Akyltist
Serge wrote:это номер слота активного потока.
это сам CURRENT_TASK
а сдвиг для чего?
Re: Вопросы по устройству графической подсистемы.
Posted: Sun Mar 23, 2014 1:53 pm
by art_zh
в структуре window_data на каждый слот отводится 32 байта.
сдвиг влево на 5 - это фактически умножение номера слота на 32.
Re: Вопросы по устройству графической подсистемы.
Posted: Sun Mar 23, 2014 2:11 pm
by Akyltist
art_zh wrote:в структуре window_data на каждый слот отводится 32 байта.
сдвиг влево на 5 - это фактически умножение номера слота на 32.
art_zh,
Serge спасибо, теперь дошло!
Re: Вопросы по устройству графической подсистемы.
Posted: Mon Mar 31, 2014 5:02 pm
by Akyltist
Я правильно понимаю, что при изменении положения окна, не происходит полной перерисовки буфера , начиная от фона и заканчивая верхним активным окном, а просто происходит перерисока того участка который подвергся изменению? Если так, то откуда окно берет данные, которые оно перекрывало, чтобы восстановить их? Из [_WinMapAddress] ???
Re: Вопросы по устройству графической подсистемы.
Posted: Mon Mar 31, 2014 5:27 pm
by Mario_r4
Akyltist wrote:Я правильно понимаю, что при изменении положения окна, не происходит полной перерисовки буфера , начиная от фона и заканчивая верхним активным окном, а просто происходит перерисока того участка который подвергся изменению? Если так, то откуда окно берет данные, которые оно перекрывало, чтобы восстановить их? Из [_WinMapAddress] ???
Сначала пересчитывается буфер перекрытия окон, а код перерисовки фона выводит тот участок, который надо восстановить. Всем процессам, окна которых попали хотя бы одним пикселем в активную зону отправляется событие перерисовки, которое обычно обрабатывает код главного цикла приложения.
Re: Вопросы по устройству графической подсистемы.
Posted: Mon Mar 31, 2014 5:45 pm
by Akyltist
Mario_r4 wrote:Akyltist wrote:Я правильно понимаю, что при изменении положения окна, не происходит полной перерисовки буфера , начиная от фона и заканчивая верхним активным окном, а просто происходит перерисока того участка который подвергся изменению? Если так, то откуда окно берет данные, которые оно перекрывало, чтобы восстановить их? Из [_WinMapAddress] ???
Сначала пересчитывается буфер перекрытия окон, а код перерисовки фона выводит тот участок, который надо восстановить. Всем процессам, окна которых попали хотя бы одним пикселем в активную зону отправляется событие перерисовки, которое обычно обрабатывает код главного цикла приложения.
системный фон по тому же принципу?
Re: Вопросы по устройству графической подсистемы.
Posted: Mon Mar 31, 2014 6:13 pm
by Mario_r4
Akyltist wrote:Mario_r4 wrote:Akyltist wrote:Я правильно понимаю, что при изменении положения окна, не происходит полной перерисовки буфера , начиная от фона и заканчивая верхним активным окном, а просто происходит перерисока того участка который подвергся изменению? Если так, то откуда окно берет данные, которые оно перекрывало, чтобы восстановить их? Из [_WinMapAddress] ???
Сначала пересчитывается буфер перекрытия окон, а код перерисовки фона выводит тот участок, который надо восстановить. Всем процессам, окна которых попали хотя бы одним пикселем в активную зону отправляется событие перерисовки, которое обычно обрабатывает код главного цикла приложения.
системный фон по тому же принципу?
Есть только одни фон - фон рабочего стола.
Re: Вопросы по устройству графической подсистемы.
Posted: Mon Mar 31, 2014 6:27 pm
by Akyltist
Mario_r4 wrote:Есть только одни фон - фон рабочего стола.
который тоже перерисовывается
полностью если его коснулись изменения?
Re: Вопросы по устройству графической подсистемы.
Posted: Mon Mar 31, 2014 9:07 pm
by Mario_r4
Akyltist wrote:Mario_r4 wrote:Есть только одни фон - фон рабочего стола.
который тоже перерисовывается
полностью если его коснулись изменения?
Нет, я же написал:
а код перерисовки фона выводит тот участок, который надо восстановить
Re: Вопросы по устройству графической подсистемы.
Posted: Mon Mar 31, 2014 9:49 pm
by Akyltist
Mario_r4 спасибо!
Re: Вопросы по устройству графической подсистемы.
Posted: Sun May 25, 2014 2:38 pm
by Akyltist
Вопрос такой, можно ли срезать вот такой код:
Code: Select all
align 4
;------------------------------------------------------------------------------
sys_button_activate_handler: ;/////////////////////////////////////////////////
;------------------------------------------------------------------------------
;? <description>
;------------------------------------------------------------------------------
;> eax = pack[8(process slot), 24(button id)]
;> ebx = pack[16(button x coord), 16(button y coord)]
;> cl = mouse button mask this system button was pressed with
;------------------------------------------------------------------------------
call button._.find_button
or eax, eax
jz .exit
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2]
call button._.negative_button
.exit:
ret
align 4
;------------------------------------------------------------------------------
sys_button_deactivate_handler: ;///////////////////////////////////////////////
;------------------------------------------------------------------------------
;? <description>
;------------------------------------------------------------------------------
;> eax = pack[8(process slot), 24(button id)]
;> ebx = pack[16(button x coord), 16(button y coord)]
;> cl = mouse button mask this system button was pressed with
;------------------------------------------------------------------------------
call button._.find_button
or eax, eax
jz .exit
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2]
call button._.negative_button
.exit:
ret
До:
Code: Select all
align 4
;------------------------------------------------------------------------------
sys_button_activate_handler: ;/////////////////////////////////////////////////
;------------------------------------------------------------------------------
;> eax = pack[8(process slot), 24(button id)]
;> ebx = pack[16(button x coord), 16(button y coord)]
;> cl = mouse button mask this system button was pressed with
;------------------------------------------------------------------------------
align 4 ; тоже вроде ни к чему
;------------------------------------------------------------------------------
sys_button_deactivate_handler: ;///////////////////////////////////////////////
;------------------------------------------------------------------------------
;? <description>
;------------------------------------------------------------------------------
;> eax = pack[8(process slot), 24(button id)]
;> ebx = pack[16(button x coord), 16(button y coord)]
;> cl = mouse button mask this system button was pressed with
;------------------------------------------------------------------------------
call button._.find_button
or eax, eax
jz .exit
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2]
call button._.negative_button
.exit:
ret
или не стоит?
PS: код из (root)/kernel/trunk/gui/button.inc
Re: Вопросы по устройству графической подсистемы.
Posted: Sun May 25, 2014 7:51 pm
by Mario_r4
Akyltist wrote:или не стоит?
PS: код из (root)/kernel/trunk/gui/button.inc
Не стоит. Рекомендую самому подумать почему не стоит, раз уж возникла идея такой копеечной оптимизации.