BLAM!
Posts: 13,506
Karma: 26047202
Join Date: Jun 2010
Location: Paris, France
Device: Kindle 2i, 3g, 4, 5w, PW, PW2, PW5; Kobo H2O, Forma, Elipsa, Sage, C2E
|
Just quickly tried something similar on sunxi in KOReader, and we're foiled by the fact that the wait ioctl sometimes returns early, which kinda defeats the purpose ;o).
Code:
diff --git a/ffi/framebuffer_sunxi.lua b/ffi/framebuffer_sunxi.lua
index dc4ddef7..70bbf605 100644
--- a/ffi/framebuffer_sunxi.lua
+++ b/ffi/framebuffer_sunxi.lua
@@ -160,7 +160,10 @@ local function disp_update(fb, ioc_cmd, ioc_data, is_flashing, waveform_mode, wa
end
-- Handle night mode shenanigans
+ local frontlight_dimmed = false
+ local powerd, fl_intensity
if fb.night_mode then
+ powerd = fb.device:getPowerDevice()
-- Enforce a nightmode-specific mode to limit ghosting, where appropriate (i.e., partial & flashes).
if fb:_isPartialWaveFormMode(waveform_mode) then
waveform_mode = fb:_getNightWaveFormMode()
@@ -190,6 +193,14 @@ local function disp_update(fb, ioc_cmd, ioc_data, is_flashing, waveform_mode, wa
-- Recap the actual details of the ioctl, vs. what UIManager asked for...
fb.debug(string.format("disp_update: %ux%u region @ (%u, %u) (WFM: %u [flash: %s])", w, h, x, y, waveform_mode, is_flashing))
+ -- Frontlight dimming in night mode
+ if fb.night_mode and is_flashing and powerd:isFrontlightOn() then
+ -- FIXME: Tweak is flashing to full-screen flashing...
+ fl_intensity = powerd:frontlightIntensity()
+ powerd:setIntensity(5)
+ frontlight_dimmed = true
+ end
+
if C.ioctl(fb.fd, ioc_cmd, ioc_data) == -1 then
local err = ffi.errno()
fb.debug("DISP_EINK_UPDATE2 ioctl failed:", ffi.string(C.strerror(err)))
@@ -208,6 +219,11 @@ local function disp_update(fb, ioc_cmd, ioc_data, is_flashing, waveform_mode, wa
end
-- And make sure we won't wait for it again, in case the next refresh trips one of our wait_for_* heuristics ;).
fb.dont_wait_for_marker = marker
+
+ if frontlight_dimmed then
+ -- NOTE: Foiled by the fact that the ioctl randomly returns early instead of its usual 450ms (which is a value that works decently well re: ft dimming).
+ powerd:setIntensity(fl_intensity)
+ end
end
end
Compare the expected 450ms of the DISP_EINK_WAIT_FRAME_SYNC_COMPLETE ioctls with the few that return in < 10ms...
Code:
21:26:18.269456 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_UPDATE2, {area={x_top=0, y_top=0, x_bottom=1403, y_bottom=1871}, layer_num=1, update_mode=EINK_NO_MERGE|EINK_GCK16_MODE, lyr_cfg2={info={mode=LAYER_MODE_BUFFER, zorder=0, alpha_mode=1, alpha_value=255, screen_win={x=0, y=0, width=1404, height=1872}, b_trd_out=0, out_trd_mode=DISP_3D_OUT_MODE_TB, fb={fd=0, y8_fd=4, size=[{width=1404, height=1872}, {width=0, height=0}, {width=0, height=0}], align=[0, 0, 0], format=DISP_FORMAT_8BIT_GRAY, color_space=DISP_GBR_F, trd_right_fd=0, pre_multiply=1, crop={x=0, y=0, width=1404 << 32, height=1872 << 32}, flags=DISP_BF_NORMAL, scan=DISP_SCAN_PROGRESSIVE, eotf=DISP_EOTF_GAMMA22, depth=0, fbd_en=0, metadata_fd=0, metadata_size=0, metadata_flag=0}, id=0, atw={used=0, mode=NORMAL_MODE, b_row=0, b_col=0, cof_fd=0}}, enable=1, channel=0, layer_id=1}, frame_id=[12811], rotate=270, cfa_use=0}) = 12811 <0.020400>
21:26:18.291170 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_WAIT_FRAME_SYNC_COMPLETE, 12811) = 0 <0.005869>
21:26:18.298376 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x14) = 0 <0.007617>
21:26:22.473411 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x5) = 0 <0.007985>
21:26:22.482924 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_UPDATE2, {area={x_top=0, y_top=0, x_bottom=1403, y_bottom=1871}, layer_num=1, update_mode=EINK_NO_MERGE|EINK_GCK16_MODE, lyr_cfg2={info={mode=LAYER_MODE_BUFFER, zorder=0, alpha_mode=1, alpha_value=255, screen_win={x=0, y=0, width=1404, height=1872}, b_trd_out=0, out_trd_mode=DISP_3D_OUT_MODE_TB, fb={fd=0, y8_fd=4, size=[{width=1404, height=1872}, {width=0, height=0}, {width=0, height=0}], align=[0, 0, 0], format=DISP_FORMAT_8BIT_GRAY, color_space=DISP_GBR_F, trd_right_fd=0, pre_multiply=1, crop={x=0, y=0, width=1404 << 32, height=1872 << 32}, flags=DISP_BF_NORMAL, scan=DISP_SCAN_PROGRESSIVE, eotf=DISP_EOTF_GAMMA22, depth=0, fbd_en=0, metadata_fd=0, metadata_size=0, metadata_flag=0}, id=0, atw={used=0, mode=NORMAL_MODE, b_row=0, b_col=0, cof_fd=0}}, enable=1, channel=0, layer_id=1}, frame_id=[12812], rotate=270, cfa_use=0}) = 12812 <0.020275>
21:26:22.504865 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_WAIT_FRAME_SYNC_COMPLETE, 12812) = 0 <0.453873>
21:26:22.962046 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x14) = 0 <0.009773>
21:26:25.090976 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x5) = 0 <0.007463>
21:26:25.099929 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_UPDATE2, {area={x_top=0, y_top=0, x_bottom=1403, y_bottom=1871}, layer_num=1, update_mode=EINK_NO_MERGE|EINK_GCK16_MODE, lyr_cfg2={info={mode=LAYER_MODE_BUFFER, zorder=0, alpha_mode=1, alpha_value=255, screen_win={x=0, y=0, width=1404, height=1872}, b_trd_out=0, out_trd_mode=DISP_3D_OUT_MODE_TB, fb={fd=0, y8_fd=4, size=[{width=1404, height=1872}, {width=0, height=0}, {width=0, height=0}], align=[0, 0, 0], format=DISP_FORMAT_8BIT_GRAY, color_space=DISP_GBR_F, trd_right_fd=0, pre_multiply=1, crop={x=0, y=0, width=1404 << 32, height=1872 << 32}, flags=DISP_BF_NORMAL, scan=DISP_SCAN_PROGRESSIVE, eotf=DISP_EOTF_GAMMA22, depth=0, fbd_en=0, metadata_fd=0, metadata_size=0, metadata_flag=0}, id=0, atw={used=0, mode=NORMAL_MODE, b_row=0, b_col=0, cof_fd=0}}, enable=1, channel=0, layer_id=1}, frame_id=[12813], rotate=270, cfa_use=0}) = 12813 <0.019464>
21:26:25.121765 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_WAIT_FRAME_SYNC_COMPLETE, 12813) = 0 <0.452931>
21:26:25.578245 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x14) = 0 <0.010160>
21:26:27.256054 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x5) = 0 <0.007777>
21:26:27.265314 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_UPDATE2, {area={x_top=0, y_top=0, x_bottom=1403, y_bottom=1871}, layer_num=1, update_mode=EINK_NO_MERGE|EINK_GCK16_MODE, lyr_cfg2={info={mode=LAYER_MODE_BUFFER, zorder=0, alpha_mode=1, alpha_value=255, screen_win={x=0, y=0, width=1404, height=1872}, b_trd_out=0, out_trd_mode=DISP_3D_OUT_MODE_TB, fb={fd=0, y8_fd=4, size=[{width=1404, height=1872}, {width=0, height=0}, {width=0, height=0}], align=[0, 0, 0], format=DISP_FORMAT_8BIT_GRAY, color_space=DISP_GBR_F, trd_right_fd=0, pre_multiply=1, crop={x=0, y=0, width=1404 << 32, height=1872 << 32}, flags=DISP_BF_NORMAL, scan=DISP_SCAN_PROGRESSIVE, eotf=DISP_EOTF_GAMMA22, depth=0, fbd_en=0, metadata_fd=0, metadata_size=0, metadata_flag=0}, id=0, atw={used=0, mode=NORMAL_MODE, b_row=0, b_col=0, cof_fd=0}}, enable=1, channel=0, layer_id=1}, frame_id=[12814], rotate=270, cfa_use=0}) = 12814 <0.020236>
21:26:27.286899 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_WAIT_FRAME_SYNC_COMPLETE, 12814) = 0 <0.451838>
21:26:27.742053 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x14) = 0 <0.009747>
21:26:29.276559 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x5) = 0 <0.007904>
21:26:29.285973 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_UPDATE2, {area={x_top=0, y_top=0, x_bottom=1403, y_bottom=1871}, layer_num=1, update_mode=EINK_NO_MERGE|EINK_GCK16_MODE, lyr_cfg2={info={mode=LAYER_MODE_BUFFER, zorder=0, alpha_mode=1, alpha_value=255, screen_win={x=0, y=0, width=1404, height=1872}, b_trd_out=0, out_trd_mode=DISP_3D_OUT_MODE_TB, fb={fd=0, y8_fd=4, size=[{width=1404, height=1872}, {width=0, height=0}, {width=0, height=0}], align=[0, 0, 0], format=DISP_FORMAT_8BIT_GRAY, color_space=DISP_GBR_F, trd_right_fd=0, pre_multiply=1, crop={x=0, y=0, width=1404 << 32, height=1872 << 32}, flags=DISP_BF_NORMAL, scan=DISP_SCAN_PROGRESSIVE, eotf=DISP_EOTF_GAMMA22, depth=0, fbd_en=0, metadata_fd=0, metadata_size=0, metadata_flag=0}, id=0, atw={used=0, mode=NORMAL_MODE, b_row=0, b_col=0, cof_fd=0}}, enable=1, channel=0, layer_id=1}, frame_id=[12815], rotate=270, cfa_use=0}) = 12815 <0.020731>
21:26:29.307987 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_WAIT_FRAME_SYNC_COMPLETE, 12815) = 0 <0.005734>
21:26:29.315093 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x14) = 0 <0.007443>
|