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
Не стоит. Рекомендую самому подумать почему не стоит, раз уж возникла идея такой копеечной оптимизации.