Compare commits

..
Author SHA1 Message Date
Vincent Wei 4ae46a4b94 update 2025-05-27 15:53:44 +08:00
xueshuming 2791dc99ef Init Order: call 'mg_InitTimer' before call 'SystemThreads' 2025-05-27 15:45:03 +08:00
Vincent Wei b7525f3001 fix a bug: MSG_TIMEOUT for desktop thread was not fired correctly 2025-05-27 14:45:53 +08:00
Vincent Wei 4c55f2eac3 use sem_timedwait in the idle handler for desktop threads 2025-05-27 11:08:55 +08:00
Vincent Wei 3ad600d1bf Merge branch 'rel-5-0' 2025-05-09 14:02:57 +08:00
Vincent Wei 3c233a4164 update version to 5.0.15 2025-05-09 13:59:17 +08:00
xueshuming 0abaeef4c7 impl : __mg_save_png 2024-02-20 19:28:14 +08:00
Vincent Wei c2779cbf09 implement a new API: TestIfSharedSurfaceChanged() 2023-09-26 10:52:09 +08:00
Vincent Wei e118805eef fix a bug of GetUpdateRect: intersect bouding rectangle of invalid region with client rect 2023-09-16 15:43:07 +08:00
Vincent Wei 7513d461bf remove code about semaphhore for shared surface 2023-09-08 18:14:20 +08:00
Vincent Wei b131f00a79 fix compiling errors for MiniGUI-Standalone runmode 2023-09-04 10:45:05 +08:00
Vincent Wei 649fbf571e change copyright year 2023-09-01 16:07:56 +08:00
Vincent Wei e38fd05cb4 debug: use fcntl() instead of flock() 2023-09-01 16:03:50 +08:00
Vincent Wei ce53f2c703 use MSG_WINCOMPOSITED to reset the dirty information of a shared surface of a window 2023-09-01 12:25:04 +08:00
Vincent Wei fbebc94718 use GAL_RefSurface() in CreateMemDCFromSurface() 2023-09-01 10:01:11 +08:00
Vincent Wei b4ce6f9f10 helpers for locking/unlocking a file 2023-09-01 08:36:08 +08:00
Vincent Wei c04dde31e5 use flock() instead of semaphore for shared surfaces 2023-09-01 08:35:32 +08:00
Vincent Wei 5a2b425012 debug 2023-08-31 17:00:50 +08:00
Vincent Wei fa18025350 debug APIs for shared surfaces 2023-08-31 16:02:06 +08:00
Vincent Wei 890ab1db44 debug 2023-08-30 15:40:13 +08:00
Vincent Wei 3d963b3d25 Extend JoinLayer() to JoinLayerEx() to return the client identifier; Add a new API GetClientId() 2023-08-30 12:23:26 +08:00
Vincent Wei 29ac6a4277 initial implementation of new APIs of shared surface: AttachToSharedSurface(), GetSharedSurfaceInfo(), LockSharedSurfaceIfDirty(), UnlockSharedSurface(), and DetachFromSharedSurface() 2023-08-29 16:21:49 +08:00
Vincent Wei 96ecf5e9b7 Tune layout of struct _SharedSurfaceHeader; Change interface of GetWindowSharedSurfaceFD() 2023-08-29 12:50:58 +08:00
Vincent Wei 50aafa3faa initial implementation of CreateSharedSurface(), DestroySharedSurface(), GetSharedSurfaceFDByClientWindow(), and GetSharedSurfaceFDByName() 2023-08-29 12:12:51 +08:00
Vincent Wei d06ce0683b call __mg_nssurf_map_delete() in server_ServerCleanup 2023-08-28 20:12:50 +08:00
Vincent Wei 5a9b08fe94 initial implementation for named shared surface 2023-08-28 16:51:46 +08:00
Vincent Wei c7569e9d32 add default options to fbcon section in MiniGUI.cfg 2023-08-28 11:25:57 +08:00
Vincent Wei 06fcf2eaa0 New APIs: GetWindowSurfaceBufferFD() and CreateMemDCFromSurfaceBufferFD() for compositing schema. 2023-08-22 11:29:36 +08:00
Vincent Wei 33e5d62da8 Merge remote-tracking branch 'origin/rel-5-0' into drm-dma 2023-08-21 10:19:14 +08:00
Vincent Wei cf3340c01d update 2023-08-02 15:29:00 +08:00
Vincent Wei 950f73716a use libsuffix to define the library suffix; use processes-compositing style for runmode 2023-08-02 15:08:45 +08:00
Vincent Wei 295c993d50 make Runmode in pc file as a variable in order that we can use pkg_get_variable() in cmake files to determinate the runtime mode of MiniGUI. 2023-08-02 14:39:23 +08:00
Vincent Wei 95ab7dad2a fix a bug and call sem_wait within retry_syscall_for_eintr() 2023-08-01 19:13:49 +08:00
Vincent Wei 3d42f72e21 debug 2023-08-01 18:00:41 +08:00
Vincent Wei 59d9d08158 debug 2023-08-01 17:55:34 +08:00
Vincent Wei 3a9cbfdd9b initialize last_x and last_y 2023-08-01 16:55:11 +08:00
Vincent Wei bc7d5f6ce0 fix a compositing bug when the wallpaper is empty 2023-08-01 16:33:27 +08:00
Vincent Wei 1131973f7a Fix a bug in PeekMessageEx 2023-08-01 16:14:12 +08:00
Vincent Wei a46804080e Fix a bug in PeekMessageEx 2023-08-01 16:12:31 +08:00
Vincent Wei 81b25968ca do not return ARCH_TYPE_BASIC_VOWEL for Arabic chars 2023-08-01 15:57:27 +08:00
Vincent Wei f1463f41de fix some compilation errors 2023-08-01 14:54:09 +08:00
Vincent Wei 0a10b81499 Merge branch 'rel-5-0' into drm-dma 2023-08-01 14:22:39 +08:00
Vincent Wei fd07118939 enhance fbcon engine to support async updater; tune internal interface shadowScreen_BlitToReal() 2023-08-01 11:33:30 +08:00
Vincent Wei a0a757a621 tune DRM engine for procs runmode and compositing schema 2023-08-01 10:03:19 +08:00
Vincent Wei 7cd7f954c6 make virtual-window enabled by default 2023-08-01 10:02:49 +08:00
Vincent Wei e673452b7d debug 2023-07-31 10:15:14 +08:00
Vincent Wei e24490e92f debug 2023-07-30 12:17:02 +08:00
Vincent Wei 0c2345aed1 change method flush_driver to flush of DrmDriverOps; change member buff to vaddr of DrmSurfaceBuffer 2023-07-30 11:57:02 +08:00
Vincent Wei 95b9def0d5 rename dma_buff to dma_buf 2023-07-28 21:20:18 +08:00
Vincent Wei 563fe9232c remove methods OnBeforeUpdate and OnAfterUpdate 2023-07-28 21:08:44 +08:00
Vincent Wei 5ad525c1d8 fix a bug 2023-07-27 10:58:58 +08:00
Vincent Wei fcde9eb405 Add OnBeforeUpdate() and OnAfterUpdate() operations for Shadow engine 2023-07-27 10:46:58 +08:00
Vincent Wei 39d03be6d7 use DMA_BUF_IOCTL_SYNC 2023-07-27 10:04:53 +08:00
Vincent Wei bce5b73e1c call pthread_testcancel() in task_do_update 2023-07-25 10:58:27 +08:00
Vincent Wei 0b4a5a1c17 tune 2023-07-25 10:43:20 +08:00
Vincent Wei c609e2e5b1 check number of pixels before calling hardware accecelation operations 2023-07-24 09:56:10 +08:00
Vincent Wei f6bf02aa5c add new operation do_blit in DrmDriverOps; use do_blit instead of returning callback of check_blit 2023-07-24 08:22:10 +08:00
Vincent Wei d52aa4c1a4 do cleanup for free surfaces 2023-07-23 16:03:08 +08:00
Vincent Wei d6a961aa6c enhance GAL_blit to have a pointer to GAL_VideoDevice for hardware acceleration blits 2023-07-23 15:05:54 +08:00
Vincent Wei 2665200eee add new runtime configuration option: min_pixels_using_hwaccl 2023-07-23 13:02:45 +08:00
Vincent Wei 469eb1c05a use hardware accelerated copy_buff 2023-07-23 12:45:24 +08:00
Vincent Wei 6a83f2efbf Remove SetHWColorKey, SetHWAlpha; Tune prototype of FillHWRect; Add CopyHWSurface() 2023-07-23 12:01:18 +08:00
Vincent Wei 6422cb8568 tune 2023-07-22 20:27:52 +08:00
Vincent Wei 6be4b719c8 If FillHWRect() retruns non-zero, use GAL_SoftFillRect() 2023-07-22 19:02:41 +08:00
Vincent Wei 0f566d0342 tune DRM_SURBUF_TYPE 2023-07-22 17:28:20 +08:00
Vincent Wei 1de19f9bee Upgrade DrmDriverOps to version 2 and enhance ChechHWBlit 2023-07-22 16:15:09 +08:00
Vincent Wei 5f8a88c0a2 check euid when creating update thread 2023-07-21 11:52:52 +08:00
Vincent Wei 1611a56754 tune 2023-07-21 11:20:30 +08:00
Vincent Wei 73fcb8d2c3 tune shadow and drm video engines to show FPS 2023-07-21 10:40:31 +08:00
Vincent Wei bc0efac21f cleanup 2023-07-14 18:56:50 +08:00
xueshuming 26341b162e debug 2023-07-14 17:06:54 +08:00
Vincent Wei c6957bec23 debug 2023-07-14 16:32:16 +08:00
Vincent Wei 56ddd87189 debug 2023-07-14 14:38:47 +08:00
Vincent Wei 5cdd258046 use WaitVBlank 2023-07-14 14:06:28 +08:00
Vincent Wei 8b4ab267b6 and an alternative to use semphaore 2023-07-14 13:11:30 +08:00
Vincent Wei 613a19c236 debug: call pthread_mutex_init for update_lock 2023-07-14 12:54:58 +08:00
Vincent Wei e242cbe32f handle all implementations of kernel_ShowCursorForGDI 2023-07-14 11:19:04 +08:00
Vincent Wei 5f921a2908 cleanup 2023-07-14 10:20:34 +08:00
Vincent Wei 39493ef4dc implement LockHWSurface for shadow and drm engines due to the async. updates to real screen 2023-07-14 10:14:23 +08:00
Vincent Wei fef311f0b2 use async. update for shadow engine 2023-07-13 18:37:56 +08:00
Vincent Wei e98aeab8dc debug and tue 2023-07-13 16:37:12 +08:00
Vincent Wei 2ff96ba383 debug and cleanup 2023-07-13 12:21:28 +08:00
Vincent Wei 03d90aec9f debug 2023-07-12 22:29:14 +08:00
Vincent Wei 57293a2896 debug 2023-07-12 22:05:22 +08:00
Vincent Wei cfd3311f86 use drmWaitVBlank 2023-07-12 21:35:32 +08:00
Vincent Wei 51b09bc2ed tune 2023-07-12 20:09:07 +08:00
Vincent Wei ff54c6ffe5 debug 2023-07-12 16:41:54 +08:00
Vincent Wei 4c836603c1 tune DRM_SyncUpdate 2023-07-12 15:09:08 +08:00
Vincent Wei 311d2262d6 some tries 2023-07-11 22:17:59 +08:00
Vincent Wei 209a0c6ab0 initial support for drmDMA 2023-07-11 16:59:21 +08:00
107 changed files with 4298 additions and 3469 deletions
+21 -17
View File
@@ -72,7 +72,7 @@ It greatly reduces the size and resource consumption of the entire solution, imp
[HybridOS] is another large open source project initiated by FMSoft. [HybridOS] is another large open source project initiated by FMSoft.
It is an open source operating system designed for embedded/AIoT devices and cloud computing environment. It is an open source operating system designed for embedded/AIoT devices and cloud computing environment.
HybridOS provides the complete software stack and the app framework based on HVML for embedded systems. HybridOS provides the complete software stack and the app framework based on [HVML] for embedded systems.
You can easily develop your products which has rich functions and excellent expressiveness by using HybridOS. You can easily develop your products which has rich functions and excellent expressiveness by using HybridOS.
In practice, MiniGUI and the software which are used to integrated with GPU constitute the graphics stack of HybridOS. In practice, MiniGUI and the software which are used to integrated with GPU constitute the graphics stack of HybridOS.
@@ -85,13 +85,13 @@ The following chart shows the graphics stack of HybridOS:
----------------------------------------------- -----------------------------------------------
| MiniGUI/HVML Apps | | MiniGUI/HVML Apps |
|-----------------------------------------------| |-----------------------------------------------|
| | (Graphics Stack) | | | (Graphics Stack) |
| | ---------------------| | | --------------------|
| | | hiMesa | | | | Mesa-HBD |
| | hiCairo | ------------------| | | Cairo-HBD | ------------------|
| | MiniGUI | | EGL for MiniGUI | | | MiniGUI | | EGL for MiniGUI |
| C++ libs | hiDRMDrivers | | GL, GLES, VG | | C++ libs | HBDDRMDrivers | | GL, GLES, VG |
| C libs | libDRM | | GPU drivers | | C libs | libDRM | | GPU drivers |
|-----------------------------------------------| |-----------------------------------------------|
| Linux Kernel | | Linux Kernel |
| -----------------------------------| | -----------------------------------|
@@ -102,10 +102,10 @@ The following chart shows the graphics stack of HybridOS:
As shown in the chart above, the HybridOS graphics stack consists of the following software: As shown in the chart above, the HybridOS graphics stack consists of the following software:
- `libDRM` provides some user land APIs for Linux Direct Rendering Infrastructure. - `libDRM` provides some user land APIs for Linux Direct Rendering Infrastructure.
- `hiDRMDrivers` contains the drivers (user land drivers, not kernel drivers) for - `HBDDRMDrivers` contains the drivers (user land drivers, not kernel drivers) for
MiniGUI DRM engine. The drivers implement the basic hardware accelerated MiniGUI DRM engine. The drivers implement the basic hardware accelerated
2D graphics operations of various GPUs for MiniGUI. 2D graphics operations of various GPUs for MiniGUI.
- `hiMesa` is the Mesa derivative for HybridOS, while Mesa is the open source - `Mesa-HBD` is the Mesa derivative for HybridOS, while Mesa is the open source
implementation of OpenGL and other graphics APIs, including OpenGL ES implementation of OpenGL and other graphics APIs, including OpenGL ES
(versions 1, 2, 3), OpenCL, OpenMAX, and Vulkan. It contains the following (versions 1, 2, 3), OpenCL, OpenMAX, and Vulkan. It contains the following
components: components:
@@ -113,13 +113,17 @@ As shown in the chart above, the HybridOS graphics stack consists of the followi
graphics APIs. graphics APIs.
+ The EGL implementation for MiniGUI platform. + The EGL implementation for MiniGUI platform.
+ The graphics drivers for various GPUs and a software driver called `swrast`. + The graphics drivers for various GPUs and a software driver called `swrast`.
- `hiCairo` is the Cairo derivative for HybridOS. Cairo is a 2D vector graphics - `Cairo-HBD` is the Cairo derivative for HybridOS. Cairo is a 2D vector graphics
library for Gtk. We provide support for MiniGUI backend in `hiCairo`. library for Gtk. We provide support for MiniGUI backend in `hiCairo`.
For more information about HybridOS, please refer to: For more information about HybridOS, please refer to:
<https://hybridos.fmsoft.cn/> <https://hybridos.fmsoft.cn/>
For more information about HVML, please refer to:
<https://hvml.fmsoft.cn/> or <https://www.hvml.org>
### Source Code Repositories ### Source Code Repositories
FMSoft had created the public repositories for MiniGUI Core, MiniGUI FMSoft had created the public repositories for MiniGUI Core, MiniGUI
@@ -456,7 +460,7 @@ for examples:
## HISTORY ## HISTORY
21 years have pasted since MiniGUI was initially created at 27 years have pasted since MiniGUI was initially created at
the end of 1998, and now it becomes much reliable and stable. the end of 1998, and now it becomes much reliable and stable.
During the past years, many remarkable changes have taken place in During the past years, many remarkable changes have taken place in
the MiniGUI project. the MiniGUI project.
@@ -562,13 +566,14 @@ A brief history description of the development progress is listed as follow:
1. Jan., 2022: FMSoft released MiniGUI version 5.0.9. 1. Jan., 2022: FMSoft released MiniGUI version 5.0.9.
1. Sep., 2022: FMSoft released MiniGUI version 5.0.10. 1. Sep., 2022: FMSoft released MiniGUI version 5.0.10.
1. Aug., 2023: FMSoft released MiniGUI version 5.0.13. 1. Aug., 2023: FMSoft released MiniGUI version 5.0.13.
1. May., 2025: FMSoft released MiniGUI version 5.0.15.
## AUTHORS AND COPYING ## AUTHORS AND COPYING
The original author of MiniGUI is Vincent Wei, and now MiniGUI is maintained by FMSoft. The original author of MiniGUI is Vincent Wei, and now MiniGUI is maintained by FMSoft.
For more information, please refer to <http://www.fmsoft.cn>. For more information, please refer to <http://www.fmsoft.cn>.
Copyright (C) 2002 ~ 2022, Beijing FMSoft Technologies Co., Ltd. Copyright (C) 2002 ~ 2025, Beijing FMSoft Technologies Co., Ltd.
Copyright (C) 1998 ~ 2002, Vincent Wei Copyright (C) 1998 ~ 2002, Vincent Wei
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -646,13 +651,12 @@ A: Yes, FMSoft can provide you with guaranteed commercial technical
[FMSoft Technologies]: https://www.fmsoft.cn [FMSoft Technologies]: https://www.fmsoft.cn
[FMSoft]: https://www.fmsoft.cn [FMSoft]: https://www.fmsoft.cn
[HybridOS Official Site]: https://hybridos.fmsoft.cn [HybridOS Official Site]: https://hybridos.fmsoft.cn
[MiniGUI Official Site]: https://hvml.fmsoft.cn [MiniGUI Official Site]: https://minigui.fmsoft.cn
[HVML Official Site]: https://hvml.fmsoft.cn [HVML Official Site]: https://hvml.fmsoft.cn
[Vincent Wei]: https://github.com/VincentWei [Vincent Wei]: https://github.com/VincentWei
[MiniGUI]: https://github.com/VincentWei/MiniGUI [MiniGUI]: https://github.com/VincentWei
[HybridOS]: https://github.com/FMSoftCN/HybridOS [HybridOS]: https://github.com/HybridOS2
[HVML]: https://github.com/HVML [HVML]: https://github.com/HVML
[PurC]: https://github.com/HVML/PurC [PurC]: https://github.com/HVML/PurC
[xGUI Pro]: https://github.com/HVML/xGUI-Pro [xGUI Pro]: https://github.com/HVML/xGUI-Pro
+14
View File
@@ -1,5 +1,7 @@
# Release Notes # Release Notes
- [Version 5.0.15](#version-5015)
+ [What's new in version 5.0.15](#whats-new-in-version-5015)
- [Version 5.0.13](#version-5013) - [Version 5.0.13](#version-5013)
+ [What's new in version 5.0.13](#whats-new-in-version-5013) + [What's new in version 5.0.13](#whats-new-in-version-5013)
- [Version 5.0.12](#version-5012) - [Version 5.0.12](#version-5012)
@@ -32,6 +34,18 @@
+ [Changes leading to incompatibility](#changes-leading-to-incompatibility) + [Changes leading to incompatibility](#changes-leading-to-incompatibility)
+ [Deprecated APIs](#deprecated-apis) + [Deprecated APIs](#deprecated-apis)
## Version 5.0.15
On May 09, 2025, FMSoft announces the availability of MiniGUI 5.0.15,
which is an enhancement release with some minor enhancements
of MiniGUI 5.0.x.
* ENHANCEMENTS:
- Optimize NEWGAL engines: `shadow`, `drm`, and `fbcon` for large resolution.
- New APIs: `GetWindowSharedSurfaceFD()` and `CreateMemDCFromSharedSurfaceFD()` for compositing schema.
* CHANGES:
- The operations for DRM userland driver changed.
## Version 5.0.13 ## Version 5.0.13
On Aug. 31, 2023, FMSoft announces the availability of MiniGUI 5.0.13, On Aug. 31, 2023, FMSoft announces the availability of MiniGUI 5.0.13,
+1 -1
View File
@@ -1,4 +1,4 @@
Version 5.0.13 (2023/08/31) Version 5.0.15 (2025/05/09)
This is a minor enhancement and bugfix release of MiniGUI 5.0.x, the stable version. This is a minor enhancement and bugfix release of MiniGUI 5.0.x, the stable version.
+11 -10
View File
@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.60) AC_PREREQ(2.60)
AC_INIT(libminigui, 5.0.13) AC_INIT(libminigui, 5.0.15)
AC_CONFIG_SRCDIR(src/main/main.c) AC_CONFIG_SRCDIR(src/main/main.c)
dnl Set various version strings - taken gratefully from the SDL sources dnl Set various version strings - taken gratefully from the SDL sources
@@ -16,9 +16,9 @@ dnl Set various version strings - taken gratefully from the SDL sources
# #
MINIGUI_MAJOR_VERSION=5 MINIGUI_MAJOR_VERSION=5
MINIGUI_MINOR_VERSION=0 MINIGUI_MINOR_VERSION=0
MINIGUI_MICRO_VERSION=13 MINIGUI_MICRO_VERSION=15
MINIGUI_INTERFACE_AGE=1 MINIGUI_INTERFACE_AGE=0
MINIGUI_BINARY_AGE=3 MINIGUI_BINARY_AGE=0
MINIGUI_VERSION=$MINIGUI_MAJOR_VERSION.$MINIGUI_MINOR_VERSION.$MINIGUI_MICRO_VERSION MINIGUI_VERSION=$MINIGUI_MAJOR_VERSION.$MINIGUI_MINOR_VERSION.$MINIGUI_MICRO_VERSION
AC_SUBST(MINIGUI_MAJOR_VERSION) AC_SUBST(MINIGUI_MAJOR_VERSION)
@@ -62,7 +62,7 @@ dnl ========================================================================
dnl Checks for header files. dnl Checks for header files.
AC_HEADER_STDC AC_HEADER_STDC
AC_HEADER_DIRENT AC_HEADER_DIRENT
AC_CHECK_HEADERS(limits.h math.h locale.h unistd.h termio.h sys/types.h sys/time.h sys/select.h sys/memfd.h) AC_CHECK_HEADERS(limits.h math.h stdatomic.h locale.h unistd.h termio.h sys/types.h sys/time.h sys/select.h sys/memfd.h)
dnl Checks for typedefs, structures, and compiler characteristics. dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST AC_C_CONST
@@ -95,7 +95,7 @@ message_string="no"
osname="unspecified" osname="unspecified"
runtime_mode="procs" runtime_mode="procs"
compositing_schema="yes" compositing_schema="yes"
virtual_window="no" virtual_window="yes"
use_shmopen="no" use_shmopen="no"
mgslice_use_fallback="no" mgslice_use_fallback="no"
@@ -1704,12 +1704,12 @@ fi
CPPFLAGS="$CPPFLAGS -D__MINIGUI_LIB__" CPPFLAGS="$CPPFLAGS -D__MINIGUI_LIB__"
surface_schema="shared frame buffer" surface_schema="shared"
case "$runtime_mode" in case "$runtime_mode" in
sa) sa)
AC_DEFINE(_MGRM_STANDALONE, 1, AC_DEFINE(_MGRM_STANDALONE, 1,
[Define if build MiniGUI-Standalone]) [Define if build MiniGUI-Standalone])
MINIGUI_RUNMODE="sa" MINIGUI_RUNMODE="standalone"
RUNMODE_LADD="standalone/libstandalone.la" RUNMODE_LADD="standalone/libstandalone.la"
RUNMODE_SUBDIRS="standalone" RUNMODE_SUBDIRS="standalone"
;; ;;
@@ -1717,13 +1717,13 @@ case "$runtime_mode" in
AC_DEFINE(_MGRM_THREADS, 1, AC_DEFINE(_MGRM_THREADS, 1,
[Define if build MiniGUI-Threads]) [Define if build MiniGUI-Threads])
CPPFLAGS="$CPPFLAGS -D_REENTRANT" CPPFLAGS="$CPPFLAGS -D_REENTRANT"
MINIGUI_RUNMODE="ths" MINIGUI_RUNMODE="threads"
virtual_window="yes" virtual_window="yes"
;; ;;
*) *)
AC_DEFINE(_MGRM_PROCESSES, 1, AC_DEFINE(_MGRM_PROCESSES, 1,
[Define if build MiniGUI-Processes]) [Define if build MiniGUI-Processes])
MINIGUI_RUNMODE="procs" MINIGUI_RUNMODE="processes"
RUNMODE_LADD="server/libserver.la client/libclient.la" RUNMODE_LADD="server/libserver.la client/libclient.la"
RUNMODE_SUBDIRS="server client" RUNMODE_SUBDIRS="server client"
if test "x$compositing_schema" = "xyes"; then if test "x$compositing_schema" = "xyes"; then
@@ -2664,6 +2664,7 @@ if test "x$no_math" = "xno"; then
fi fi
DEP_LIBS="$DEP_LIBS -lpthread" DEP_LIBS="$DEP_LIBS -lpthread"
MINIGUI_RUNMODE="$MINIGUI_RUNMODE-${surface_schema}"
AC_SUBST(VIDEO_SUBDIRS) AC_SUBST(VIDEO_SUBDIRS)
AC_SUBST(VIDEO_DRIVERS) AC_SUBST(VIDEO_DRIVERS)
+53 -8
View File
@@ -55,6 +55,36 @@ wallpaper_pattern_size=full
# def_compositor_so= # def_compositor_so=
#}} #}}
#{{ifdef _MGGAL_SHADOW
[shadow]
real_engine=pc_xvfb
defaultmode=800x600-16bpp
# `cw`: rotating screen clock-wise.
# `ccw`: rotating screen counter clock-wise.
# `hflip`: flipping screen horizontally.
# `vflip`: flipping screen vertically.
rotate_screen=ccw
# Whether the async. update is enabled.
# Use `true` or `yes` for enabled, anything else for disabled.
# Since 5.0.13.
async_update=yes
# The synchronization interval for the asyn. updater (milli-seconds).
# This setting is only valid when `async_update` is enabled and
# the real engine does not provide WaitWBlank method.
# Since 5.0.13.
update_interval=15
# The minimal pixels to use the hardware accelerator.
# If the number of pixels to copy is less than this value,
# MiniGUI will use the software copy routine to update the real screen,
# even if the real device provides a hardware accelerator.
# Since 5.0.13.
min_pixels_using_hwaccl=4096
#}}
#{{ifdef _MGGAL_DRM #{{ifdef _MGGAL_DRM
[drm] [drm]
defaultmode=1024x768-32bpp defaultmode=1024x768-32bpp
@@ -78,9 +108,21 @@ dpi=96
# Since 5.0.0. # Since 5.0.0.
double_buffering=true double_buffering=true
# The update interval for the asyn. updater (milli-seconds).
# This setting is only valid when drmWaitVBlank doesn't work correctly.
# Since 5.0.13.
update_interval=15
# The minimal pixels to use the hardware accelerator.
# If the number of pixels to copy is less than this value,
# MiniGUI will use the software copy routine to update the real screen,
# even if the device provides a hardware accelerator.
# Since 5.0.13.
min_pixels_using_hwaccl=4096
# The filename of the shared library for the external driver. # The filename of the shared library for the external driver.
# The equivalent environment variable: MG_GAL_DRM_DRIVER # The equivalent environment variable: MG_GAL_DRM_DRIVER
exdriver=libhidrmdrivers-0.2.so.0 exdriver=libdrmdrivers.so
#}} #}}
#{{ifdef _MGIAL_SINGLETOUCHKEY #{{ifdef _MGIAL_SINGLETOUCHKEY
@@ -111,6 +153,16 @@ dpi=96
# Note that under compositing schema, double buffering is always enabled. # Note that under compositing schema, double buffering is always enabled.
# Since 5.0.10. # Since 5.0.10.
double_buffering=true double_buffering=true
# Whether the async. update is enabled.
# Use `true` or `yes` for enabled, anything else for disabled.
# Since 5.0.13.
async_update=yes
# The update interval for the asyn. updater (milli-seconds).
# This setting is only valid when drmWaitVBlank doesn't work correctly.
# Since 5.0.13.
update_interval=15
#}} #}}
#{{ifdef _MGGAL_PCXVFB #{{ifdef _MGGAL_PCXVFB
@@ -123,13 +175,6 @@ exec_file=/usr/local/bin/gvfb
[rtos_xvfb] [rtos_xvfb]
defaultmode=800x600-16bpp defaultmode=800x600-16bpp
#{{ifdef _MGGAL_SHADOW
[shadow]
real_engine=pc_xvfb
defaultmode=800x600-16bpp
rotate_screen=ccw
#}}
#{{ifdef _MGGAL_MLSHADOW #{{ifdef _MGGAL_MLSHADOW
[mlshadow] [mlshadow]
real_engine=qvfb real_engine=qvfb
+3
View File
@@ -268,6 +268,8 @@ MGUI_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);
#define MG_UNLIKELY(expr) (expr) #define MG_UNLIKELY(expr) (expr)
#endif #endif
#define HAVE(FEATURE) (defined HAVE_##FEATURE && HAVE_##FEATURE)
/** /**
* \defgroup endian_info Endianness information * \defgroup endian_info Endianness information
* @{ * @{
@@ -2347,6 +2349,7 @@ int init_minigui_printf (int (*output_char) (int ch),
#define _ERR_PRINTF(fmt, ...) \ #define _ERR_PRINTF(fmt, ...) \
do { \ do { \
TCS_RED (stderr); \ TCS_RED (stderr); \
fprintf (stderr, "%s: ", __FUNCTION__); \
fprintf (stderr, fmt, ##__VA_ARGS__); \ fprintf (stderr, fmt, ##__VA_ARGS__); \
TCS_NONE (stderr); \ TCS_NONE (stderr); \
} while (0) } while (0)
+57 -77
View File
File diff suppressed because it is too large Load Diff
+360 -30
View File
File diff suppressed because it is too large Load Diff
+85 -4
View File
@@ -456,6 +456,45 @@ MG_EXPORT void GUIAPI MiniGUIPanic (int exitcode);
* @{ * @{
*/ */
/**
* \fn GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
const char* client_name,
int max_nr_highers, int max_nr_normals, int *cli_id)
* \brief Joins to a layer and returns the client identifier if success.
*
* This function should be called by clients before calling any other MiniGUI
* functions. You can call \a GetLayerInfo to get the layer information.
* If the layer to be joined does not exist, the server, i.e. \a mginit, will
* try to create a new one. If you passed a NULL pointer or a null string for
* \a layer_name, the client will join to the default layer.
*
* If the client want to create a new layer, you should specify the maximal
* number of z-nodes in the higher level (max_nr_highers) and the maximal
* number of z-nodes in the normal level (max_nr_normals) of the new layer.
* Passing zero to \a max_nr_highers and max_nr_normals will use the default
* values, and the default values are specified by ServerStartup.
*
* Note that the server will create a default layer named "mginit".
*
* \param layer_name The name of the layer. You can use NAME_TOPMOST_LAYER to
* specify the current topmost layer.
* \param client_name The name of the client.
* \param max_nr_highers The maximal number of z-nodes in the higher level of
* the new layer.
* \param max_nr_normals The maximal number of z-nodes in the normal level of
* the new layer.
* \param cli_id The pointer to a buffer of int to return the client identifier.
*
* \return The handle to the layer on success, INV_LAYER_HANDLE on error.
*
* \note Only call this function in clients of MiniGUI-Processes.
*
* \sa GetLayerInfo, ServerStartup, ServerCreateLayer
*/
MG_EXPORT GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
const char* client_name,
int max_nr_highers, int max_nr_normals, int *cli_id);
/** /**
* \fn GHANDLE GUIAPI JoinLayer (const char* layer_name, * \fn GHANDLE GUIAPI JoinLayer (const char* layer_name,
const char* client_name, const char* client_name,
@@ -490,9 +529,30 @@ MG_EXPORT void GUIAPI MiniGUIPanic (int exitcode);
* *
* \sa GetLayerInfo, ServerStartup, ServerCreateLayer * \sa GetLayerInfo, ServerStartup, ServerCreateLayer
*/ */
MG_EXPORT GHANDLE GUIAPI JoinLayer (const char* layer_name, static inline GHANDLE GUIAPI JoinLayer (const char* layer_name,
const char* client_name, const char* client_name,
int max_nr_highers, int max_nr_normals); int max_nr_highers, int max_nr_normals)
{
return JoinLayerEx (layer_name, client_name,
max_nr_highers, max_nr_normals, NULL);
}
/**
* \fn int GUIAPI GetClientId (void)
* \brief Gets the client identifier.
*
* You can get the information of a layer through this function.
* The information will be returned through the pointer arguments
* if the specific pointer is not NULL.
*
* \return Returns the client identifier of the current process.
* Note that the server always returns 0.
*
* \sa JoinLayerEx
*
* Since 5.2.0
*/
MG_EXPORT int GUIAPI GetClientId (void);
/** /**
* \fn GHANDLE GUIAPI GetLayerInfo (const char* layer_name, * \fn GHANDLE GUIAPI GetLayerInfo (const char* layer_name,
@@ -2125,7 +2185,7 @@ MG_EXPORT int GUIAPI ServerSendReplyEx (int clifd,
* \fn int GUIAPI ServerSendReply (int clifd, const void* reply, int len) * \fn int GUIAPI ServerSendReply (int clifd, const void* reply, int len)
* \brief Sends the reply to the client. * \brief Sends the reply to the client.
* *
* This function sends a replay pointed to by \a reply which is * This function sends a reply pointed to by \a reply which is
* \a len bytes long to the client. * \a len bytes long to the client.
* *
* \note Only used by the server to send the reply to the client. * \note Only used by the server to send the reply to the client.
@@ -2673,6 +2733,26 @@ MG_EXPORT void GUIAPI DesktopUpdateAllWindow (void);
#define DUMMY_LAYER_HANDLE (GHANDLE)(-1) #define DUMMY_LAYER_HANDLE (GHANDLE)(-1)
/**
* \fn GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
const char* client_name,
int max_nr_highers, int max_nr_normals, int *cli_fd)
* \brief The dummy replacement of the same function for MiniGUI-Processes.
*
* This function is a replacment of the same function for MiniGUI-Processes
* runtime mode. We provide this function for MiniGUI-Threads and
* MiniGUI-Standalone runtime modes, in order to avoid using the
* conditional compilation instructions in your source code.
*
* \return Always returns DUMMY_LAYER_HANDLE to indicate success.
*/
static inline GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
const char* client_name,
int max_nr_highers, int max_nr_normals, int *cli_fd)
{
return DUMMY_LAYER_HANDLE;
}
/** /**
* \fn GHANDLE GUIAPI JoinLayer (const char* layer_name, * \fn GHANDLE GUIAPI JoinLayer (const char* layer_name,
const char* client_name, const char* client_name,
@@ -2687,7 +2767,8 @@ MG_EXPORT void GUIAPI DesktopUpdateAllWindow (void);
* \return Always returns DUMMY_LAYER_HANDLE to indicate success. * \return Always returns DUMMY_LAYER_HANDLE to indicate success.
*/ */
static inline GHANDLE GUIAPI JoinLayer (const char* layer_name, static inline GHANDLE GUIAPI JoinLayer (const char* layer_name,
const char* client_name, int max_nr_highers, int max_nr_normals) const char* client_name,
int max_nr_highers, int max_nr_normals)
{ {
return DUMMY_LAYER_HANDLE; return DUMMY_LAYER_HANDLE;
} }
+32 -3
View File
@@ -2990,18 +2990,22 @@ typedef struct _WINMASKINFO {
if the client moved to a new layer */ if the client moved to a new layer */
#define MSG_LAYERCHANGED 0x0149 #define MSG_LAYERCHANGED 0x0149
/* Since 5.2.0; the server send this message to the client
if a window has been composited to the screen. */
#define MSG_WINCOMPOSITED 0x014A
#endif /* defined _MGRM_PROCESSES */ #endif /* defined _MGRM_PROCESSES */
/* Since 5.0.0: for managing message thread */ /* Since 5.0.0: for managing message thread */
#define MSG_MANAGE_MSGTHREAD 0x014A #define MSG_MANAGE_MSGTHREAD 0x014B
#define MSGTHREAD_SIGNIN 0x00 #define MSGTHREAD_SIGNIN 0x00
#define MSGTHREAD_SIGNOUT 0x01 #define MSGTHREAD_SIGNOUT 0x01
/* Since 5.0.0: for calculating the default position */ /* Since 5.0.0: for calculating the default position */
#define MSG_CALC_POSITION 0x014B #define MSG_CALC_POSITION 0x014C
/* Since 5.0.6: for waking up the client */ /* Since 5.0.6: for waking up the client */
#define MSG_WAKEUP_CLIENT 0x014C #define MSG_WAKEUP_CLIENT 0x014D
/** /**
* \def MSG_DOESNEEDIME * \def MSG_DOESNEEDIME
@@ -7237,6 +7241,31 @@ MG_EXPORT BOOL GUIAPI SetMainWindowGestureFlags (HWND hWnd, DWORD dwFlags);
#ifdef _MGSCHEMA_COMPOSITING #ifdef _MGSCHEMA_COMPOSITING
/**
* \fn int GUIAPI GetWindowSharedSurfaceFD (HWND hwnd, size_t *map_size,
* DWORD *flags)
* \brief Gets the file descriptor of the surface buffer for a window or
* the main window it locates.
*
* This function gets the file descriptor of the surface buffer for
* the specified window if it is a main window or the main window it locates.
* Note that if the window is a control that has the style `WS_EX_CTRLASMAINWIN`,
* the window will have a separate surface buffer.
*
* \param hwnd The handle to the window.
*
* \return An integer larger than or equal to 0 for a valid file descriptor,
* otherwise a negative value.
*
* \note This function only available when _MGSCHEMA_COMPOSITING is defined.
*
* \sa CreateMemDCFromSharedSurfaceFD
*
* Since 5.0.13
*/
MG_EXPORT int GUIAPI GetWindowSharedSurfaceFD (HWND hWnd, size_t *map_size,
DWORD *flags);
/** /**
* \fn BOOL GUIAPI SetMainWindowCompositing (HWND hWnd, * \fn BOOL GUIAPI SetMainWindowCompositing (HWND hWnd,
int type, DWORD arg) int type, DWORD arg)
+2 -1
View File
@@ -2,11 +2,12 @@ prefix=@prefix@
exec_prefix=@exec_prefix@ exec_prefix=@exec_prefix@
libdir=@libdir@ libdir=@libdir@
includedir=@includedir@ includedir=@includedir@
runmode=@MINIGUI_RUNMODE@
libsuffix=@MGLIB_SUFFIX@
Name: MiniGUI Name: MiniGUI
Description: A mature cross-platform windowing and GUI system for embedded systems and IoT smart devices. Description: A mature cross-platform windowing and GUI system for embedded systems and IoT smart devices.
Version: @MINIGUI_VERSION@ Version: @MINIGUI_VERSION@
Runmode: @MINIGUI_RUNMODE@
Requires: Requires:
Libs: -L${libdir} -lminigui_@MGLIB_SUFFIX@ @DEP_LIBS@ Libs: -L${libdir} -lminigui_@MGLIB_SUFFIX@ @DEP_LIBS@
Libs.private: Libs.private:
+32 -3
View File
@@ -184,6 +184,23 @@ static void process_socket_message (MSG *msg)
LOSWORD(msg->wParam), HISWORD(msg->wParam), LOSWORD(msg->wParam), HISWORD(msg->wParam),
LOSWORD(msg->lParam), HISWORD(msg->lParam)); LOSWORD(msg->lParam), HISWORD(msg->lParam));
} }
#ifdef _MGSCHEMA_COMPOSITING
else if (msg->message == MSG_WINCOMPOSITED) {
/* Since 5.2.0 */
int slot = (int)msg->wParam;
HWND hwnd = (HWND)msg->lParam;
unsigned dirty_age = (unsigned)msg->time;
if (__mg_client_check_znode_hwnd(slot, hwnd, __mg_client_id)) {
GAL_Surface *ssurf = ((PMAINWIN)hwnd)->surf;
assert(ssurf->shared_header);
__mg_lock_file_for_write(ssurf->fd);
if (ssurf->dirty_info->dirty_age == dirty_age) {
ssurf->dirty_info->nr_dirty_rcs = 0;
}
__mg_unlock_file_for_write(ssurf->fd);
}
}
#endif
else { else {
if (msg->hwnd == HWND_NULL) { if (msg->hwnd == HWND_NULL) {
msg->hwnd = HWND_DESKTOP; msg->hwnd = HWND_DESKTOP;
@@ -518,8 +535,8 @@ BOOL client_IdleHandler4Client (PMSGQUEUE msg_queue, BOOL wait)
return (n > 0); return (n > 0);
} }
GHANDLE GUIAPI JoinLayer (const char* layer_name, const char* client_name, GHANDLE GUIAPI JoinLayerEx (const char* layer_name, const char* client_name,
int max_nr_topmosts, int max_nr_normals) int max_nr_topmosts, int max_nr_normals, int *cli_id)
{ {
GHANDLE layer_handle = INV_LAYER_HANDLE; GHANDLE layer_handle = INV_LAYER_HANDLE;
REQUEST req; REQUEST req;
@@ -529,8 +546,12 @@ GHANDLE GUIAPI JoinLayer (const char* layer_name, const char* client_name,
if (mgIsServer) if (mgIsServer)
return layer_handle; return layer_handle;
if (__mg_client_id != 0) /* Already joined, return the handle */ if (__mg_client_id != 0) {
/* Already joined, return the handle */
if (cli_id)
*cli_id = __mg_client_id;
return GetLayerInfo (NAME_SELF_LAYER, NULL, NULL, NULL); return GetLayerInfo (NAME_SELF_LAYER, NULL, NULL, NULL);
}
if (layer_name) { if (layer_name) {
strncpy (info.layer_name, layer_name, LEN_LAYER_NAME); strncpy (info.layer_name, layer_name, LEN_LAYER_NAME);
@@ -593,10 +614,18 @@ GHANDLE GUIAPI JoinLayer (const char* layer_name, const char* client_name,
__mg_start_client_desktop (); __mg_start_client_desktop ();
if (cli_id)
*cli_id = __mg_client_id;
ret: ret:
return layer_handle; return layer_handle;
} }
int GUIAPI GetClientId (void)
{
return __mg_client_id;
}
GHANDLE GUIAPI GetLayerInfo (const char* layer_name, GHANDLE GUIAPI GetLayerInfo (const char* layer_name,
int* nr_clients, BOOL* is_topmost, int* cli_active) int* nr_clients, BOOL* is_topmost, int* cli_active)
{ {
+7 -2
View File
@@ -226,7 +226,7 @@ static int iso8859_6_conv_from_uc32 (Uchar32 wc, unsigned char* mchar)
} }
#endif #endif
/* must attetion the para s is arabic chv value.*/ #if 0
static int is_arabic_char_vowel(Uint8 c) static int is_arabic_char_vowel(Uint8 c)
{ {
@@ -240,6 +240,7 @@ static int is_arabic_char_vowel(Uint8 c)
*/ */
return 0; return 0;
} }
#endif
/* ISO8859-6 charset vowel relative define and judge */ /* ISO8859-6 charset vowel relative define and judge */
#define ISARABIC_VOWEL(s) ((s >= FATHATAN) && (s <= SUKUN)) #define ISARABIC_VOWEL(s) ((s >= FATHATAN) && (s <= SUKUN))
@@ -469,9 +470,12 @@ static int iso8859_6_len_first_char (const unsigned char* mstr, int len)
static unsigned int iso8859_6_char_type (Achar32 chv) static unsigned int iso8859_6_char_type (Achar32 chv)
{ {
chv = REAL_ACHAR(chv);
#if 1
return sb_char_type(chv);
#else
unsigned int ch_type = ACHAR_BASIC_UNKNOWN; unsigned int ch_type = ACHAR_BASIC_UNKNOWN;
chv = REAL_ACHAR(chv);
if (is_arabic_char_vowel (chv)) { /* is vowel */ if (is_arabic_char_vowel (chv)) { /* is vowel */
ch_type = ACHAR_BASIC_VOWEL; ch_type = ACHAR_BASIC_VOWEL;
} }
@@ -480,6 +484,7 @@ static unsigned int iso8859_6_char_type (Achar32 chv)
} }
return ch_type; return ch_type;
#endif
} }
static BidiType __mg_iso8859_6_bidi_char_type_map[] = { static BidiType __mg_iso8859_6_bidi_char_type_map[] = {
+1 -1
View File
@@ -2185,7 +2185,7 @@ static int create_memdc_for_menu (TRACKMENUINFO* ptmi)
return -1; return -1;
} }
ptmi->dc = CreateMemDCFromSurface (surf); ptmi->dc = __mg_create_memdc_for_surface (surf);
if (ptmi->dc == HDC_INVALID) { if (ptmi->dc == HDC_INVALID) {
GAL_FreeSurface (surf); GAL_FreeSurface (surf);
return -1; return -1;
+33 -9
View File
@@ -4476,10 +4476,10 @@ HWND GUIAPI CreateMainWindowEx2 (PMAINWINCREATE pCreateInfo, LINT id,
#endif #endif
#ifdef _MGSCHEMA_COMPOSITING #ifdef _MGSCHEMA_COMPOSITING
// Close file descriptor to free kernel memory? /* Since 5.2.0: keep fd available. */
if (pWin->surf->shared_header) { if (0 && pWin->surf->shared_header) {
close (pWin->surf->shared_header->fd); close (pWin->surf->fd);
pWin->surf->shared_header->fd = -1; pWin->surf->fd = -1;
} }
#endif #endif
@@ -5585,11 +5585,13 @@ BOOL GUIAPI ValidateRegion (HWND hWnd, const CLIPRGN* pRgn)
BOOL GUIAPI GetUpdateRect (HWND hWnd, RECT* update_rect) BOOL GUIAPI GetUpdateRect (HWND hWnd, RECT* update_rect)
{ {
PMAINWIN pWin; PMAINWIN pWin;
RECT rcClient;
MG_CHECK_RET (MG_IS_NORMAL_WINDOW(hWnd), FALSE); MG_CHECK_RET (MG_IS_NORMAL_WINDOW(hWnd), FALSE);
pWin = MG_GET_WINDOW_PTR (hWnd); pWin = MG_GET_WINDOW_PTR (hWnd);
*update_rect = pWin->InvRgn.rgn.rcBound; GetClientRect(hWnd, &rcClient);
IntersectRect(update_rect, &pWin->InvRgn.rgn.rcBound, &rcClient);
return TRUE; return TRUE;
} }
@@ -6036,10 +6038,10 @@ HWND GUIAPI CreateWindowEx2 (const char* spClassName,
} }
#ifdef _MGSCHEMA_COMPOSITING #ifdef _MGSCHEMA_COMPOSITING
// Close file descriptor to free kernel memory? /* Since 5.2.0: keep fd available. */
if (dwExStyle & WS_EX_CTRLASMAINWIN && pNewCtrl->surf->shared_header) { if (0 && dwExStyle & WS_EX_CTRLASMAINWIN && pNewCtrl->surf->shared_header) {
close (pNewCtrl->surf->shared_header->fd); close (pNewCtrl->surf->fd);
pNewCtrl->surf->shared_header->fd = -1; pNewCtrl->surf->fd = -1;
} }
#endif #endif
@@ -6066,6 +6068,28 @@ error:
return HWND_INVALID; return HWND_INVALID;
} }
#ifdef _MGSCHEMA_COMPOSITING
int GUIAPI GetWindowSharedSurfaceFD (HWND hWnd, size_t *map_size, DWORD *flags)
{
MG_CHECK_RET (MG_IS_NORMAL_WINDOW (hWnd), -1);
PMAINWIN pWin = (PMAINWIN)hWnd;
if (pWin->surf->shared_header) {
if (map_size)
*map_size = pWin->surf->shared_header->map_size;
if (flags) {
*flags = MEMDC_FLAG_SWSURFACE;
if (pWin->surf->shared_header->byhw)
*flags |= MEMDC_FLAG_HWSURFACE;
}
return pWin->surf->fd;
}
return -1;
}
#endif /* _MGSCHEMA_COMPOSITING */
BOOL GUIAPI DestroyWindow (HWND hWnd) BOOL GUIAPI DestroyWindow (HWND hWnd)
{ {
PCONTROL pCtrl; PCONTROL pCtrl;
+27 -2
View File
@@ -105,6 +105,10 @@
#define REQID_GETSHAREDSURFACE 0x001C #define REQID_GETSHAREDSURFACE 0x001C
// for compositing schema // for compositing schema
#define SYSSF_WALLPAPER_PATTER "syssf-wallpaper-pattern" #define SYSSF_WALLPAPER_PATTER "syssf-wallpaper-pattern"
#define APPSF_NAME_PREFIX "appsf-name-"
#define APPSF_NAME_PATTER "appsf-name-%s"
#define APPSF_HWND_PREFIX "appsf-hwnd-"
#define APPSF_HWND_PATTER "appsf-hwnd-%d-%p"
// for sharedfb schema // for sharedfb schema
#define SYSSF_REAL_SCREEN "syssf-real-screen" #define SYSSF_REAL_SCREEN "syssf-real-screen"
#define SYSSF_SHADOW_SCREEN "syssf-shadow-screen" #define SYSSF_SHADOW_SCREEN "syssf-shadow-screen"
@@ -113,10 +117,22 @@
#define REQID_LOADCURSOR_PNG 0x001D #define REQID_LOADCURSOR_PNG 0x001D
// Load cursor from in-memory PNG // Load cursor from in-memory PNG
#define REQID_LOADCURSOR_PNG_MEM 0x001E #define REQID_LOADCURSOR_PNG_MEM 0x001E
#if 0 // Deprecated since 5.2.0
// allocate semaphore for shared surface // allocate semaphore for shared surface
#define REQID_ALLOC_SURF_SEM 0x001F #define REQID_ALLOC_SURF_SEM 0x001F
// free semaphore of shared surface // free semaphore of shared surface
#define REQID_FREE_SURF_SEM 0x0020 #define REQID_FREE_SURF_SEM 0x0020
#endif
/* Since 5.2.0 */
// Operate a shared surface to register/revoke the name and set the fd
#define REQID_OPERATENAMEDSSURF 0x001F
#define ID_NAMEDSSURFOP_REGISTER 1
#define ID_NAMEDSSURFOP_SET 2
#define ID_NAMEDSSURFOP_REVOKE 3
#define REQID_RESERVED 0x0020
// Move the current client to another layer // Move the current client to another layer
#define REQID_MOVETOLAYER 0x0021 #define REQID_MOVETOLAYER 0x0021
@@ -142,15 +158,23 @@ MGUI_COMPILE_TIME_ASSERT(sys_request_id, MAX_SYS_REQID >= REQID_SYS_LAST);
#undef MGUI_COMPILE_TIME_ASSERT #undef MGUI_COMPILE_TIME_ASSERT
/* Since 5.2.0 */
typedef struct OperateNSSurfInfo
{
int id_op;
char name[NAME_MAX + 1];
size_t map_size;
} OPERATENSSURFINFO;
/* Since 5.0.0 */ /* Since 5.0.0 */
typedef struct _SharedSurfInfo { typedef struct _SharedSurfInfo {
size_t size; // whole size of the surface
off_t offset; // offset of pixel data
uint32_t flags; // the flags of the surface uint32_t flags; // the flags of the surface
uint32_t width, height; uint32_t width, height;
uint32_t pitch; uint32_t pitch;
uint32_t name; // when use flink name uint32_t name; // when use flink name
uint32_t drm_format; // DRM pixel format uint32_t drm_format; // DRM pixel format
size_t size; // whole size of the surface
off_t offset; // offset of pixel data
} SHAREDSURFINFO; } SHAREDSURFINFO;
typedef struct JoinLayerInfo { typedef struct JoinLayerInfo {
@@ -359,6 +383,7 @@ void __mg_start_client_desktop (void);
void __mg_update_window (HWND hwnd, int left, int top, int right, int bottom); void __mg_update_window (HWND hwnd, int left, int top, int right, int bottom);
BOOL __mg_client_check_znode_hwnd (int slot, HWND hwnd, int cli);
BOOL __mg_client_check_hwnd (HWND hwnd, int cli); BOOL __mg_client_check_hwnd (HWND hwnd, int cli);
BOOL __mg_client_on_layer_changed (GHANDLE layer_handle, int zi_shmid); BOOL __mg_client_on_layer_changed (GHANDLE layer_handle, int zi_shmid);
+6 -4
View File
@@ -521,14 +521,16 @@ static inline void _dc_step_y (PDC pdc, int step)
# define BLOCK_DRAW_SEM(pdc) \ # define BLOCK_DRAW_SEM(pdc) \
do { \ do { \
if (pdc->surface->shared_header) \ if (pdc->surface->shared_header) { \
LOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num); \ __mg_lock_file_for_write(pdc->surface->fd); \
} \
} while (0) } while (0)
# define UNBLOCK_DRAW_SEM(pdc) \ # define UNBLOCK_DRAW_SEM(pdc) \
do { \ do { \
if (pdc->surface->shared_header) \ if (pdc->surface->shared_header) { \
UNLOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num); \ __mg_unlock_file_for_write(pdc->surface->fd); \
} \
} while (0) } while (0)
# define IS_SCREEN_SURFACE(pdc) \ # define IS_SCREEN_SURFACE(pdc) \
+10 -8
View File
@@ -51,12 +51,10 @@
#ifndef GUI_DRAWSEMOP_H #ifndef GUI_DRAWSEMOP_H
#define GUI_DRAWSEMOP_H #define GUI_DRAWSEMOP_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <errno.h> #include <errno.h>
#include "misc.h"
static inline void my_sem_op (int semid, int num, int op) static inline void my_sem_op (int semid, int num, int op)
{ {
struct sembuf sb; struct sembuf sb;
@@ -70,6 +68,9 @@ again:
if (errno == EINTR) { if (errno == EINTR) {
goto again; goto again;
} }
else {
_ERR_PRINTF("Failed semop: %m\n");
}
} }
} }
@@ -79,10 +80,7 @@ again:
#define LOCK_SCREEN_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_SCR, -1) #define LOCK_SCREEN_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_SCR, -1)
#define UNLOCK_SCREEN_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_SCR, 1) #define UNLOCK_SCREEN_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_SCR, 1)
#ifdef _MGSCHEMA_COMPOSITING extern int __mg_client_id;
# define LOCK_SURFACE_SEM(num) my_sem_op(SHAREDRES_SEMID_SHARED_SURF, num, -1)
# define UNLOCK_SURFACE_SEM(num) my_sem_op(SHAREDRES_SEMID_SHARED_SURF, num, 1)
#endif
#ifdef _MGHAVE_CURSOR #ifdef _MGHAVE_CURSOR
@@ -157,6 +155,10 @@ again:
# define UNLOCK_MOUSEMOVE_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_MOUSEMOVE, 1) # define UNLOCK_MOUSEMOVE_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_MOUSEMOVE, 1)
#endif /* _MGRM_PROCESSES */ #endif /* _MGRM_PROCESSES */
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */
+1 -3
View File
@@ -927,9 +927,7 @@ BOOL gui_LoadIconRes(HDC hdc, const char* rdr_name, char* file);
void gui_WndRect(HWND hWnd, PRECT prc); void gui_WndRect(HWND hWnd, PRECT prc);
void gui_WndClientRect(HWND hWnd, PRECT prc); void gui_WndClientRect(HWND hWnd, PRECT prc);
/* Undisclosed APIs */ HDC __mg_create_memdc_for_surface (struct GAL_Surface* surface);
HDC CreateMemDCFromSurface (struct GAL_Surface* surface);
struct GAL_Surface* GetSurfaceFromDC (HDC hdc);
/* Since 5.0.0 */ /* Since 5.0.0 */
#ifdef _MGRM_PROCESSES #ifdef _MGRM_PROCESSES
+14 -2
View File
@@ -83,6 +83,11 @@ static inline int comp_key_string (const void *key1, const void *key2)
return strcmp (key1, key2); return strcmp (key1, key2);
} }
static inline void free_val_alloc (void *val)
{
free (val);
}
typedef struct _map_t map_t; typedef struct _map_t map_t;
typedef struct _map_entry_t { typedef struct _map_entry_t {
struct rb_node node; struct rb_node node;
@@ -100,8 +105,15 @@ int __mg_map_get_size (map_t* map);
map_entry_t* __mg_map_find (map_t* map, const void* key); map_entry_t* __mg_map_find (map_t* map, const void* key);
int __mg_map_insert_ex (map_t* map, const void* key, map_entry_t* __mg_map_insert_ex2 (map_t* map, const void* key,
const void* val, free_val_fn free_val_alt); const void* val, free_val_fn free_val_alt);
static int __mg_map_insert_ex (map_t* map, const void* key,
const void* val, free_val_fn free_val_alt)
{
return __mg_map_insert_ex2(map, key, val, NULL) ? 0 : -1;
}
static inline int __mg_map_insert (map_t* map, const void* key, static inline int __mg_map_insert (map_t* map, const void* key,
const void* val) const void* val)
{ {
@@ -114,7 +126,7 @@ int __mg_map_find_replace_or_insert (map_t* map, const void* key,
int __mg_map_replace (map_t* map, const void* key, int __mg_map_replace (map_t* map, const void* key,
const void* val, free_val_fn free_val_alt); const void* val, free_val_fn free_val_alt);
int __mg_map_erase (map_t* map, void* key); int __mg_map_erase (map_t* map, const void* key);
int __mg_map_get_size (map_t* map); int __mg_map_get_size (map_t* map);
#if 0 /* deprecated code */ #if 0 /* deprecated code */
+7 -1
View File
@@ -79,6 +79,11 @@ struct timezone {
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
void __mg_lock_file_for_read(int fd);
void __mg_unlock_file_for_read(int fd);
void __mg_lock_file_for_write(int fd);
void __mg_unlock_file_for_write(int fd);
unsigned int __mg_os_get_random_seed (void); unsigned int __mg_os_get_random_seed (void);
void __mg_os_time_delay (int ms); void __mg_os_time_delay (int ms);
void __mg_os_start_time (void); void __mg_os_start_time (void);
@@ -115,10 +120,11 @@ void mg_TerminateMisc (void);
BOOL mg_InitSystemRes (void); BOOL mg_InitSystemRes (void);
void mg_TerminateSystemRes (void); void mg_TerminateSystemRes (void);
/* Deprecated since 5.2.0
#ifdef _MGSCHEMA_COMPOSITING #ifdef _MGSCHEMA_COMPOSITING
int __mg_alloc_sem_for_shared_surf (void); int __mg_alloc_sem_for_shared_surf (void);
int __mg_free_sem_for_shared_surf (int sem_num); int __mg_free_sem_for_shared_surf (int sem_num);
#endif /* _MGSCHEMA_COMPOSITING */ #endif _MGSCHEMA_COMPOSITING */
size_t __mg_lookfor_unused_slot (unsigned char* bitmap, size_t len_bmp, int set); size_t __mg_lookfor_unused_slot (unsigned char* bitmap, size_t len_bmp, int set);
+4 -4
View File
@@ -396,10 +396,10 @@ char * __mg_msgstr3 [] =
"MSG_SRVNOTIFY", // 0x0147 "MSG_SRVNOTIFY", // 0x0147
"MSG_UPDATECLIWIN", // 0x0148 "MSG_UPDATECLIWIN", // 0x0148
"MSG_LAYERCHANGED", // 0x0149 "MSG_LAYERCHANGED", // 0x0149
"MSG_MANAGE_MSGTHREAD", // 0x014A "MSG_WINCOMPOSITED", // 0x014A
"MSG_CALC_POSITION", // 0x014B "MSG_MANAGE_MSGTHREAD", // 0x014B
"", // 0x014C "MSG_CALC_POSITION", // 0x014C
"", // 0x014D "MSG_WAKEUP_CLIENT", // 0x014D
"", // 0x014E "", // 0x014E
"", // 0x014F "", // 0x014F
+36 -21
View File
@@ -117,8 +117,10 @@ void GAL_FreeFormat(GAL_PixelFormat *format);
/* typedef for private surface blitting functions */ /* typedef for private surface blitting functions */
struct GAL_Surface; struct GAL_Surface;
typedef int (*GAL_blit)(struct GAL_Surface *src, GAL_Rect *srcrect,
struct GAL_Surface *dst, GAL_Rect *dstrect); typedef int (*GAL_blit)(GAL_VideoDevice *video,
struct GAL_Surface *src, GAL_Rect *srcrect,
struct GAL_Surface *dst, GAL_Rect *dstrect);
#if IS_COMPOSITING_SCHEMA #if IS_COMPOSITING_SCHEMA
typedef struct _DirtyInfo { typedef struct _DirtyInfo {
@@ -137,20 +139,25 @@ typedef struct _DirtyInfo {
* than the creator. * than the creator.
*/ */
typedef struct _SharedSurfaceHeader { typedef struct _SharedSurfaceHeader {
/* The number of semphore for this surface. /* the name of the shared surface; since 5.2.0. */
The SysV semaphore set id for synchronizing this shared surface: char name[NAME_MAX + 1];
SHAREDRES_SEMID_SHARED_SURF. */
int sem_num;
/* The pid of the creator */ /* The client identifier of the creator. */
pid_t creator; int create_cli;
/* The file descriptor in context of the creator. */
int fd;
/* Not zero for hardware surface. */ /* Not zero for hardware surface. */
int byhw; int byhw;
/* The dirty information */
GAL_DirtyInfo dirty_info; /* Deprecated since 5.2.0.
The number of semphore for this surface.
The SysV semaphore set id for synchronizing this shared surface:
SHAREDRES_SEMID_SHARED_SURF.
int sem_num; */
/* Deprecated since 5.2.0.
The file descriptor in context of the creator.
int fd; */
/* the size of the surface */ /* the size of the surface */
int width, height; int width, height;
/* the pitch of the surface */ /* the pitch of the surface */
@@ -164,6 +171,9 @@ typedef struct _SharedSurfaceHeader {
size_t map_size; size_t map_size;
/* the offset of pixels data */ /* the offset of pixels data */
off_t pixels_off; off_t pixels_off;
/* The dirty information */
GAL_DirtyInfo dirty_info;
} GAL_SharedSurfaceHeader; } GAL_SharedSurfaceHeader;
#endif /* IS_COMPOSITING_SCHEMA */ #endif /* IS_COMPOSITING_SCHEMA */
@@ -228,6 +238,8 @@ typedef struct GAL_Surface {
GAL_SharedSurfaceHeader *shared_header; /* Private */ GAL_SharedSurfaceHeader *shared_header; /* Private */
/* The dirty info for non-shared surface. */ /* The dirty info for non-shared surface. */
GAL_DirtyInfo *dirty_info; /* Private */ GAL_DirtyInfo *dirty_info; /* Private */
/* The file descriptor if the surface is a shared surface. */
int fd; /* Private; since 5.2.0. */
#endif #endif
} GAL_Surface; } GAL_Surface;
@@ -250,6 +262,8 @@ typedef struct GAL_Surface {
#define GAL_PREALLOC 0x01000000 /* Surface uses preallocated memory */ #define GAL_PREALLOC 0x01000000 /* Surface uses preallocated memory */
#define GAL_FORMAT_CHECKED 0x02000000 /* Pixman format checked */ #define GAL_FORMAT_CHECKED 0x02000000 /* Pixman format checked */
#define GAL_SSURF_ATTACHED 0x04000000 /* The shared surface is attached to. */
#define GAL_SSURF_LOCKED 0x08000000 /* The shared surface is locked. */
/* Available for GAL_SetVideoMode() */ /* Available for GAL_SetVideoMode() */
#define GAL_ANYFORMAT 0x10000000 /* Allow any video depth/pixel-format */ #define GAL_ANYFORMAT 0x10000000 /* Allow any video depth/pixel-format */
@@ -569,6 +583,11 @@ GAL_Surface *GAL_CreateRGBSurface
GAL_Surface *GAL_CreateRGBSurfaceFrom (void *pixels, GAL_Surface *GAL_CreateRGBSurfaceFrom (void *pixels,
int width, int height, int depth, int pitch, int width, int height, int depth, int pitch,
Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);
/* Since 5.2.0 */
static GAL_Surface *GAL_RefSurface (GAL_Surface *surface) {
surface->refcount++;
return surface;
}
void GAL_FreeSurface (GAL_Surface *surface); void GAL_FreeSurface (GAL_Surface *surface);
typedef struct REQ_HWSURFACE { typedef struct REQ_HWSURFACE {
@@ -649,11 +668,11 @@ GAL_Surface *GAL_CreateSurfaceForZNodeAs (const GAL_Surface* ref_surf,
void GAL_FreeSharedSurfaceData (GAL_Surface *surface); void GAL_FreeSharedSurfaceData (GAL_Surface *surface);
/* Attach to a shared RGB surface. */ /* Attach to a shared RGB surface. */
GAL_Surface *GAL_AttachSharedRGBSurface (int fd, size_t map_size, GAL_Surface *GAL_AttachSharedRGBSurface (GAL_VideoDevice* video,
Uint32 flags, BOOL with_wr); int fd, size_t map_size, Uint32 flags, BOOL with_wr);
/* Dettach from a shared RGB surface from the specific video device. */ /* Detach from a shared RGB surface from the specific video device. */
void GAL_DettachSharedSurfaceData (GAL_Surface *surface); void GAL_DetachSharedSurfaceData (GAL_Surface *surface);
/* Create a cursor surface from the specific video device. */ /* Create a cursor surface from the specific video device. */
GAL_Surface* GAL_CreateCursorSurface (GAL_VideoDevice* video, GAL_Surface* GAL_CreateCursorSurface (GAL_VideoDevice* video,
@@ -670,7 +689,6 @@ void GAL_MoveCursor (GAL_Surface* surface, int x, int y);
#endif /* defined _MGSCHEMA_COMPOSITING */ #endif /* defined _MGSCHEMA_COMPOSITING */
#if 0
/* /*
* GAL_LockSurface() sets up a surface for directly accessing the pixels. * GAL_LockSurface() sets up a surface for directly accessing the pixels.
* Between calls to GAL_LockSurface()/GAL_UnlockSurface(), you can write * Between calls to GAL_LockSurface()/GAL_UnlockSurface(), you can write
@@ -680,9 +698,7 @@ void GAL_MoveCursor (GAL_Surface* surface, int x, int y);
* *
* Not all surfaces require locking. If GAL_MUSTLOCK(surface) evaluates * Not all surfaces require locking. If GAL_MUSTLOCK(surface) evaluates
* to 0, then you can read and write to the surface at any time, and the * to 0, then you can read and write to the surface at any time, and the
* pixel format of the surface will not change. In particular, if the * pixel format of the surface will not change.
* GAL_HWSURFACE flag is not given when calling GAL_SetVideoMode(), you
* will not need to lock the display surface before accessing it.
* *
* No operating system or library calls should be made between lock/unlock * No operating system or library calls should be made between lock/unlock
* pairs, as critical system locks may be held during this time. * pairs, as critical system locks may be held during this time.
@@ -691,7 +707,6 @@ void GAL_MoveCursor (GAL_Surface* surface, int x, int y);
*/ */
int GAL_LockSurface (GAL_Surface *surface); int GAL_LockSurface (GAL_Surface *surface);
void GAL_UnlockSurface (GAL_Surface *surface); void GAL_UnlockSurface (GAL_Surface *surface);
#endif
/* /*
* Set the color key (transparent pixel) in a blittable surface. * Set the color key (transparent pixel) in a blittable surface.
+8
View File
@@ -132,6 +132,13 @@ void __mg_client_del (int cli);
void __mg_release_global_res (int cli); void __mg_release_global_res (int cli);
/* Since 5.2.0 */
int __mg_nssurf_map_new(void);
void __mg_nssurf_map_delete(void);
int __mg_nssurf_map_operate_srv(const OPERATENSSURFINFO* req_info,
int cli, int fd);
int __mg_get_shared_surface_srv(const char *itn_name, SHAREDSURFINFO *info);
void __mg_remove_client (int cli, int clifd); void __mg_remove_client (int cli, int clifd);
int __mg_handle_request (int clifd, int req_id, int cli); int __mg_handle_request (int clifd, int req_id, int cli);
@@ -150,6 +157,7 @@ int __mg_remove_all_znodes_of_client (int cli);
int __mg_handle_normal_mouse_move (const ZORDERINFO* zi, int x, int y); int __mg_handle_normal_mouse_move (const ZORDERINFO* zi, int x, int y);
int __mg_get_znode_at_point (const ZORDERINFO* zi, int x, int y, HWND* hwnd); int __mg_get_znode_at_point (const ZORDERINFO* zi, int x, int y, HWND* hwnd);
ZORDERNODE *__mg_find_znode_by_client_hwnd (int cli, HWND hwnd);
int __mg_do_reghook_operation (int cli, const REGHOOKINFO* info); int __mg_do_reghook_operation (int cli, const REGHOOKINFO* info);
int __mg_handle_mouse_hook (int message, WPARAM wParam, LPARAM lParam); int __mg_handle_mouse_hook (int message, WPARAM wParam, LPARAM lParam);
+2 -2
View File
@@ -112,7 +112,7 @@ typedef struct tagG_RES {
int nr_layers; int nr_layers;
int semid_layer; int semid_layer;
#ifdef _MGSCHEMA_COMPOSITING #if 0 && defined(_MGSCHEMA_COMPOSITING) // deprecated since 5.2.0
int semid_shared_surf; /* the id of semaphore set for shared surfaces */ int semid_shared_surf; /* the id of semaphore set for shared surfaces */
#endif #endif
@@ -208,7 +208,7 @@ typedef G_RES* PG_RES;
#define SHAREDRES_NR_LAYSERS (((PG_RES)mgSharedRes)->nr_layers) #define SHAREDRES_NR_LAYSERS (((PG_RES)mgSharedRes)->nr_layers)
#define SHAREDRES_SEMID_LAYER (((PG_RES)mgSharedRes)->semid_layer) #define SHAREDRES_SEMID_LAYER (((PG_RES)mgSharedRes)->semid_layer)
#ifdef _MGSCHEMA_COMPOSITING #if 0 && defined(_MGSCHEMA_COMPOSITING) // Deprecated since 5.2.0
# define SHAREDRES_SEMID_SHARED_SURF (((PG_RES)mgSharedRes)->semid_shared_surf) # define SHAREDRES_SEMID_SHARED_SURF (((PG_RES)mgSharedRes)->semid_shared_surf)
#endif #endif
+19 -1
View File
@@ -228,6 +228,7 @@ static void composite_wallpaper_rect (CompositorCtxt* ctxt,
} }
} }
else { else {
SelectClipRect (HDC_SCREEN_SYS, dirty_rc);
SetBrushColor (HDC_SCREEN_SYS, SetBrushColor (HDC_SCREEN_SYS,
GetWindowElementPixelEx (HWND_DESKTOP, HDC_SCREEN_SYS, GetWindowElementPixelEx (HWND_DESKTOP, HDC_SCREEN_SYS,
WE_BGC_DESKTOP)); WE_BGC_DESKTOP));
@@ -678,6 +679,19 @@ static BOOL merge_dirty_ppp (CompositorCtxt* ctxt, MG_Layer* layer, int zidx)
return rc; return rc;
} }
#if 0
static void dump_dirty_region(CompositorCtxt* ctxt, const char *prefix, int zidx)
{
CLIPRGN* rgn = &ctxt->dirty_rgn;
_WRN_PRINTF("%s (%d): dirty region on screen: (%d, %d) %d x %d; "
"highest dirty win: %d; lowest dirty win: %d\n",
prefix, zidx,
rgn->rcBound.left, rgn->rcBound.top,
RECTW (rgn->rcBound), RECTH (rgn->rcBound),
ctxt->highest_dirty_win, ctxt->lowest_dirty_win);
}
#endif
static BOOL merge_dirty_win (CompositorCtxt* ctxt, MG_Layer* layer, int zidx) static BOOL merge_dirty_win (CompositorCtxt* ctxt, MG_Layer* layer, int zidx)
{ {
BOOL rc = FALSE; BOOL rc = FALSE;
@@ -721,9 +735,13 @@ static BOOL merge_dirty_wpp (CompositorCtxt* ctxt, MG_Layer* layer)
static BOOL refresh_dirty_region (CompositorCtxt* ctxt, MG_Layer* layer) static BOOL refresh_dirty_region (CompositorCtxt* ctxt, MG_Layer* layer)
{ {
/* the fallback compositor only manages znodes on the topmost layer. */ /* the fallback compositor only manages znodes on the topmost layer. */
if (layer != mgTopmostLayer || IsEmptyClipRgn (&ctxt->dirty_rgn)) if (layer != mgTopmostLayer)
return FALSE; return FALSE;
if (IsEmptyClipRgn (&ctxt->dirty_rgn)) {
return FALSE;
}
if (ctxt->highest_dirty_ppp >= 0) { if (ctxt->highest_dirty_ppp >= 0) {
composite_ppp_znodes (ctxt); composite_ppp_znodes (ctxt);
} }
+32 -16
View File
@@ -56,7 +56,6 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#define _DEBUG
#include "common.h" #include "common.h"
#if defined(_MGRM_PROCESSES) && defined(_MGSCHEMA_COMPOSITING) #if defined(_MGRM_PROCESSES) && defined(_MGSCHEMA_COMPOSITING)
@@ -69,6 +68,7 @@
#include "constants.h" #include "constants.h"
#include "zorder.h" #include "zorder.h"
#include "dc.h" #include "dc.h"
#include "server.h"
#define MAX_NR_COMPOSITORS 8 #define MAX_NR_COMPOSITORS 8
#define LEN_COMPOSITOR_NAME 15 #define LEN_COMPOSITOR_NAME 15
@@ -133,31 +133,51 @@ static void lock_znode_surface (PDC pdc, ZORDERNODE* node)
{ {
if (node->lock_count == 0) { if (node->lock_count == 0) {
if (pdc->surface->shared_header) { if (pdc->surface->shared_header) {
LOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num); __mg_lock_file_for_read(pdc->surface->fd);
} }
node->dirty_age = pdc->surface->dirty_info->dirty_age; node->dirty_age = pdc->surface->dirty_info->dirty_age;
node->nr_dirty_rcs = pdc->surface->dirty_info->nr_dirty_rcs; node->nr_dirty_rcs = pdc->surface->dirty_info->nr_dirty_rcs;
node->dirty_rcs = pdc->surface->dirty_info->dirty_rcs; node->dirty_rcs = pdc->surface->dirty_info->dirty_rcs;
} }
node->lock_count++; node->lock_count++;
} }
static void unlock_znode_surface (PDC pdc, ZORDERNODE* node) static BOOL unlock_znode_surface (PDC pdc, ZORDERNODE* node)
{ {
BOOL need_reset = FALSE;
if (node->lock_count > 0) { if (node->lock_count > 0) {
node->lock_count--; node->lock_count--;
if (node->lock_count == 0) { if (node->lock_count == 0) {
if (pdc->surface->shared_header) if (node->changes != pdc->surface->dirty_info->dirty_age) {
UNLOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num); node->changes = pdc->surface->dirty_info->dirty_age;
need_reset = TRUE;
}
if (pdc->surface->shared_header) {
__mg_unlock_file_for_read(pdc->surface->fd);
}
node->dirty_age = 0; node->dirty_age = 0;
node->nr_dirty_rcs = 0; node->nr_dirty_rcs = 0;
node->dirty_rcs = NULL; node->dirty_rcs = NULL;
} }
} }
return need_reset;
}
static void reset_znode_surface_dirty (PDC pdc, ZORDERNODE* node, int slot)
{
if (node->cli == 0 || slot == 0) {
pdc->surface->dirty_info->nr_dirty_rcs = 0;
}
else if (node->hwnd) {
MSG msg = { HWND_NULL, MSG_WINCOMPOSITED,
slot, (LPARAM)node->hwnd, (DWORD)node->changes };
__mg_send2client(&msg, mgClients + node->cli);
}
} }
#if 0 /* not optimized */ #if 0 /* not optimized */
@@ -322,10 +342,8 @@ static void composite_layer (MG_Layer* layer, CompositorCtxt* ctxt,
nodes = GET_MENUNODE(zi); nodes = GET_MENUNODE(zi);
for (i = 0; i < zi->nr_popupmenus; i++) { for (i = 0; i < zi->nr_popupmenus; i++) {
pdc = dc_HDC2PDC (nodes[i].mem_dc); pdc = dc_HDC2PDC (nodes[i].mem_dc);
if (unlock_znode_surface (pdc, nodes + i))
nodes[i].changes = pdc->surface->dirty_info->dirty_age; reset_znode_surface_dirty (pdc, nodes + i, i);
pdc->surface->dirty_info->nr_dirty_rcs = 0;
unlock_znode_surface (pdc, nodes + i);
} }
} }
@@ -335,9 +353,8 @@ static void composite_layer (MG_Layer* layer, CompositorCtxt* ctxt,
while ((next = __kernel_get_next_znode (zi, next)) > 0) { while ((next = __kernel_get_next_znode (zi, next)) > 0) {
if (nodes [next].flags & ZOF_VISIBLE) { if (nodes [next].flags & ZOF_VISIBLE) {
pdc = dc_HDC2PDC (nodes[next].mem_dc); pdc = dc_HDC2PDC (nodes[next].mem_dc);
nodes[next].changes = pdc->surface->dirty_info->dirty_age; if (unlock_znode_surface (pdc, nodes + next))
pdc->surface->dirty_info->nr_dirty_rcs = 0; reset_znode_surface_dirty (pdc, nodes + next, next);
unlock_znode_surface (pdc, nodes + next);
} }
} }
@@ -346,9 +363,8 @@ static void composite_layer (MG_Layer* layer, CompositorCtxt* ctxt,
if (layer == mgTopmostLayer) { if (layer == mgTopmostLayer) {
pdc = dc_HDC2PDC (HDC_SCREEN); pdc = dc_HDC2PDC (HDC_SCREEN);
if (pdc->surface->w > 0 && pdc->surface->h > 0) { if (pdc->surface->w > 0 && pdc->surface->h > 0) {
nodes[0].changes = pdc->surface->dirty_info->dirty_age; if (unlock_znode_surface (pdc, nodes))
pdc->surface->dirty_info->nr_dirty_rcs = 0; reset_znode_surface_dirty (pdc, nodes, 0);
unlock_znode_surface (pdc, nodes);
} }
} }
} }
+36 -14
View File
@@ -1081,6 +1081,12 @@ void kernel_ShowCursorForGDI (BOOL fShow, void* pdc)
const RECT* prc; const RECT* prc;
prc = &cur_pdc->rc_output; prc = &cur_pdc->rc_output;
/* Since 5.0.13 */
if (!fShow) {
GAL_LockSurface(cur_pdc->surface);
}
if (cur_pdc->surface != __gal_screen) { if (cur_pdc->surface != __gal_screen) {
if (fShow) { if (fShow) {
GAL_UpdateRect (cur_pdc->surface, GAL_UpdateRect (cur_pdc->surface,
@@ -1090,7 +1096,7 @@ void kernel_ShowCursorForGDI (BOOL fShow, void* pdc)
} }
else { else {
if (!mgIsServer && (SHAREDRES_TOPMOST_LAYER != __mg_layer)) { if (!mgIsServer && (SHAREDRES_TOPMOST_LAYER != __mg_layer)) {
return; goto done;
} }
if (!fShow) { if (!fShow) {
@@ -1109,6 +1115,12 @@ void kernel_ShowCursorForGDI (BOOL fShow, void* pdc)
UNLOCK_CURSOR_SEM (); UNLOCK_CURSOR_SEM ();
} }
} }
done:
/* Since 5.0.13 */
if (fShow) {
GAL_UnlockSurface(cur_pdc->surface);
}
} }
#else /* defined _MGSCHEMA_SHAREDFB */ #else /* defined _MGSCHEMA_SHAREDFB */
@@ -1124,6 +1136,12 @@ void kernel_ShowCursorForGDI (BOOL fShow, void* pdc)
} }
prc = &cur_pdc->rc_output; prc = &cur_pdc->rc_output;
/* Since 5.0.13 */
if (!fShow) {
GAL_LockSurface(cur_pdc->surface);
}
if (cur_pdc->surface == __gal_screen) { if (cur_pdc->surface == __gal_screen) {
// Under compositing schema, we never call SyncUpdate in // Under compositing schema, we never call SyncUpdate in
// kernel_ShowCursorForGDI for __gal_screen. // kernel_ShowCursorForGDI for __gal_screen.
@@ -1150,6 +1168,11 @@ void kernel_ShowCursorForGDI (BOOL fShow, void* pdc)
// For surface other than screen, we call SyncUpdate. // For surface other than screen, we call SyncUpdate.
GAL_SyncUpdate (cur_pdc->surface); GAL_SyncUpdate (cur_pdc->surface);
} }
/* Since 5.0.13 */
if (fShow) {
GAL_UnlockSurface(cur_pdc->surface);
}
} }
#endif /* not defined _MGSCHEMA_SHAREDFB */ #endif /* not defined _MGSCHEMA_SHAREDFB */
@@ -1228,26 +1251,25 @@ void kernel_ShowCursorForGDI (BOOL fShow, void* pdc)
PDC cur_pdc = (PDC)pdc; PDC cur_pdc = (PDC)pdc;
const RECT* prc = NULL; const RECT* prc = NULL;
prc = &cur_pdc->rc_output;
/* houhh20080827, if --disable-cursor, mginit can not update auto(qvfb). */
#if 0
if (cur_pdc->surface == __gal_screen
&& mgIsServer && (SHAREDRES_TOPMOST_LAYER != __mg_layer))
return;
if (fShow)
GAL_UpdateRect (cur_pdc->surface,
prc->left, prc->top, RECTWP(prc), RECTHP(prc));
#else
if (!mgIsServer && (SHAREDRES_TOPMOST_LAYER != __mg_layer)) { if (!mgIsServer && (SHAREDRES_TOPMOST_LAYER != __mg_layer)) {
return; return;
} }
prc = &cur_pdc->rc_output;
/* Since 5.0.13 */
if (!fShow) {
GAL_LockSurface(cur_pdc->surface);
}
if (fShow) if (fShow)
GAL_UpdateRect (cur_pdc->surface, GAL_UpdateRect (cur_pdc->surface,
prc->left, prc->top, RECTWP(prc), RECTHP(prc)); prc->left, prc->top, RECTWP(prc), RECTHP(prc));
#endif
/* Since 5.0.13 */
if (fShow) {
GAL_UnlockSurface(cur_pdc->surface);
}
} }
#endif /* _MGHAVE_CURSOR */ #endif /* _MGHAVE_CURSOR */
+20 -2
View File
@@ -448,6 +448,11 @@ void kernel_ShowCursorForGDI (BOOL fShow, void* pdc)
prc = &cur_pdc->rc_output; prc = &cur_pdc->rc_output;
/* Since 5.0.13 */
if (!fShow) {
GAL_LockSurface(cur_pdc->surface);
}
if (cur_pdc->surface != __gal_screen) { if (cur_pdc->surface != __gal_screen) {
if (fShow) { if (fShow) {
GAL_UpdateRect (cur_pdc->surface, GAL_UpdateRect (cur_pdc->surface,
@@ -472,7 +477,7 @@ void kernel_ShowCursorForGDI (BOOL fShow, void* pdc)
prc->left, prc->top, RECTWP(prc), RECTHP(prc)); prc->left, prc->top, RECTWP(prc), RECTHP(prc));
//GAL_SyncUpdate (cur_pdc->surface); //GAL_SyncUpdate (cur_pdc->surface);
} }
return; goto done;
} }
if (fShow && nShowCount >= 0 && pCurCsr) { if (fShow && nShowCount >= 0 && pCurCsr) {
@@ -488,6 +493,12 @@ void kernel_ShowCursorForGDI (BOOL fShow, void* pdc)
//GAL_SyncUpdate (cur_pdc->surface); //GAL_SyncUpdate (cur_pdc->surface);
} }
} }
done:
/* Since 5.0.13 */
if (fShow) {
GAL_UnlockSurface(cur_pdc->surface);
}
} }
int GUIAPI ShowCursor (BOOL fShow) int GUIAPI ShowCursor (BOOL fShow)
@@ -516,9 +527,16 @@ void kernel_ShowCursorForGDI(BOOL fShow, void* pdc)
prc = &cur_pdc->rc_output; prc = &cur_pdc->rc_output;
if (fShow) /* Since 5.0.13 */
if (!fShow) {
GAL_LockSurface(cur_pdc->surface);
}
else {
GAL_UpdateRect (cur_pdc->surface, GAL_UpdateRect (cur_pdc->surface,
prc->left, prc->top, RECTWP(prc), RECTHP(prc)); prc->left, prc->top, RECTWP(prc), RECTHP(prc));
/* Since 5.0.13 */
GAL_UnlockSurface(cur_pdc->surface);
}
} }
#endif /* _MGHAVE_CURSOR */ #endif /* _MGHAVE_CURSOR */
+22 -4
View File
@@ -472,11 +472,15 @@ void kernel_ShowCursorForGDI (BOOL fShow, void *pdc)
prc = &cur_pdc->rc_output; prc = &cur_pdc->rc_output;
/* Since 5.0.13 */
if (!fShow) {
GAL_LockSurface(cur_pdc->surface);
}
if (cur_pdc->surface != __gal_screen) { if (cur_pdc->surface != __gal_screen) {
if (fShow) { if (fShow) {
GAL_UpdateRect (cur_pdc->surface, GAL_UpdateRect(cur_pdc->surface,
prc->left, prc->top, RECTWP(prc), RECTHP(prc)); prc->left, prc->top, RECTWP(prc), RECTHP(prc));
// GAL_SyncUpdate (cur_pdc->surface);
} }
} }
else { else {
@@ -500,7 +504,7 @@ void kernel_ShowCursorForGDI (BOOL fShow, void *pdc)
pthread_mutex_unlock(&__mg_mouselock); pthread_mutex_unlock(&__mg_mouselock);
// GAL_SyncUpdate (cur_pdc->surface); // GAL_SyncUpdate (cur_pdc->surface);
} }
return; goto done;
} }
if (fShow && nShowCount >= 0 && pCurCsr) { if (fShow && nShowCount >= 0 && pCurCsr) {
@@ -518,6 +522,12 @@ void kernel_ShowCursorForGDI (BOOL fShow, void *pdc)
// GAL_SyncUpdate (cur_pdc->surface); // GAL_SyncUpdate (cur_pdc->surface);
} }
} }
done:
/* Since 5.0.13 */
if (fShow) {
GAL_UnlockSurface(cur_pdc->surface);
}
} }
int GUIAPI ShowCursor(BOOL fShow) int GUIAPI ShowCursor(BOOL fShow)
@@ -558,9 +568,17 @@ void kernel_ShowCursorForGDI (BOOL fShow, void* pdc)
prc = &cur_pdc->rc_output; prc = &cur_pdc->rc_output;
if (fShow) /* Since 5.0.13 */
if (!fShow) {
GAL_LockSurface(cur_pdc->surface);
}
else {
GAL_UpdateRect (cur_pdc->surface, GAL_UpdateRect (cur_pdc->surface,
prc->left, prc->top, RECTWP(prc), RECTHP(prc)); prc->left, prc->top, RECTWP(prc), RECTHP(prc));
/* Since 5.0.13 */
GAL_UnlockSurface(cur_pdc->surface);
}
} }
#endif /* _MGHAVE_CURSOR */ #endif /* _MGHAVE_CURSOR */
+64 -16
View File
@@ -55,6 +55,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include <assert.h>
#include "common.h" #include "common.h"
@@ -364,7 +365,7 @@ static intptr_t cliAllocZOrderNode (PMAINWIN pWin, const COMPOSITINGINFO* ct_inf
} }
if (ClientRequestEx2 (&req, caption, strlen(caption) + 1, if (ClientRequestEx2 (&req, caption, strlen(caption) + 1,
pWin->surf->shared_header->fd, pWin->surf->fd,
&ret, sizeof (intptr_t), NULL) < 0) &ret, sizeof (intptr_t), NULL) < 0)
return -1; return -1;
#else /* ndef _MGSCHEMA_COMPOSITING */ #else /* ndef _MGSCHEMA_COMPOSITING */
@@ -523,7 +524,7 @@ static intptr_t cliStartTrackPopupMenu (PTRACKMENUINFO ptmi)
info.surf_flags = surf->flags; info.surf_flags = surf->flags;
info.surf_size = surf->shared_header->map_size; info.surf_size = surf->shared_header->map_size;
if (ClientRequestEx2 (&req, NULL, 0, surf->shared_header->fd, if (ClientRequestEx2 (&req, NULL, 0, surf->fd,
&ret, sizeof (intptr_t), NULL) < 0) &ret, sizeof (intptr_t), NULL) < 0)
return -1; return -1;
} }
@@ -836,8 +837,10 @@ static int srvAllocZOrderNode (int cli, HWND hwnd, HWND main_win,
surf->refcount++; surf->refcount++;
} }
else if (fd >= 0) { else if (fd >= 0) {
surf = GAL_AttachSharedRGBSurface (fd, surf_size, surf_flags, TRUE); surf = GAL_AttachSharedRGBSurface (NULL, fd,
close (fd); surf_size, surf_flags, TRUE);
/* Since 5.2.0: keep fd available.
close (fd); */
} }
else { else {
_ERR_PRINTF("KERNEL: not server but fd for shared surface is invalid\n"); _ERR_PRINTF("KERNEL: not server but fd for shared surface is invalid\n");
@@ -845,7 +848,7 @@ static int srvAllocZOrderNode (int cli, HWND hwnd, HWND main_win,
} }
if (surf) { if (surf) {
memdc = CreateMemDCFromSurface (surf); memdc = __mg_create_memdc_for_surface (surf);
if (memdc == HDC_INVALID) { if (memdc == HDC_INVALID) {
if (cli > 0) { if (cli > 0) {
GAL_FreeSurface (surf); GAL_FreeSurface (surf);
@@ -993,12 +996,14 @@ static int srvMoveWindow (int cli, int idx_znode, const RECT* rcWin,
surf->refcount++; surf->refcount++;
} }
else { else {
surf = GAL_AttachSharedRGBSurface (fd, surf_size, surf_flags, TRUE); surf = GAL_AttachSharedRGBSurface (NULL, fd,
close (fd); surf_size, surf_flags, TRUE);
/* Since 5.2.0: keep fd available.
close (fd); */
} }
if (surf) { if (surf) {
memdc = CreateMemDCFromSurface (surf); memdc = __mg_create_memdc_for_surface (surf);
if (memdc == HDC_INVALID) { if (memdc == HDC_INVALID) {
if (cli > 0) { if (cli > 0) {
GAL_FreeSurface (surf); GAL_FreeSurface (surf);
@@ -1013,7 +1018,6 @@ static int srvMoveWindow (int cli, int idx_znode, const RECT* rcWin,
return -1; return -1;
} }
} }
#endif /* def _MGSCHEMA_COMPOSITING */ #endif /* def _MGSCHEMA_COMPOSITING */
ret = dskMoveWindow (cli, idx_znode, memdc, rcWin); ret = dskMoveWindow (cli, idx_znode, memdc, rcWin);
@@ -1520,6 +1524,33 @@ static BOOL _cb_update_rc_nocli (void* context,
} }
#endif /* not defined _MGSCHEMA_COMPOSITING */ #endif /* not defined _MGSCHEMA_COMPOSITING */
/* Since 5.2.0 */
ZORDERNODE *__mg_find_znode_by_client_hwnd (int cli, HWND hwnd)
{
ZORDERINFO* zi = get_zorder_info(cli);
ZORDERNODE* nodes;
if (zi == NULL)
return NULL;
int level, slot = -1;
nodes = GET_ZORDERNODE(zi);
for (level = 0; level < NR_ZORDER_LEVELS; level++) {
slot = zi->first_in_levels[level];
for (; slot > 0; slot = nodes[slot].next) {
if (nodes[slot].cli == cli && nodes[slot].hwnd == hwnd) {
goto found;
}
}
}
return NULL;
found:
assert(slot >= 0);
return nodes + slot;
}
int __mg_remove_all_znodes_of_client (int cli) int __mg_remove_all_znodes_of_client (int cli)
{ {
BOOL has_special = FALSE; BOOL has_special = FALSE;
@@ -2180,7 +2211,7 @@ static int resize_window_surface (PMAINWIN pWin, const RECT* prcResult)
pWin->surf = new_surf; pWin->surf = new_surf;
if (pWin->surf->shared_header) if (pWin->surf->shared_header)
return pWin->surf->shared_header->fd; return pWin->surf->fd;
else else
return 0; return 0;
} }
@@ -2225,9 +2256,10 @@ static int dskMoveGlobalControl (PMAINWIN pCtrl, RECT* prcExpect)
} }
#ifdef _MGSCHEMA_COMPOSITING #ifdef _MGSCHEMA_COMPOSITING
if (pCtrl->surf->shared_header && pCtrl->surf->shared_header->fd >= 0) { /* Since 5.2.0: keep fd available. */
close (pCtrl->surf->shared_header->fd); if (0 && pCtrl->surf->shared_header && pCtrl->surf->fd >= 0) {
pCtrl->surf->shared_header->fd = -1; close (pCtrl->surf->fd);
pCtrl->surf->fd = -1;
} }
#endif #endif
@@ -2256,9 +2288,10 @@ static int dskMoveMainWindow (PMAINWIN pWin, RECT* prcExpect)
__mg_update_dc_on_surface_changed ((HWND)pWin, pWin->surf); __mg_update_dc_on_surface_changed ((HWND)pWin, pWin->surf);
} }
if (pWin->surf->shared_header && pWin->surf->shared_header->fd >= 0) { /* Since 5.2.0: keep fd available. */
close (pWin->surf->shared_header->fd); if (0 && pWin->surf->shared_header && pWin->surf->fd >= 0) {
pWin->surf->shared_header->fd = -1; close (pWin->surf->fd);
pWin->surf->fd = -1;
} }
#endif #endif
@@ -2874,6 +2907,21 @@ int __mg_handle_mouse_hook (int message, WPARAM wParam, LPARAM lParam)
} }
#endif /* deprecated code */ #endif /* deprecated code */
/* used by client to check the validation of a hwnd in the given znode slot. */
BOOL __mg_client_check_znode_hwnd (int slot, HWND hwnd, int cli)
{
BOOL ret = FALSE;
ZORDERINFO* zi = __mg_zorder_info;
ZORDERNODE* nodes;
nodes = GET_ZORDERNODE(zi);
lock_zi_for_read (zi);
if (nodes[slot].hwnd == hwnd && nodes[slot].cli == cli)
ret = TRUE;
unlock_zi_for_read (zi);
return ret;
}
/* used by client to check the validation of a hwnd */ /* used by client to check the validation of a hwnd */
BOOL __mg_client_check_hwnd (HWND hwnd, int cli) BOOL __mg_client_check_hwnd (HWND hwnd, int cli)
{ {
+23 -4
View File
@@ -55,6 +55,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include <time.h>
#include "common.h" #include "common.h"
@@ -141,12 +142,31 @@ BOOL mg_InitDesktop (void)
#include "debug.h" #include "debug.h"
static IDLEHANDLER std_idle_handler; /* According to a bug report, we use sem_timedwait() instead of
calling std_idle_handler for desktop thread.
Otherwise, the desktop might not handle the request from other GUI threads
as soon as possible. */
static BOOL idle_handler_for_desktop_thread (MSGQUEUE *msg_queue, BOOL wait) static BOOL idle_handler_for_desktop_thread (MSGQUEUE *msg_queue, BOOL wait)
{ {
int retv, n = 0;
__mg_update_tick_count (msg_queue); __mg_update_tick_count (msg_queue);
return std_idle_handler (msg_queue, wait);
if (wait) {
struct timespec ts;
if (clock_gettime (CLOCK_REALTIME, &ts) != -1) {
ts.tv_nsec += 10 * 1000 * 1000L; // 10ms
if (ts.tv_nsec >= 1000 * 1000 * 1000L) {
ts.tv_sec += 1;
ts.tv_nsec -= 1000 * 1000 * 1000L;
}
if (sem_timedwait (&msg_queue->wait, &ts) == 0)
return TRUE;
}
}
return n > 0;
} }
void* __kernel_desktop_main (void* data) void* __kernel_desktop_main (void* data)
@@ -162,7 +182,6 @@ void* __kernel_desktop_main (void* data)
/* For bug reported in Issue #116, under threads mode, the idle handler /* For bug reported in Issue #116, under threads mode, the idle handler
for the desktop thread should call __mg_update_tick_count () */ for the desktop thread should call __mg_update_tick_count () */
std_idle_handler = __mg_dsk_msg_queue->OnIdle;
__mg_dsk_msg_queue->OnIdle = idle_handler_for_desktop_thread; __mg_dsk_msg_queue->OnIdle = idle_handler_for_desktop_thread;
/* init desktop window */ /* init desktop window */
+10 -3
View File
@@ -1603,8 +1603,10 @@ static int srvStartTrackPopupMenu (int cli, const RECT* rc, HWND ptmi,
surf->refcount++; surf->refcount++;
} }
else if (fd >= 0) { else if (fd >= 0) {
surf = GAL_AttachSharedRGBSurface (fd, surf_size, surf_flags, TRUE); surf = GAL_AttachSharedRGBSurface (NULL, fd,
close (fd); surf_size, surf_flags, TRUE);
/* Since 5.2.0: keep fd available.
close (fd); */
} }
else { else {
_WRN_PRINTF("not server but fd for shared surface is invalid\n"); _WRN_PRINTF("not server but fd for shared surface is invalid\n");
@@ -1612,7 +1614,7 @@ static int srvStartTrackPopupMenu (int cli, const RECT* rc, HWND ptmi,
} }
if (surf) { if (surf) {
memdc = CreateMemDCFromSurface (surf); memdc = __mg_create_memdc_for_surface (surf);
if (memdc == HDC_INVALID) { if (memdc == HDC_INVALID) {
GAL_FreeSurface (surf); GAL_FreeSurface (surf);
_WRN_PRINTF("failed to create memory dc for znode\n"); _WRN_PRINTF("failed to create memory dc for znode\n");
@@ -1646,11 +1648,14 @@ static int srvStartTrackPopupMenu (int cli, const RECT* rc, HWND ptmi,
menu_nodes [zi->nr_popupmenus].flags = ZOF_TYPE_POPUPMENU; menu_nodes [zi->nr_popupmenus].flags = ZOF_TYPE_POPUPMENU;
menu_nodes [zi->nr_popupmenus].rc = *rc; menu_nodes [zi->nr_popupmenus].rc = *rc;
menu_nodes [zi->nr_popupmenus].hwnd = ptmi; menu_nodes [zi->nr_popupmenus].hwnd = ptmi;
menu_nodes [zi->nr_popupmenus].cli = 0;
#ifdef _MGSCHEMA_COMPOSITING #ifdef _MGSCHEMA_COMPOSITING
menu_nodes [zi->nr_popupmenus].changes = 0; menu_nodes [zi->nr_popupmenus].changes = 0;
menu_nodes [zi->nr_popupmenus].ct = CT_OPAQUE; menu_nodes [zi->nr_popupmenus].ct = CT_OPAQUE;
menu_nodes [zi->nr_popupmenus].ct_arg = 0; menu_nodes [zi->nr_popupmenus].ct_arg = 0;
menu_nodes [zi->nr_popupmenus].mem_dc = memdc; menu_nodes [zi->nr_popupmenus].mem_dc = memdc;
menu_nodes [zi->nr_popupmenus].dirty_age = 0;
menu_nodes [zi->nr_popupmenus].nr_dirty_rcs = 0;
menu_nodes [zi->nr_popupmenus].dirty_rcs = NULL; menu_nodes [zi->nr_popupmenus].dirty_rcs = NULL;
#endif #endif
menu_nodes [zi->nr_popupmenus].priv_data = NULL; menu_nodes [zi->nr_popupmenus].priv_data = NULL;
@@ -2356,6 +2361,8 @@ static int AllocZOrderNodeEx (ZORDERINFO* zi, int cli, HWND hwnd, HWND main_win,
nodes [free_slot].ct = validate_compositing_type (flags, ct); nodes [free_slot].ct = validate_compositing_type (flags, ct);
nodes [free_slot].ct_arg = ct_arg; nodes [free_slot].ct_arg = ct_arg;
nodes [free_slot].mem_dc = mem_dc; nodes [free_slot].mem_dc = mem_dc;
nodes [free_slot].dirty_age = 0;
nodes [free_slot].nr_dirty_rcs = 0;
nodes [free_slot].dirty_rcs = NULL; nodes [free_slot].dirty_rcs = NULL;
#else #else
nodes [free_slot].age = 1; nodes [free_slot].age = 1;
+7 -7
View File
@@ -562,6 +562,13 @@ int GUIAPI InitGUI (int args, const char *agr[])
_is_minigui_running = 1; _is_minigui_running = 1;
/* init timer for tick counter */
step++;
if (!mg_InitTimer()) {
_ERR_PRINTF ("KERNEL>InitGUI: failed to start time counter\n");
goto failure;
}
step++; step++;
if (!SystemThreads()) { if (!SystemThreads()) {
_ERR_PRINTF ("KERNEL>InitGUI: failed to init system threads!\n"); _ERR_PRINTF ("KERNEL>InitGUI: failed to init system threads!\n");
@@ -575,13 +582,6 @@ int GUIAPI InitGUI (int args, const char *agr[])
goto failure; goto failure;
} }
/* init timer for tick counter */
step++;
if (!mg_InitTimer()) {
_ERR_PRINTF ("KERNEL>InitGUI: failed to start time counter\n");
goto failure;
}
SetKeyboardLayout ("default"); SetKeyboardLayout ("default");
SetCursor (GetSystemCursor (IDC_ARROW)); SetCursor (GetSystemCursor (IDC_ARROW));
+11
View File
@@ -955,6 +955,12 @@ checkagain:
goto checkagain; goto checkagain;
} }
else {
/* no message, wait again. */
if (pMsgQueue->OnIdle && !pMsgQueue->OnIdle (pMsgQueue, FALSE)) {
handle_idle_message (pMsgQueue);
}
}
#else /* defined _MGHAVE_VIRTUAL_WINDOW */ #else /* defined _MGHAVE_VIRTUAL_WINDOW */
/* no message, idle */ /* no message, idle */
if (bWait) { if (bWait) {
@@ -964,6 +970,11 @@ checkagain:
} }
goto checkagain; goto checkagain;
} }
else {
if (!pMsgQueue->OnIdle (pMsgQueue, FALE)) {
handle_idle_message (pMsgQueue);
}
}
#endif /* not defined _MGHAVE_VIRTUAL_WINDOW */ #endif /* not defined _MGHAVE_VIRTUAL_WINDOW */
/* no message */ /* no message */
+5 -5
View File
@@ -100,14 +100,14 @@ DWORD __mg_update_tick_count (MSGQUEUE* msg_queue)
/* Since 5.0.0, the desktop only handles caret blinking in MSG_TIMEOUT /* Since 5.0.0, the desktop only handles caret blinking in MSG_TIMEOUT
message, and the interval for the timer of desktop changes to 0.05s. message, and the interval for the timer of desktop changes to 0.05s.
*/ */
if (msg_queue == __mg_dsk_msg_queue) { if (msg_queue == __mg_dsk_msg_queue &&
if (ticks > __mg_dsk_msg_queue->last_ticks + ticks > __mg_dsk_msg_queue->old_tick_count +
DESKTOP_TIMER_INERTVAL) { DESKTOP_TIMER_INERTVAL) {
__mg_dsk_msg_queue->dwState |= QS_DESKTIMER; __mg_dsk_msg_queue->dwState |= QS_DESKTIMER;
#ifdef _MGRM_THREADS /* only wake up desktop for threads mode */ #ifdef _MGRM_THREADS /* only wake up desktop for threads mode */
POST_MSGQ (__mg_dsk_msg_queue); POST_MSGQ (__mg_dsk_msg_queue);
#endif #endif
} __mg_dsk_msg_queue->old_tick_count = ticks;
} }
msg_queue->last_ticks = ticks; msg_queue->last_ticks = ticks;
+1 -1
View File
@@ -7,7 +7,7 @@ EXTRA_DIST= misc.c systext.c rwops.c endianrw.c nposix.c clipboard.c \
libmisc_la_SOURCES = misc.c systext.c rwops.c endianrw.c nposix.c clipboard.c \ libmisc_la_SOURCES = misc.c systext.c rwops.c endianrw.c nposix.c clipboard.c \
math.c about.c license.c anon_file.c rbtree.c map.c \ math.c about.c license.c anon_file.c rbtree.c map.c \
error.c sockio.c error.c sockio.c lock_file.c
SRC_FILES = $(libmisc_la_SOURCES) SRC_FILES = $(libmisc_la_SOURCES)
LIB_NAME=libmisc LIB_NAME=libmisc
+1 -1
View File
@@ -114,7 +114,7 @@ static LRESULT AboutWinProc (HWND hWnd, UINT message,
DrawText (hdc, DrawText (hdc,
"MiniGUI -- a mature cross-platform windowing system " "MiniGUI -- a mature cross-platform windowing system "
"and GUI support system for embedded or IoT devices.\n\n" "and GUI support system for embedded or IoT devices.\n\n"
"Copyright (C) 2002 ~ 2020 FMSoft Co., Ltd.", "Copyright (C) 2002 ~ 2023 FMSoft Co., Ltd.",
-1, &rcClient, DT_WORDBREAK | DT_CENTER); -1, &rcClient, DT_WORDBREAK | DT_CENTER);
EndPaint (hWnd, hdc); EndPaint (hWnd, hdc);
+112
View File
@@ -0,0 +1,112 @@
///////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT NOTICE
//
// The following open source license statement does not apply to any
// entity in the Exception List published by FMSoft.
//
// For more information, please visit:
//
// https://www.fmsoft.cn/exception-list
//
//////////////////////////////////////////////////////////////////////////////
/*
* This file is part of MiniGUI, a mature cross-platform windowing
* and Graphics User Interface (GUI) support system for embedded systems
* and smart IoT devices.
*
* Copyright (C) 2023, Beijing FMSoft Technologies Co., Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Or,
*
* As this program is a library, any link to this program must follow
* GNU General Public License version 3 (GPLv3). If you cannot accept
* GPLv3, you need to be licensed from FMSoft.
*
* If you have got a commercial license of this program, please use it
* under the terms and conditions of the commercial license.
*
* For more information about the commercial license, please refer to
* <http://www.minigui.com/blog/minigui-licensing-policy/>.
*/
/*
** lock_file.c: This file include functions for locking/unlocking a file.
**
** Create date: 2023/09/10
**
** Current maintainer: Wei Yongming.
*/
#include "common.h"
#ifndef __NOUNIX__
#include "misc.h"
#include <unistd.h>
#include <sys/file.h>
#include <fcntl.h>
#include <errno.h>
void __mg_lock_file_for_read(int fd)
{
struct flock lock;
lock.l_type = F_RDLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
while (fcntl(fd, F_SETLKW, &lock) == -1 && errno == EINTR);
}
void __mg_unlock_file_for_read(int fd)
{
struct flock lock;
lock.l_type = F_UNLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
fcntl(fd, F_SETLK, &lock);
}
void __mg_lock_file_for_write(int fd)
{
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
while (fcntl(fd, F_SETLKW, &lock) == -1 && errno == EINTR);
}
void __mg_unlock_file_for_write(int fd)
{
struct flock lock;
lock.l_type = F_UNLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
fcntl(fd, F_SETLK, &lock);
}
#endif /* __NOUNIX__ */
+5 -5
View File
@@ -243,7 +243,7 @@ map_entry_t* __mg_map_find (map_t* map, const void* key)
return entry; return entry;
} }
int __mg_map_erase (map_t* map, void* key) int __mg_map_erase (map_t* map, const void* key)
{ {
int retval = -1; int retval = -1;
map_entry_t* entry = NULL; map_entry_t* entry = NULL;
@@ -299,7 +299,7 @@ ret:
return retval; return retval;
} }
int __mg_map_insert_ex (map_t* map, const void* key, map_entry_t* __mg_map_insert_ex2 (map_t* map, const void* key,
const void* val, free_val_fn free_val_alt) const void* val, free_val_fn free_val_alt)
{ {
map_entry_t **pentry; map_entry_t **pentry;
@@ -307,7 +307,7 @@ int __mg_map_insert_ex (map_t* map, const void* key,
map_entry_t *parent; map_entry_t *parent;
if (map == NULL) if (map == NULL)
return -1; return NULL;
WRLOCK_MAP (map); WRLOCK_MAP (map);
@@ -317,7 +317,7 @@ int __mg_map_insert_ex (map_t* map, const void* key,
while (*pentry) { while (*pentry) {
int ret; int ret;
if (map->comp_key) if (map->comp_key)
ret = map->comp_key (key, (*pentry)->key); ret = map->comp_key (key, (*pentry)->key);
else else
@@ -354,7 +354,7 @@ int __mg_map_insert_ex (map_t* map, const void* key,
} }
UNLOCK_MAP (map); UNLOCK_MAP (map);
return 0; return entry;
} }
int __mg_map_find_replace_or_insert (map_t* map, const void* key, int __mg_map_find_replace_or_insert (map_t* map, const void* key,
-84
View File
@@ -495,28 +495,6 @@ DWORD __mg_os_get_time_ticks (void)
return (current - startup_time_win32) / 10; return (current - startup_time_win32) / 10;
} }
#if 0 /* deprecated code */
DWORD __mg_os_get_elapsed_ms (void)
{
static DWORD last;
DWORD current = timeGetTime();
DWORD elapsed;
if (current >= last) {
elapsed = current - last;
return elapsed;
}
else {
/* overflowed */
elapsed = BITMASK_DWORD - last;
elapsed += current;
}
last = current;
return elapsed;
}
#endif /* deprecated code */
#elif defined (HAVE_CLOCK_GETTIME) #elif defined (HAVE_CLOCK_GETTIME)
static struct timespec timeval_startup; static struct timespec timeval_startup;
@@ -573,68 +551,6 @@ DWORD __mg_os_get_time_ticks (void)
return ds * 100 + dms; return ds * 100 + dms;
} }
#if 0 /* deprecated code */
DWORD __mg_os_get_elapsed_ms (void)
{
static struct timespec last;
DWORD ds, dms;
struct timespec current;
clock_gettime (CLOCK_MONOTONIC, &current);
ds = (current.tv_sec - last.tv_sec);
if (current.tv_sec == last.tv_sec) {
dms = (current.tv_nsec - last.tv_nsec) / 1000000L;
}
else if (current.tv_nsec >= last.tv_nsec) {
dms = (current.tv_nsec - last.tv_nsec) / 1000000L;
}
else {
assert (ds > 0);
ds--;
dms = 1000L - (last.tv_nsec - current.tv_nsec) / 1000000L;
}
last = current;
return ds * 1000 + dms;
}
#include <unistd.h>
#include <poll.h>
#include <sys/time.h>
static struct timeval timeval_startup;
void __mg_os_start_time(void)
{
gettimeofday(&timeval_startup, NULL);
}
DWORD __mg_os_get_time_ms(void)
{
DWORD ds, dms;
struct timeval current;
gettimeofday(&current, NULL);
ds = (current.tv_sec - timeval_startup.tv_sec);
if (current.tv_sec == timeval_startup.tv_sec) {
dms = (current.tv_usec - timeval_startup.tv_usec) / 1000L;
}
else if (current.tv_usec >= timeval_startup.tv_usec) {
dms = (current.tv_usec - timeval_startup.tv_usec) / 1000L;
}
else {
assert(ds > 0);
ds--;
dms = 1000L - (timeval_startup.tv_usec - current.tv_usec) / 1000L;
}
return ds * 1000 + dms;
}
#endif /* deprecated code */
#else /* defined HAVE_CLOCK_GETTIME */ #else /* defined HAVE_CLOCK_GETTIME */
#error "Please implement __mg_os_start_time and __mg_os_get_time_ticks for your OS" #error "Please implement __mg_os_start_time and __mg_os_get_time_ticks for your OS"
+4
View File
@@ -96,8 +96,12 @@ static BITMAP_TYPE_INFO bitmap_types [MAX_BITMAP_TYPES] =
{ "jpeg", __mg_init_jpg, __mg_load_jpg, __mg_cleanup_jpg, __mg_save_jpg, __mg_check_jpg }, { "jpeg", __mg_init_jpg, __mg_load_jpg, __mg_cleanup_jpg, __mg_save_jpg, __mg_check_jpg },
#endif #endif
#ifdef _MGIMAGE_PNG #ifdef _MGIMAGE_PNG
#if _MGLIBPNG_VER == 16
{ "png", __mg_init_png, __mg_load_png, __mg_cleanup_png, __mg_save_png, __mg_check_png },
#else
{ "png", __mg_init_png, __mg_load_png, __mg_cleanup_png, NULL, __mg_check_png }, { "png", __mg_init_png, __mg_load_png, __mg_cleanup_png, NULL, __mg_check_png },
#endif #endif
#endif
#ifdef _MGIMAGE_WEBP #ifdef _MGIMAGE_WEBP
{ "webp", __mg_init_webp, __mg_load_webp, __mg_cleanup_webp, NULL, __mg_check_webp }, { "webp", __mg_init_webp, __mg_load_webp, __mg_cleanup_webp, NULL, __mg_check_webp },
#endif #endif
+281
View File
File diff suppressed because it is too large Load Diff
+79 -75
View File
@@ -462,99 +462,100 @@ static void RLEClipBlit(int w, Uint8 *srcbuf, GAL_Surface *dst,
} }
/* blit a colorkeyed RLE surface */ /* blit a colorkeyed RLE surface */
int GAL_RLEBlit(GAL_Surface *src, GAL_Rect *srcrect, int GAL_RLEBlit(GAL_VideoDevice *video, GAL_Surface *src, GAL_Rect *srcrect,
GAL_Surface *dst, GAL_Rect *dstrect) GAL_Surface *dst, GAL_Rect *dstrect)
{ {
Uint8 *dstbuf; (void)video;
Uint8 *srcbuf;
int x, y;
int w = src->w;
unsigned alpha;
/* Set up the source and destination pointers */ Uint8 *dstbuf;
x = dstrect->x; Uint8 *srcbuf;
y = dstrect->y; int x, y;
dstbuf = (Uint8 *)dst->pixels int w = src->w;
+ y * dst->pitch + x * src->format->BytesPerPixel; unsigned alpha;
srcbuf = (Uint8 *)src->map->sw_data->aux_data;
{ /* Set up the source and destination pointers */
/* skip lines at the top if neccessary */ x = dstrect->x;
int vskip = srcrect->y; y = dstrect->y;
int ofs = 0; dstbuf = (Uint8 *)dst->pixels
if(vskip) { + y * dst->pitch + x * src->format->BytesPerPixel;
srcbuf = (Uint8 *)src->map->sw_data->aux_data;
{
/* skip lines at the top if neccessary */
int vskip = srcrect->y;
int ofs = 0;
if(vskip) {
#define RLESKIP(bpp, Type) \ #define RLESKIP(bpp, Type) \
for(;;) { \ for(;;) { \
int run; \ int run; \
ofs += *(Type *)srcbuf; \ ofs += *(Type *)srcbuf; \
run = ((Type *)srcbuf)[1]; \ run = ((Type *)srcbuf)[1]; \
srcbuf += sizeof(Type) * 2; \ srcbuf += sizeof(Type) * 2; \
if(run) { \ if(run) { \
srcbuf += run * bpp; \ srcbuf += run * bpp; \
ofs += run; \ ofs += run; \
} else if(!ofs) \ } else if(!ofs) \
goto done; \ goto done; \
if(ofs == w) { \ if(ofs == w) { \
ofs = 0; \ ofs = 0; \
if(!--vskip) \ if(!--vskip) \
break; \ break; \
} \ } \
} }
switch(src->format->BytesPerPixel) { switch(src->format->BytesPerPixel) {
case 1: RLESKIP(1, Uint8); break; case 1: RLESKIP(1, Uint8); break;
case 2: RLESKIP(2, Uint8); break; case 2: RLESKIP(2, Uint8); break;
case 3: RLESKIP(3, Uint8); break; case 3: RLESKIP(3, Uint8); break;
case 4: RLESKIP(4, Uint16); break; case 4: RLESKIP(4, Uint16); break;
} }
#undef RLESKIP #undef RLESKIP
}
} }
}
alpha = (src->flags & GAL_SRCALPHA) == GAL_SRCALPHA alpha = (src->flags & GAL_SRCALPHA) == GAL_SRCALPHA
? src->format->alpha : 255; ? src->format->alpha : 255;
/* if left or right edge clipping needed, call clip blit */ /* if left or right edge clipping needed, call clip blit */
if ( srcrect->x || srcrect->w != src->w ) { if ( srcrect->x || srcrect->w != src->w ) {
RLEClipBlit(w, srcbuf, dst, dstbuf, srcrect, alpha); RLEClipBlit(w, srcbuf, dst, dstbuf, srcrect, alpha);
} else { } else {
GAL_PixelFormat *fmt = src->format; GAL_PixelFormat *fmt = src->format;
#define RLEBLIT(bpp, Type, do_blit) \ #define RLEBLIT(bpp, Type, do_blit) \
do { \ do { \
int linecount = srcrect->h; \ int linecount = srcrect->h; \
int ofs = 0; \ int ofs = 0; \
for(;;) { \ for(;;) { \
unsigned run; \ unsigned run; \
ofs += *(Type *)srcbuf; \ ofs += *(Type *)srcbuf; \
run = ((Type *)srcbuf)[1]; \ run = ((Type *)srcbuf)[1]; \
srcbuf += 2 * sizeof(Type); \ srcbuf += 2 * sizeof(Type); \
if(run) { \ if(run) { \
do_blit(dstbuf + ofs * bpp, srcbuf, run, bpp, alpha); \ do_blit(dstbuf + ofs * bpp, srcbuf, run, bpp, alpha); \
srcbuf += run * bpp; \ srcbuf += run * bpp; \
ofs += run; \ ofs += run; \
} else if(!ofs) \ } else if(!ofs) \
break; \ break; \
if(ofs == w) { \ if(ofs == w) { \
ofs = 0; \ ofs = 0; \
dstbuf += dst->pitch; \ dstbuf += dst->pitch; \
if(!--linecount) \ if(!--linecount) \
break; \ break; \
} \
} \ } \
} while(0) } \
} while(0)
CHOOSE_BLIT(RLEBLIT, alpha, fmt); CHOOSE_BLIT(RLEBLIT, alpha, fmt);
#undef RLEBLIT #undef RLEBLIT
} }
done: done:
return(0); return(0);
} }
#undef OPAQUE_BLIT #undef OPAQUE_BLIT
@@ -720,9 +721,12 @@ static void RLEAlphaClipBlit(int w, Uint8 *srcbuf, GAL_Surface *dst,
} }
/* blit a pixel-alpha RLE surface */ /* blit a pixel-alpha RLE surface */
int GAL_RLEAlphaBlit(GAL_Surface *src, GAL_Rect *srcrect, int GAL_RLEAlphaBlit(GAL_VideoDevice *video,
GAL_Surface *dst, GAL_Rect *dstrect) GAL_Surface *src, GAL_Rect *srcrect,
GAL_Surface *dst, GAL_Rect *dstrect)
{ {
(void)video;
int x, y; int x, y;
int w = src->w; int w = src->w;
Uint8 *srcbuf, *dstbuf; Uint8 *srcbuf, *dstbuf;
@@ -1502,7 +1506,7 @@ void GAL_UnRLESurface(GAL_Surface *surface, int recode)
full.h = surface->h; full.h = surface->h;
alpha_flag = surface->flags & GAL_SRCALPHA; alpha_flag = surface->flags & GAL_SRCALPHA;
surface->flags &= ~GAL_SRCALPHA; /* opaque blit */ surface->flags &= ~GAL_SRCALPHA; /* opaque blit */
GAL_RLEBlit(surface, &full, surface, &full); GAL_RLEBlit(NULL, surface, &full, surface, &full);
surface->flags |= alpha_flag; surface->flags |= alpha_flag;
} else } else
UnRLEAlpha(surface); UnRLEAlpha(surface);
+6 -4
View File
@@ -47,9 +47,11 @@
/* Useful functions and variables from RLEaccel.c */ /* Useful functions and variables from RLEaccel.c */
extern int GAL_RLESurface(GAL_Surface *surface); extern int GAL_RLESurface(GAL_Surface *surface);
extern int GAL_RLEBlit(GAL_Surface *src, GAL_Rect *srcrect, extern int GAL_RLEBlit(GAL_VideoDevice *video,
GAL_Surface *dst, GAL_Rect *dstrect); GAL_Surface *src, GAL_Rect *srcrect,
extern int GAL_RLEAlphaBlit(GAL_Surface *src, GAL_Rect *srcrect, GAL_Surface *dst, GAL_Rect *dstrect);
GAL_Surface *dst, GAL_Rect *dstrect); extern int GAL_RLEAlphaBlit(GAL_VideoDevice *video,
GAL_Surface *src, GAL_Rect *srcrect,
GAL_Surface *dst, GAL_Rect *dstrect);
extern void GAL_UnRLESurface(GAL_Surface *surface, int recode); extern void GAL_UnRLESurface(GAL_Surface *surface, int recode);
-2
View File
@@ -157,8 +157,6 @@ static GAL_VideoDevice *BF533_CreateDevice(int devindex)
device->AllocHWSurface = BF533_AllocHWSurface; device->AllocHWSurface = BF533_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = BF533_FreeHWSurface; device->FreeHWSurface = BF533_FreeHWSurface;
device->UpdateRects = BF533_UpdateRects; device->UpdateRects = BF533_UpdateRects;
+16 -7
View File
@@ -57,9 +57,12 @@
#include "memops.h" #include "memops.h"
/* The general purpose software blit routine */ /* The general purpose software blit routine */
static int GAL_SoftBlit(GAL_Surface *src, GAL_Rect *srcrect, static int GAL_SoftBlit(GAL_VideoDevice *video,
GAL_Surface *dst, GAL_Rect *dstrect) GAL_Surface *src, GAL_Rect *srcrect,
GAL_Surface *dst, GAL_Rect *dstrect)
{ {
(void)video;
int okay; int okay;
/* Everything is okay at the beginning... */ /* Everything is okay at the beginning... */
@@ -166,12 +169,14 @@ static void GAL_BlitCopyOverlap(GAL_BlitInfo *info)
#ifdef _MGUSE_PIXMAN #ifdef _MGUSE_PIXMAN
#include <pixman.h> #include <pixman.h>
static int GAL_PixmanBlit (struct GAL_Surface *src, GAL_Rect *srcrect, static int GAL_PixmanBlit(GAL_VideoDevice *video,
struct GAL_Surface *src, GAL_Rect *srcrect,
struct GAL_Surface *dst, GAL_Rect *dstrect); struct GAL_Surface *dst, GAL_Rect *dstrect);
#endif #endif
/* Figure out which of many blit routines to set up on a surface */ /* Figure out which of many blit routines to set up on a surface */
int GAL_CalculateBlit(GAL_Surface *surface) int GAL_CalculateBlit(GAL_Surface *surface, const GAL_Rect *srcrc,
const GAL_Rect *dstrc, DWORD op)
{ {
int blit_index; int blit_index;
GAL_VideoDevice *src_video, *dst_video, *cur_video = NULL; GAL_VideoDevice *src_video, *dst_video, *cur_video = NULL;
@@ -242,7 +247,8 @@ int GAL_CalculateBlit(GAL_Surface *surface)
if (hw_blit_ok && cur_video) { if (hw_blit_ok && cur_video) {
GAL_VideoDevice *video = cur_video; GAL_VideoDevice *video = cur_video;
GAL_VideoDevice *this = cur_video; GAL_VideoDevice *this = cur_video;
video->CheckHWBlit (this, surface, surface->map->dst); video->CheckHWBlit (this, surface, srcrc,
surface->map->dst, dstrc, op);
} }
} }
@@ -343,7 +349,7 @@ int GAL_SetupBlitting (GAL_Surface *src, GAL_Surface *dst, DWORD ops)
else else
src->msk_img = NULL; src->msk_img = NULL;
ops &= COLOR_BLEND_FLAGS_MASK; ops &= COLOR_BLEND_PIXMAN_MASK;
if (ops == COLOR_BLEND_LEGACY) { if (ops == COLOR_BLEND_LEGACY) {
if ((src->flags & GAL_SRCPIXELALPHA) && src->format->Amask && src != dst) { if ((src->flags & GAL_SRCPIXELALPHA) && src->format->Amask && src != dst) {
src->pix_op = PIXMAN_OP_OVER; src->pix_op = PIXMAN_OP_OVER;
@@ -381,9 +387,12 @@ int GAL_CleanupBlitting (GAL_Surface *src, GAL_Surface *dst)
return 0; return 0;
} }
static int GAL_PixmanBlit (struct GAL_Surface *src, GAL_Rect *srcrect, static int GAL_PixmanBlit (GAL_VideoDevice *video,
struct GAL_Surface *src, GAL_Rect *srcrect,
struct GAL_Surface *dst, GAL_Rect *dstrect) struct GAL_Surface *dst, GAL_Rect *dstrect)
{ {
(void)video;
pixman_image_t *src_img = src->pix_img, *dst_img = dst->pix_img; pixman_image_t *src_img = src->pix_img, *dst_img = dst->pix_img;
pixman_image_t *msk_img; pixman_image_t *msk_img;
pixman_op_t op; pixman_op_t op;
+6 -1
View File
@@ -80,7 +80,11 @@ typedef struct GAL_BlitMap {
Uint8 *table; Uint8 *table;
GAL_blit hw_blit; GAL_blit hw_blit;
GAL_blit sw_blit; GAL_blit sw_blit;
GAL_VideoDevice *video;
/* data for hardware blittor */
struct private_hwaccel *hw_data; struct private_hwaccel *hw_data;
/* data for software blittor */
struct private_swaccel *sw_data; struct private_swaccel *sw_data;
int identity; int identity;
@@ -94,7 +98,8 @@ typedef struct GAL_BlitMap {
#include "blit_A.h" #include "blit_A.h"
/* Functions found in GAL_blit.c */ /* Functions found in GAL_blit.c */
extern int GAL_CalculateBlit(GAL_Surface *surface); extern int GAL_CalculateBlit(GAL_Surface *surface, const GAL_Rect *srcrc,
const GAL_Rect *dstrc, DWORD op);
/* Functions found in GAL_blit_{0,1,N,A}.c */ /* Functions found in GAL_blit_{0,1,N,A}.c */
extern GAL_loblit GAL_CalculateBlit0(GAL_Surface *surface, int complex); extern GAL_loblit GAL_CalculateBlit0(GAL_Surface *surface, int complex);
-2
View File
@@ -236,8 +236,6 @@ static GAL_VideoDevice *COMMLCD_CreateDevice (int devindex)
device->FreeHWSurface = COMMLCD_FreeHWSurface; device->FreeHWSurface = COMMLCD_FreeHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->UpdateRects = NULL; device->UpdateRects = NULL;
device->SyncUpdate = NULL; device->SyncUpdate = NULL;
+3 -4
View File
@@ -107,7 +107,7 @@ static int DFB_AllocHWSurface (_THIS, GAL_Surface *surface);
static void DFB_FreeHWSurface (_THIS, GAL_Surface *surface); static void DFB_FreeHWSurface (_THIS, GAL_Surface *surface);
static int DFB_HWAccelBlit (GAL_Surface *src, GAL_Rect *srcrect, GAL_Surface *dst, GAL_Rect *dstrect); static int DFB_HWAccelBlit (GAL_Surface *src, GAL_Rect *srcrect, GAL_Surface *dst, GAL_Rect *dstrect);
static int DFB_CheckHWBlit (_THIS, GAL_Surface * src, GAL_Surface * dst); static int DFB_CheckHWBlit (_THIS, GAL_Surface * src, GAL_Surface * dst);
static int DFB_FillHWRect (_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color); static int DFB_FillHWRect (_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color);
/* common dfb function address */ /* common dfb function address */
GAL_FunctionTable mgGALFuncTable = { GAL_FunctionTable mgGALFuncTable = {
@@ -173,8 +173,6 @@ static GAL_VideoDevice *DFB_CreateDevice (int devindex)
device->AllocHWSurface = DFB_AllocHWSurface; device->AllocHWSurface = DFB_AllocHWSurface;
device->CheckHWBlit = DFB_CheckHWBlit; device->CheckHWBlit = DFB_CheckHWBlit;
device->FillHWRect = DFB_FillHWRect; device->FillHWRect = DFB_FillHWRect;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = DFB_FreeHWSurface; device->FreeHWSurface = DFB_FreeHWSurface;
device->free = DFB_DeleteDevice; device->free = DFB_DeleteDevice;
@@ -518,7 +516,8 @@ static void DFB_RequestHWSurface (_THIS, const REQ_HWSURFACE* request, REP_HWSUR
} }
} }
static int DFB_FillHWRect (_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color) static int
DFB_FillHWRect (_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color)
{ {
if ((dst->hwdata == NULL && dst != GAL_VideoSurface)) { if ((dst->hwdata == NULL && dst != GAL_VideoSurface)) {
fprintf(stderr, "NEWGAL>DFB: src_hwdata or dst_hwdata NULL\n"); fprintf(stderr, "NEWGAL>DFB: src_hwdata or dst_hwdata NULL\n");
+1 -1
View File
@@ -111,7 +111,7 @@ typedef struct _GAL_FunctionTable {
int (*AllocHWSurface)(_THIS, GAL_Surface *surface); int (*AllocHWSurface)(_THIS, GAL_Surface *surface);
int (*CheckHWBlit)(_THIS, GAL_Surface *src, GAL_Surface *dst); int (*CheckHWBlit)(_THIS, GAL_Surface *src, GAL_Surface *dst);
int (*HWAccelBlit)(GAL_Surface *src, GAL_Rect *srcrect, GAL_Surface *dst, GAL_Rect *dstrect); int (*HWAccelBlit)(GAL_Surface *src, GAL_Rect *srcrect, GAL_Surface *dst, GAL_Rect *dstrect);
int (*FillHWRect)(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color); int (*FillHWRect)(_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color);
int (*SetHWColorKey)(_THIS, GAL_Surface *surface, Uint32 key); int (*SetHWColorKey)(_THIS, GAL_Surface *surface, Uint32 key);
int (*SetHWAlpha)(_THIS, GAL_Surface *surface, Uint8 value); int (*SetHWAlpha)(_THIS, GAL_Surface *surface, Uint8 value);
void (*FreeHWSurface)(_THIS, GAL_Surface *surface); void (*FreeHWSurface)(_THIS, GAL_Surface *surface);
+913 -365
View File
File diff suppressed because it is too large Load Diff
+23 -7
View File
@@ -53,10 +53,12 @@
#ifndef _MGSCHEMA_COMPOSITING #ifndef _MGSCHEMA_COMPOSITING
#include <fcntl.h> /* For O_* constants */ #include <fcntl.h> /* For O_* constants */
#include <sys/stat.h> /* For mode constants */ #include <sys/stat.h> /* For mode constants */
#endif
#include <pthread.h>
#include <semaphore.h> #include <semaphore.h>
#define SEM_UPDATE_LOCK "mginit-drm-update" #define SEM_UPDATE_LOCK "minigui-drm-update"
#endif
/* Hidden "this" pointer for the video functions */ /* Hidden "this" pointer for the video functions */
#define _THIS GAL_VideoDevice *this #define _THIS GAL_VideoDevice *this
@@ -85,9 +87,10 @@ typedef struct GAL_PrivateVideoData {
/* the global names of real screen and shadow screen */ /* the global names of real screen and shadow screen */
uint32_t real_name, shadow_name; uint32_t real_name, shadow_name;
sem_t *update_lock;
#endif /* not defined _MGSCHEMA_COMPOSITING */ #endif /* not defined _MGSCHEMA_COMPOSITING */
sem_t *update_lock;
#if !IS_SHAREDFB_SCHEMA_PROCS #if !IS_SHAREDFB_SCHEMA_PROCS
RECT dirty_rc; RECT dirty_rc;
#endif #endif
@@ -100,8 +103,11 @@ typedef struct GAL_PrivateVideoData {
uint32_t cap_cursor_width; uint32_t cap_cursor_width;
uint32_t cap_cursor_height; uint32_t cap_cursor_height;
uint32_t cap_dumb:1; uint32_t cap_dumb:1;
uint32_t cap_vblank_high_crtc:1;
uint32_t dbl_buff:1; uint32_t dbl_buff:1;
uint32_t dirty_fb_ok:1;
uint32_t scanout_buff_id; uint32_t scanout_buff_id;
int crtc_idx;
void* exdrv_handle; void* exdrv_handle;
DrmDriverOps* driver_ops; DrmDriverOps* driver_ops;
@@ -113,10 +119,20 @@ typedef struct GAL_PrivateVideoData {
DrmModeInfo* saved_info; DrmModeInfo* saved_info;
drmModeCrtc* saved_crtc; drmModeCrtc* saved_crtc;
#if 0 /* deprecated code */ int min_pixels_using_hwaccl;
uint32_t console_buff_id;
uint8_t* scanout_fb; /* async updater */
#endif /* deprecated code */ int updater_ready;
int update_interval;
RECT update_rect;
pthread_t update_thd;
sem_t sync_sem;
#ifdef _DEBUG
struct timespec ts_start;
unsigned frames;
#endif
} DrmVideoData; } DrmVideoData;
#endif /* _NEWGAL_DRIVIDEO_H */ #endif /* _NEWGAL_DRIVIDEO_H */
+41
View File
@@ -0,0 +1,41 @@
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
* Framework for buffer objects that can be shared across devices/subsystems.
*
* Copyright(C) 2015 Intel Ltd
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _DMA_BUF_UAPI_H_
#define _DMA_BUF_UAPI_H_
#include <linux/types.h>
/* begin/end dma-buf functions used for userspace mmap. */
struct dma_buf_sync {
__u64 flags;
};
#define DMA_BUF_SYNC_READ (1 << 0)
#define DMA_BUF_SYNC_WRITE (2 << 0)
#define DMA_BUF_SYNC_RW (DMA_BUF_SYNC_READ | DMA_BUF_SYNC_WRITE)
#define DMA_BUF_SYNC_START (0 << 2)
#define DMA_BUF_SYNC_END (1 << 2)
#define DMA_BUF_SYNC_VALID_FLAGS_MASK \
(DMA_BUF_SYNC_RW | DMA_BUF_SYNC_END)
#define DMA_BUF_BASE 'b'
#define DMA_BUF_IOCTL_SYNC _IOW(DMA_BUF_BASE, 0, struct dma_buf_sync)
#endif
-2
View File
@@ -139,8 +139,6 @@ static GAL_VideoDevice *DUMMY_CreateDevice(int devindex)
device->AllocHWSurface = DUMMY_AllocHWSurface; device->AllocHWSurface = DUMMY_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = DUMMY_FreeHWSurface; device->FreeHWSurface = DUMMY_FreeHWSurface;
device->free = DUMMY_DeleteDevice; device->free = DUMMY_DeleteDevice;
-2
View File
@@ -183,8 +183,6 @@ static GAL_VideoDevice *EM85XXOSD_CreateDevice(int devindex)
device->AllocHWSurface = EM85XXOSD_AllocHWSurface; device->AllocHWSurface = EM85XXOSD_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = EM85XXOSD_FreeHWSurface; device->FreeHWSurface = EM85XXOSD_FreeHWSurface;
device->UpdateRects = EM85XXOSD_UpdateRects; device->UpdateRects = EM85XXOSD_UpdateRects;
-2
View File
@@ -454,8 +454,6 @@ static GAL_VideoDevice *EM85XXYUV_CreateDevice(int devindex)
device->AllocHWSurface = EM85XXYUV_AllocHWSurface; device->AllocHWSurface = EM85XXYUV_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = EM85XXYUV_FreeHWSurface; device->FreeHWSurface = EM85XXYUV_FreeHWSurface;
device->UpdateRects = EM85XXYUV_UpdateRects; device->UpdateRects = EM85XXYUV_UpdateRects;
+3 -4
View File
@@ -69,7 +69,7 @@ static int GFX_VideoInit(_THIS, GAL_PixelFormat * vformat);
static GAL_Rect ** GFX_ListModes(_THIS, GAL_PixelFormat * format, Uint32 flags); static GAL_Rect ** GFX_ListModes(_THIS, GAL_PixelFormat * format, Uint32 flags);
static GAL_Surface * GFX_SetVideoMode(_THIS, GAL_Surface * current, int width, int height, int bpp, Uint32 flags); static GAL_Surface * GFX_SetVideoMode(_THIS, GAL_Surface * current, int width, int height, int bpp, Uint32 flags);
static void GFX_VideoQuit(_THIS); static void GFX_VideoQuit(_THIS);
static int GFX_FillHWRect(_THIS, GAL_Surface * dst, GAL_Rect * rect, Uint32 color); static int GFX_FillHWRect(_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color);
static int GFX_AllocHWSurface(_THIS, GAL_Surface * surface); static int GFX_AllocHWSurface(_THIS, GAL_Surface * surface);
static void GFX_FreeHWSurface(_THIS, GAL_Surface * surface); static void GFX_FreeHWSurface(_THIS, GAL_Surface * surface);
static int GFX_HWAccelBlit(GAL_Surface * src, GAL_Rect * srcrect, GAL_Surface * dst, GAL_Rect * dstrect); static int GFX_HWAccelBlit(GAL_Surface * src, GAL_Rect * srcrect, GAL_Surface * dst, GAL_Rect * dstrect);
@@ -112,8 +112,6 @@ static GAL_VideoDevice * GFX_CreateDevice(int devindex)
this->AllocHWSurface = GFX_AllocHWSurface; this->AllocHWSurface = GFX_AllocHWSurface;
this->CheckHWBlit = GFX_CheckHWBlit; this->CheckHWBlit = GFX_CheckHWBlit;
this->FillHWRect = GFX_FillHWRect; this->FillHWRect = GFX_FillHWRect;
this->SetHWColorKey = NULL;
this->SetHWAlpha = NULL;
this->UpdateRects = NULL; this->UpdateRects = NULL;
this->FreeHWSurface = GFX_FreeHWSurface; this->FreeHWSurface = GFX_FreeHWSurface;
@@ -298,7 +296,8 @@ static void GFX_VideoQuit (_THIS)
return; return;
} }
static int GFX_FillHWRect(_THIS, GAL_Surface * surface, GAL_Rect * rect, Uint32 color) static int
GFX_FillHWRect(_THIS, GAL_Surface *surface, const GAL_Rect *rect, Uint32 color)
{ {
struct GFXEngine_FillRectangle_type fill_param; struct GFXEngine_FillRectangle_type fill_param;
struct GFXEngine_Surface_type surface_param; struct GFXEngine_Surface_type surface_param;
+19 -11
View File
@@ -68,13 +68,7 @@ static void WaitIdle(_THIS)
tdfx_waitidle(); tdfx_waitidle();
} }
/* Set video mem colorkey and accelerated blit function */ static int FillHWRect(_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color)
static int SetHWColorKey(_THIS, GAL_Surface *surface, Uint32 key)
{
return(0);
}
static int FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color)
{ {
int bpp; int bpp;
char *dst_base; char *dst_base;
@@ -106,10 +100,9 @@ static int FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color)
return(0); return(0);
} }
static int HWAccelBlit(GAL_Surface *src, GAL_Rect *srcrect, static int HWAccelBlit(_THIS, GAL_Surface *src, GAL_Rect *srcrect,
GAL_Surface *dst, GAL_Rect *dstrect) GAL_Surface *dst, GAL_Rect *dstrect)
{ {
GAL_VideoDevice *this = __mg_current_video;
int bpp; int bpp;
Uint32 src_format; Uint32 src_format;
/* Uint32 dst_format; */ /* Uint32 dst_format; */
@@ -175,8 +168,11 @@ static int HWAccelBlit(GAL_Surface *src, GAL_Rect *srcrect,
return(0); return(0);
} }
static int CheckHWBlit(_THIS, GAL_Surface *src, GAL_Surface *dst) static int CheckHWBlit(_THIS, GAL_Surface *src, const GAL_Rect *srcrc,
GAL_Surface *dst, const GAL_Rect *dstrc, DWORD op)
{ {
(void)srcrc;
(void)dstrc;
int accelerated; int accelerated;
/* Set initial acceleration on */ /* Set initial acceleration on */
@@ -194,11 +190,24 @@ static int CheckHWBlit(_THIS, GAL_Surface *src, GAL_Surface *dst)
} }
} }
/* color blend, logical operation, and scaling filter are not supported */
if ((op & COLOR_BLEND_MASK) ||
((op & COLOR_LOGICOP_MASK) != COLOR_LOGICOP_COPY) ||
(op & SCALING_FILTER_MASK)) {
src->flags &= ~GAL_HWACCEL;
}
/* Check to see if final surface blit is accelerated */ /* Check to see if final surface blit is accelerated */
accelerated = !!(src->flags & GAL_HWACCEL); accelerated = !!(src->flags & GAL_HWACCEL);
if ( accelerated ) { if ( accelerated ) {
src->map->video = this;
src->map->hw_blit = HWAccelBlit; src->map->hw_blit = HWAccelBlit;
} }
else {
src->map->video = NULL;
src->map->hw_blit = NULL;
}
return(accelerated); return(accelerated);
} }
@@ -220,5 +229,4 @@ void FB_3DfxAccel(_THIS, __u32 card)
/* The 3Dfx has accelerated normal and colorkey blits */ /* The 3Dfx has accelerated normal and colorkey blits */
this->info.blit_hw = 1; this->info.blit_hw = 1;
this->info.blit_hw_CC = 1; this->info.blit_hw_CC = 1;
this->SetHWColorKey = SetHWColorKey;
} }
+20 -20
View File
@@ -74,21 +74,7 @@ static void WaitIdle(_THIS)
mga_waitidle(); mga_waitidle();
} }
/* Set video mem colorkey and accelerated blit function */ static int FillHWRect(_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color)
static int SetHWColorKey(_THIS, GAL_Surface *surface, Uint32 key)
{
return(0);
}
/* Set per surface hardware alpha value */
#if 0
static int SetHWAlpha(_THIS, GAL_Surface *surface, Uint8 value)
{
return(0);
}
#endif
static int FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color)
{ {
int dstX, dstY; int dstX, dstY;
Uint32 fxbndry; Uint32 fxbndry;
@@ -132,10 +118,9 @@ static int FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color)
return(0); return(0);
} }
static int HWAccelBlit(GAL_Surface *src, GAL_Rect *srcrect, static int HWAccelBlit(_THIS, GAL_Surface *src, GAL_Rect *srcrect,
GAL_Surface *dst, GAL_Rect *dstrect) GAL_Surface *dst, GAL_Rect *dstrect)
{ {
GAL_VideoDevice *this = __mg_current_video;
int pitch, w, h; int pitch, w, h;
int srcX, srcY; int srcX, srcY;
int dstX, dstY; int dstX, dstY;
@@ -146,7 +131,7 @@ static int HWAccelBlit(GAL_Surface *src, GAL_Rect *srcrect,
/* FIXME: For now, only blit to display surface */ /* FIXME: For now, only blit to display surface */
if ( dst->pitch != GAL_VideoSurface->pitch ) { if ( dst->pitch != GAL_VideoSurface->pitch ) {
return(src->map->sw_blit(src, srcrect, dst, dstrect)); return(src->map->sw_blit(this, src, srcrect, dst, dstrect));
} }
/* Calculate source and destination base coordinates (in pixels) */ /* Calculate source and destination base coordinates (in pixels) */
@@ -224,8 +209,11 @@ static int HWAccelBlit(GAL_Surface *src, GAL_Rect *srcrect,
return(0); return(0);
} }
static int CheckHWBlit(_THIS, GAL_Surface *src, GAL_Surface *dst) static int CheckHWBlit(_THIS, GAL_Surface *src, const GAL_Rect *srcrc,
GAL_Surface *dst, const GAL_Rect *dstrc, DWORD op)
{ {
(void)srcrc;
(void)dstrc;
int accelerated; int accelerated;
/* Set initial acceleration on */ /* Set initial acceleration on */
@@ -243,11 +231,24 @@ static int CheckHWBlit(_THIS, GAL_Surface *src, GAL_Surface *dst)
} }
} }
/* color blend, logical operation, and scaling filter are not supported */
if ((op & COLOR_BLEND_MASK) ||
((op & COLOR_LOGICOP_MASK) != COLOR_LOGICOP_COPY) ||
(op & SCALING_FILTER_MASK)) {
src->flags &= ~GAL_HWACCEL;
}
/* Check to see if final surface blit is accelerated */ /* Check to see if final surface blit is accelerated */
accelerated = !!(src->flags & GAL_HWACCEL); accelerated = !!(src->flags & GAL_HWACCEL);
if ( accelerated ) { if ( accelerated ) {
src->map->video = this;
src->map->hw_blit = HWAccelBlit; src->map->hw_blit = HWAccelBlit;
} }
else {
src->map->video = NULL;
src->map->hw_blit = NULL;
}
return(accelerated); return(accelerated);
} }
@@ -269,7 +270,6 @@ void FB_MatroxAccel(_THIS, __u32 card)
*/ */
if ( card != FB_ACCEL_MATROX_MGA2064W ) { if ( card != FB_ACCEL_MATROX_MGA2064W ) {
this->info.blit_hw_CC = 1; this->info.blit_hw_CC = 1;
this->SetHWColorKey = SetHWColorKey;
} }
#if 0 /* Not yet implemented? */ #if 0 /* Not yet implemented? */
+21 -10
View File
@@ -95,12 +95,6 @@ static void WaitIdle(_THIS)
; ;
} }
/* Set video mem colorkey and accelerated blit function */
static int SetHWColorKey(_THIS, GAL_Surface *surface, Uint32 key)
{
return 0;
}
static inline void validate_dst (_THIS, GAL_Surface* dst) static inline void validate_dst (_THIS, GAL_Surface* dst)
{ {
int bltMode = 0; int bltMode = 0;
@@ -121,7 +115,7 @@ static inline void validate_dst (_THIS, GAL_Surface* dst)
neo2200->pitch = (dst->pitch << 16) | (dst->pitch & 0xFFFF); neo2200->pitch = (dst->pitch << 16) | (dst->pitch & 0xFFFF);
} }
static int FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color) static int FillHWRect(_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color)
{ {
char *dst_base; char *dst_base;
@@ -195,9 +189,11 @@ static void make_rects (GAL_Rect *src, GAL_Rect* dst, const RECT* rc, Uint32 x,
dst->h = src->h; dst->h = src->h;
} }
static int HWAccelBlit (GAL_Surface *src, GAL_Rect *srcrect, static int HWAccelBlit (_THIS, GAL_Surface *src, GAL_Rect *srcrect,
GAL_Surface *dst, GAL_Rect *dstrect) GAL_Surface *dst, GAL_Rect *dstrect)
{ {
(void)this;
RECT rc_src = {srcrect->x, srcrect->y, srcrect->x + srcrect->w, srcrect->y + srcrect->h}; RECT rc_src = {srcrect->x, srcrect->y, srcrect->x + srcrect->w, srcrect->y + srcrect->h};
RECT rc_dst = {dstrect->x, dstrect->y, dstrect->x + dstrect->w, dstrect->y + dstrect->h}; RECT rc_dst = {dstrect->x, dstrect->y, dstrect->x + dstrect->w, dstrect->y + dstrect->h};
RECT rc_inter, rc_sub [4]; RECT rc_inter, rc_sub [4];
@@ -241,8 +237,11 @@ static int HWAccelBlit (GAL_Surface *src, GAL_Rect *srcrect,
return(0); return(0);
} }
static int CheckHWBlit (_THIS, GAL_Surface *src, GAL_Surface *dst) static int CheckHWBlit(_THIS, GAL_Surface *src, const GAL_Rect *srcrc,
GAL_Surface *dst, const GAL_Rect *dstrc, DWORD op)
{ {
(void)srcrc;
(void)dstrc;
int accelerated; int accelerated;
/* Set initial acceleration on */ /* Set initial acceleration on */
@@ -260,14 +259,27 @@ static int CheckHWBlit (_THIS, GAL_Surface *src, GAL_Surface *dst)
} }
} }
/* color blend, logical operation, and scaling filter are not supported */
if ((op & COLOR_BLEND_MASK) ||
((op & COLOR_LOGICOP_MASK) != COLOR_LOGICOP_COPY) ||
(op & SCALING_FILTER_MASK)) {
src->flags &= ~GAL_HWACCEL;
}
if (src->format->BitsPerPixel > 16) if (src->format->BitsPerPixel > 16)
src->flags &= ~GAL_HWACCEL; src->flags &= ~GAL_HWACCEL;
/* Check to see if final surface blit is accelerated */ /* Check to see if final surface blit is accelerated */
accelerated = !!(src->flags & GAL_HWACCEL); accelerated = !!(src->flags & GAL_HWACCEL);
if ( accelerated ) { if ( accelerated ) {
src->map->video = this;
src->map->hw_blit = HWAccelBlit; src->map->hw_blit = HWAccelBlit;
} }
else {
src->map->video = NULL;
src->map->hw_blit = NULL;
}
return(accelerated); return(accelerated);
} }
@@ -287,7 +299,6 @@ void FB_NeoMagicAccel(_THIS, __u32 card)
/* The NeoMagic has accelerated normal and colorkey blits */ /* The NeoMagic has accelerated normal and colorkey blits */
this->info.blit_hw = 1; this->info.blit_hw = 1;
this->info.blit_hw_CC = 1; this->info.blit_hw_CC = 1;
this->SetHWColorKey = SetHWColorKey;
} }
#endif /* FB_ACCEL_NEOMAGIC_NM2070 */ #endif /* FB_ACCEL_NEOMAGIC_NM2070 */
File diff suppressed because it is too large Load Diff
+14 -5
View File
@@ -47,6 +47,8 @@
#ifndef _GAL_fbvideo_h #ifndef _GAL_fbvideo_h
#define _GAL_fbvideo_h #define _GAL_fbvideo_h
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h> #include <sys/types.h>
#include <termios.h> #include <termios.h>
#include <linux/fb.h> #include <linux/fb.h>
@@ -95,12 +97,19 @@ struct GAL_PrivateVideoData {
int saved_cmaplen; int saved_cmaplen;
__u16 *saved_cmap; __u16 *saved_cmap;
/* Since 5.0.13, use FBIOPAN_DISPLAY if possible */ /* Since 5.0.13, async updater */
int nr_buffers; int updater_ready;
int idx_buffer; int update_interval;
unsigned len_buffer; RECT update_rect;
char *buffers[2]; pthread_t update_thd;
pthread_mutex_t update_lock;
sem_t sync_sem;
#ifdef _DEBUG
struct timespec ts_start;
unsigned frames;
#endif
#ifdef _MGHAVE_PCIACCESS #ifdef _MGHAVE_PCIACCESS
int pci_accel_driver; int pci_accel_driver;
#endif #endif
+20 -10
View File
@@ -715,7 +715,7 @@ static void SMI_SubsequentScreenToScreenCopy (int x1, int y1, int x2,
WRITE_DPR(pSmi, 0x0C, pSmi->AccelCmd); WRITE_DPR(pSmi, 0x0C, pSmi->AccelCmd);
} }
static int SMI_FillHWRect (_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color) static int SMI_FillHWRect (_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color)
{ {
SMIPtr pSmi = &smi_rec; SMIPtr pSmi = &smi_rec;
int x = rect->x; int x = rect->x;
@@ -770,9 +770,11 @@ static void SMI_BlitTransRect (int srcx, int srcy, int w, int h, int dstx,
#endif #endif
} }
static int SMI_HWAccelBlit (GAL_Surface *src, GAL_Rect *srcrect, static int SMI_HWAccelBlit (_THIS, GAL_Surface *src, GAL_Rect *srcrect,
GAL_Surface *dst, GAL_Rect *dstrect) GAL_Surface *dst, GAL_Rect *dstrect)
{ {
(void)this;
SMIPtr pSmi = &smi_rec; SMIPtr pSmi = &smi_rec;
int srcx = srcrect->x; int srcx = srcrect->x;
int srcy = srcrect->y; int srcy = srcrect->y;
@@ -825,14 +827,11 @@ static void SMI_WaitIdle (_THIS)
#endif #endif
} }
/* Set video mem colorkey and accelerated blit function */ static int SMI_CheckHWBlit (_THIS, GAL_Surface *src, const GAL_Rect *srcrc,
static int SMI_SetHWColorKey (_THIS, GAL_Surface *surface, Uint32 key) GAL_Surface *dst, const GAL_Rect *dstrc, DWORD op)
{
return 0;
}
static int SMI_CheckHWBlit (_THIS, GAL_Surface *src, GAL_Surface *dst)
{ {
(void)srcrc;
(void)dstrc;
int accelerated; int accelerated;
/* Set initial acceleration on */ /* Set initial acceleration on */
@@ -851,11 +850,23 @@ static int SMI_CheckHWBlit (_THIS, GAL_Surface *src, GAL_Surface *dst)
src->flags &= ~GAL_HWACCEL; src->flags &= ~GAL_HWACCEL;
} }
/* color blend, logical operation, and scaling filter are not supported */
if ((op & COLOR_BLEND_MASK) ||
((op & COLOR_LOGICOP_MASK) != COLOR_LOGICOP_COPY) ||
(op & SCALING_FILTER_MASK)) {
src->flags &= ~GAL_HWACCEL;
}
/* Check to see if final surface blit is accelerated */ /* Check to see if final surface blit is accelerated */
accelerated = !!(src->flags & GAL_HWACCEL); accelerated = !!(src->flags & GAL_HWACCEL);
if (accelerated) { if (accelerated) {
src->map->video = this;
src->map->hw_blit = SMI_HWAccelBlit; src->map->hw_blit = SMI_HWAccelBlit;
} }
else {
src->map->video = NULL;
src->map->hw_blit = NULL;
}
return (accelerated); return (accelerated);
} }
@@ -898,7 +909,6 @@ static int SMI_Init (_THIS, const GAL_Surface* current)
this->info.blit_hw = 1; this->info.blit_hw = 1;
this->info.blit_hw_A = 0; this->info.blit_hw_A = 0;
this->info.blit_hw_CC = 1; this->info.blit_hw_CC = 1;
this->SetHWColorKey = SMI_SetHWColorKey;
return 0; return 0;
} }
-2
View File
@@ -116,8 +116,6 @@ static GAL_VideoDevice *GDL_CreateDevice (int devindex)
this->CheckHWBlit = NULL; this->CheckHWBlit = NULL;
this->FillHWRect = NULL; this->FillHWRect = NULL;
this->SetHWColorKey = NULL;
this->SetHWAlpha = NULL;
this->free = GDL_DeleteDevice; this->free = GDL_DeleteDevice;
+1 -3
View File
@@ -242,8 +242,6 @@ static GAL_VideoDevice *HI3560A_CreateDevice(int devindex)
device->AllocHWSurface = HI3560A_AllocHWSurface; device->AllocHWSurface = HI3560A_AllocHWSurface;
device->CheckHWBlit = HI3560A_CheckHWBlit; device->CheckHWBlit = HI3560A_CheckHWBlit;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FillHWRect = HI3560A_FillHWRect; device->FillHWRect = HI3560A_FillHWRect;
device->FreeHWSurface = HI3560A_FreeHWSurface; device->FreeHWSurface = HI3560A_FreeHWSurface;
@@ -994,7 +992,7 @@ static int HI3560A_AllocHWSurface(_THIS, GAL_Surface *surface)
} }
} }
static int HI3560A_FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color) static int HI3560A_FillHWRect(_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color)
{ {
TDE_HANDLE tdeHandle; TDE_HANDLE tdeHandle;
int ret = 0; int ret = 0;
+1 -3
View File
@@ -501,7 +501,7 @@ static int HI3510_CheckHWBlit(_THIS, GAL_Surface *src, GAL_Surface *dst)
} }
/* Fills a surface rectangle with the given color */ /* Fills a surface rectangle with the given color */
static int HI3510_FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color) static int HI3510_FillHWRect(_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color)
{ {
Uint8 r,g,b; Uint8 r,g,b;
Uint8* pvirtual_addr; Uint8* pvirtual_addr;
@@ -1863,8 +1863,6 @@ static GAL_VideoDevice *HI3510_CreateDevice (int devindex)
#endif #endif
this->FreeHWSurface = HI3510_FreeHWSurface; this->FreeHWSurface = HI3510_FreeHWSurface;
this->free = HI3510_DeleteDevice; this->free = HI3510_DeleteDevice;
this->SetHWAlpha = NULL;
this->SetHWColorKey = NULL;
return this; return this;
} }
+1 -3
View File
@@ -675,7 +675,7 @@ static int HI3560_CheckHWBlit(_THIS, GAL_Surface *src, GAL_Surface *dst)
} }
static Sint32 Hi3560_FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color) static Sint32 Hi3560_FillHWRect(_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color)
{ {
TDE_SURFACE_S surface ={0}; TDE_SURFACE_S surface ={0};
TDE_OPT_S param; TDE_OPT_S param;
@@ -1855,8 +1855,6 @@ static GAL_VideoDevice *HI3560_CreateDevice (int devindex)
//#endif //#endif
#endif #endif
this->FreeHWSurface = HI3560_FreeHWSurface; this->FreeHWSurface = HI3560_FreeHWSurface;
this->SetHWAlpha = NULL;
this->SetHWColorKey = NULL;
this->free = HI3560_DeleteDevice; this->free = HI3560_DeleteDevice;
//this->SetAttr = HI3560_SetLayerAttr; //this->SetAttr = HI3560_SetLayerAttr;
File diff suppressed because it is too large Load Diff
-2
View File
@@ -251,8 +251,6 @@ static GAL_VideoDevice *MB93493_CreateDevice(int devindex)
device->AllocHWSurface = MB93493_AllocHWSurface; device->AllocHWSurface = MB93493_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = MB93493_FreeHWSurface; device->FreeHWSurface = MB93493_FreeHWSurface;
device->UpdateRects = MB93493_UpdateRects; device->UpdateRects = MB93493_UpdateRects;
device->free = MB93493_DeleteDevice; device->free = MB93493_DeleteDevice;
-2
View File
@@ -335,8 +335,6 @@ static GAL_VideoDevice *MLSHADOW_CreateDevice (int devindex)
device->AllocHWSurface = MLSHADOW_AllocHWSurface; device->AllocHWSurface = MLSHADOW_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = MLSHADOW_FreeHWSurface; device->FreeHWSurface = MLSHADOW_FreeHWSurface;
device->UpdateRects = MLSHADOW_UpdateRects; device->UpdateRects = MLSHADOW_UpdateRects;
device->DeleteSurface = MLSHADOW_DeleteSurface; device->DeleteSurface = MLSHADOW_DeleteSurface;
-2
View File
@@ -485,8 +485,6 @@ static GAL_VideoDevice *MLSHADOW_CreateDevice (int devindex)
device->AllocHWSurface = MLSHADOW_AllocHWSurface; device->AllocHWSurface = MLSHADOW_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = MLSHADOW_FreeHWSurface; device->FreeHWSurface = MLSHADOW_FreeHWSurface;
device->UpdateRects = MLSHADOW_UpdateRects; device->UpdateRects = MLSHADOW_UpdateRects;
device->DeleteSurface = MLSHADOW_DeleteSurface; device->DeleteSurface = MLSHADOW_DeleteSurface;
+6 -4
View File
@@ -106,12 +106,10 @@ static void MStar_VideoQuit(_THIS);
/* Hardware surface functions */ /* Hardware surface functions */
static int MStar_InitHWSurfaces(_THIS, GAL_Surface *screen, char *base, int size); static int MStar_InitHWSurfaces(_THIS, GAL_Surface *screen, char *base, int size);
static int MStar_AllocHWSurface(_THIS, GAL_Surface *surface); static int MStar_AllocHWSurface(_THIS, GAL_Surface *surface);
static int MStar_FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *dstrect, Uint32 color); static int MStar_FillHWRect(_THIS, GAL_Surface *dst, const GAL_Rect *dstrect, Uint32 color);
static void MStar_FreeHWSurface(_THIS, GAL_Surface *surface); static void MStar_FreeHWSurface(_THIS, GAL_Surface *surface);
static int MStar_CheckHWBlit(_THIS, GAL_Surface *src, GAL_Surface *dst); static int MStar_CheckHWBlit(_THIS, GAL_Surface *src, GAL_Surface *dst);
static int MStar_HWAccelBlit(GAL_Surface *src, GAL_Rect *srcrect, GAL_Surface *dst, GAL_Rect *dstrect); static int MStar_HWAccelBlit(GAL_Surface *src, GAL_Rect *srcrect, GAL_Surface *dst, GAL_Rect *dstrect);
static int MStar_SetHWColorKey(_THIS, GAL_Surface *surface, Uint32 key);
static int MStar_SetHWAlpha(_THIS, GAL_Surface *surface, Uint8 alpha);
/* Various screen update functions available */ /* Various screen update functions available */
static void MStar_DirectUpdate(_THIS, int numrects, GAL_Rect *rects); static void MStar_DirectUpdate(_THIS, int numrects, GAL_Rect *rects);
@@ -190,8 +188,10 @@ static GAL_VideoDevice * MStar_CreateDevice(int devindex)
device->AllocHWSurface = MStar_AllocHWSurface; device->AllocHWSurface = MStar_AllocHWSurface;
device->CheckHWBlit = MStar_CheckHWBlit; device->CheckHWBlit = MStar_CheckHWBlit;
device->FillHWRect = MStar_FillHWRect; device->FillHWRect = MStar_FillHWRect;
#if 0
device->SetHWColorKey = MStar_SetHWColorKey; device->SetHWColorKey = MStar_SetHWColorKey;
device->SetHWAlpha = MStar_SetHWAlpha; device->SetHWAlpha = MStar_SetHWAlpha;
#endif
device->FreeHWSurface = MStar_FreeHWSurface; device->FreeHWSurface = MStar_FreeHWSurface;
device->UpdateRects = MStar_DirectUpdate; device->UpdateRects = MStar_DirectUpdate;
device->UpdateSurfaceRects = NULL; device->UpdateSurfaceRects = NULL;
@@ -725,7 +725,7 @@ void cleanEngineState(MSTARDeviceData *sdev)
sdev->dst_ge_format = GFX_FMT_ARGB8888; sdev->dst_ge_format = GFX_FMT_ARGB8888;
} }
static int MStar_FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color) static int MStar_FillHWRect(_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color)
{ {
GFX_RectFillInfo rectInfo; GFX_RectFillInfo rectInfo;
GFX_Point v0, v1; GFX_Point v0, v1;
@@ -773,6 +773,7 @@ static int MStar_FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 colo
return 0; return 0;
} }
#if 0
static int MStar_SetHWColorKey(_THIS, GAL_Surface *src, Uint32 key) static int MStar_SetHWColorKey(_THIS, GAL_Surface *src, Uint32 key)
{ {
FUNC_ENTER(); FUNC_ENTER();
@@ -790,6 +791,7 @@ static int MStar_SetHWAlpha(_THIS, GAL_Surface *surface, Uint8 alpha)
FUNC_LEAVE(); FUNC_LEAVE();
return 0; return 0;
} }
#endif
static void MStar_DirectUpdate(_THIS, int numrects, GAL_Rect *rects) static void MStar_DirectUpdate(_THIS, int numrects, GAL_Rect *rects)
{ {
+4 -3
View File
@@ -240,12 +240,14 @@ static GAL_Surface* create_wp_surface(GAL_Surface* screen)
req.len_data = strlen (SYSSF_WALLPAPER_PATTER) + 1; req.len_data = strlen (SYSSF_WALLPAPER_PATTER) + 1;
if ((ClientRequestEx2 (&req, NULL, 0, -1, if ((ClientRequestEx2 (&req, NULL, 0, -1,
&info, sizeof (SHAREDSURFINFO), &fd) < 0) || (fd < 0)) &info, sizeof (SHAREDSURFINFO), &fd) < 0) || (fd < 0)) {
_WRN_PRINTF ("creating an empty wallpaper pattern surface\n");
goto empty; goto empty;
}
_DBG_PRINTF ("REQID_GETSHAREDSURFACE: size (%lu), flags (0x%x), fd: %d\n", _DBG_PRINTF ("REQID_GETSHAREDSURFACE: size (%lu), flags (0x%x), fd: %d\n",
info.size, info.flags, fd); info.size, info.flags, fd);
wp_surf = GAL_AttachSharedRGBSurface (fd, info.size, wp_surf = GAL_AttachSharedRGBSurface (NULL, fd, info.size,
info.flags, TRUE); info.flags, TRUE);
close (fd); close (fd);
@@ -253,7 +255,6 @@ static GAL_Surface* create_wp_surface(GAL_Surface* screen)
} }
empty: empty:
_DBG_PRINTF ("creating an empty wallpaper pattern surface\n");
if (IsServer()) { if (IsServer()) {
return GAL_CreateRGBSurface (GAL_SWSURFACE, 0, 0, return GAL_CreateRGBSurface (GAL_SWSURFACE, 0, 0,
screen->format->BitsPerPixel, screen->format->BitsPerPixel,
+6 -13
View File
@@ -83,9 +83,9 @@ static REP_NEXUS_GETSURFACE reply_primary_surface_info;
/* Initialization/Query functions */ /* Initialization/Query functions */
static int NEXUS_VideoInit(_THIS, GAL_PixelFormat * vformat); static int NEXUS_VideoInit(_THIS, GAL_PixelFormat * vformat);
static GAL_Rect **NEXUS_ListModes(_THIS, GAL_PixelFormat * format, static GAL_Rect **NEXUS_ListModes(_THIS, GAL_PixelFormat * format,
Uint32 flags); Uint32 flags);
static GAL_Surface *NEXUS_SetVideoMode(_THIS, GAL_Surface * current, int width, static GAL_Surface *NEXUS_SetVideoMode(_THIS, GAL_Surface *current,
int height, int bpp, Uint32 flags); int width, int height, int bpp, Uint32 flags);
static int NEXUS_SetColors(_THIS, int firstcolor, int ncolors, static int NEXUS_SetColors(_THIS, int firstcolor, int ncolors,
GAL_Color * colors); GAL_Color * colors);
static void NEXUS_VideoQuit(_THIS); static void NEXUS_VideoQuit(_THIS);
@@ -93,8 +93,8 @@ static void NEXUS_VideoQuit(_THIS);
/* Hardware surface functions */ /* Hardware surface functions */
static int NEXUS_AllocHWSurface(_THIS, GAL_Surface * surface); static int NEXUS_AllocHWSurface(_THIS, GAL_Surface * surface);
static void NEXUS_FreeHWSurface(_THIS, GAL_Surface * surface); static void NEXUS_FreeHWSurface(_THIS, GAL_Surface * surface);
static int NEXUS_FillHWRect(_THIS, GAL_Surface * dst, GAL_Rect * rect, static int NEXUS_FillHWRect(_THIS, GAL_Surface * dst, const GAL_Rect * rect,
Uint32 color); Uint32 color);
static void NEXUS_UpdateSurfaceRects(_THIS, GAL_Surface* surface, static void NEXUS_UpdateSurfaceRects(_THIS, GAL_Surface* surface,
int numrects, GAL_Rect *rects); int numrects, GAL_Rect *rects);
static int NEXUS_CheckHWBlit(_THIS, GAL_Surface * src, GAL_Surface * dst); static int NEXUS_CheckHWBlit(_THIS, GAL_Surface * src, GAL_Surface * dst);
@@ -114,11 +114,6 @@ NEXUS_DeleteDevice(GAL_VideoDevice * device)
free(device); free(device);
} }
static int NEXUS_SetHWColorKey(_THIS, GAL_Surface *surface, Uint32 key)
{
return 0;
}
static GAL_VideoDevice * static GAL_VideoDevice *
NEXUS_CreateDevice(int devindex) NEXUS_CreateDevice(int devindex)
{ {
@@ -152,8 +147,6 @@ NEXUS_CreateDevice(int devindex)
device->AllocHWSurface = NEXUS_AllocHWSurface; device->AllocHWSurface = NEXUS_AllocHWSurface;
device->CheckHWBlit = NEXUS_CheckHWBlit; device->CheckHWBlit = NEXUS_CheckHWBlit;
device->FillHWRect = NEXUS_FillHWRect; device->FillHWRect = NEXUS_FillHWRect;
device->SetHWColorKey = NEXUS_SetHWColorKey;
device->SetHWAlpha = NULL;
device->FreeHWSurface = NEXUS_FreeHWSurface; device->FreeHWSurface = NEXUS_FreeHWSurface;
device->UpdateRects = NULL; device->UpdateRects = NULL;
device->UpdateSurfaceRects = NEXUS_UpdateSurfaceRects; device->UpdateSurfaceRects = NEXUS_UpdateSurfaceRects;
@@ -455,7 +448,7 @@ NEXUS_FreeHWSurface(_THIS, GAL_Surface * surface)
} }
static int static int
NEXUS_FillHWRect(_THIS, GAL_Surface * dst, GAL_Rect * rect, Uint32 color) NEXUS_FillHWRect(_THIS, GAL_Surface * dst, const GAL_Rect * rect, Uint32 color)
{ {
return NexusPrivate_FillRect(this->hidden->privateData, return NexusPrivate_FillRect(this->hidden->privateData,
(NexusPrivate_HWSurface_hwdata *) dst->hwdata, (NexusPrivate_HWSurface_hwdata *) dst->hwdata,
+6 -8
View File
@@ -266,11 +266,11 @@ static BOOL PCXVFB_SyncUpdate (_THIS)
{ {
RECT dirty_rc; RECT dirty_rc;
if (IsRectEmpty (&this->hidden->dirty_rc)) if (IsRectEmpty(&this->hidden->dirty_rc))
return FALSE; return FALSE;
#ifdef WIN32 #ifdef WIN32
win_PCXVFbLock (); win_PCXVFbLock();
#else #else
shm_lock(semid); shm_lock(semid);
#endif #endif
@@ -282,10 +282,10 @@ static BOOL PCXVFB_SyncUpdate (_THIS)
if (dirty_rc.right == -1) dirty_rc.right = 0; if (dirty_rc.right == -1) dirty_rc.right = 0;
if (dirty_rc.bottom == -1) dirty_rc.bottom = 0; if (dirty_rc.bottom == -1) dirty_rc.bottom = 0;
GetBoundRect (&this->hidden->dirty_rc, &dirty_rc, GetBoundRect(&this->hidden->dirty_rc, &dirty_rc,
&this->hidden->dirty_rc); &this->hidden->dirty_rc);
shadowScreen_BlitToReal (this); shadowScreen_BlitToReal(this, NULL);
this->hidden->hdr->dirty_rc_l = this->hidden->dirty_rc.left; this->hidden->hdr->dirty_rc_l = this->hidden->dirty_rc.left;
this->hidden->hdr->dirty_rc_t = this->hidden->dirty_rc.top; this->hidden->hdr->dirty_rc_t = this->hidden->dirty_rc.top;
@@ -293,10 +293,10 @@ static BOOL PCXVFB_SyncUpdate (_THIS)
this->hidden->hdr->dirty_rc_b = this->hidden->dirty_rc.bottom; this->hidden->hdr->dirty_rc_b = this->hidden->dirty_rc.bottom;
this->hidden->hdr->dirty = TRUE; this->hidden->hdr->dirty = TRUE;
SetRectEmpty (&this->hidden->dirty_rc); SetRectEmpty(&this->hidden->dirty_rc);
#ifdef WIN32 #ifdef WIN32
win_PCXVFbUnlock (); win_PCXVFbUnlock();
#else #else
shm_unlock(semid); shm_unlock(semid);
#endif #endif
@@ -350,8 +350,6 @@ static GAL_VideoDevice *PCXVFB_CreateDevice (int devindex)
this->CheckHWBlit = NULL; this->CheckHWBlit = NULL;
this->FillHWRect = NULL; this->FillHWRect = NULL;
this->SetHWColorKey = NULL;
this->SetHWAlpha = NULL;
this->free = PCXVFB_DeleteDevice; this->free = PCXVFB_DeleteDevice;
+3 -2
View File
@@ -617,7 +617,8 @@ void GAL_InvalidateMap(GAL_BlitMap *map)
} }
} }
int GAL_MapSurface (GAL_Surface *src, GAL_Surface *dst) int GAL_MapSurface (GAL_Surface *src, const GAL_Rect *srcrc,
GAL_Surface *dst, const GAL_Rect *dstrc, DWORD op)
{ {
GAL_PixelFormat *srcfmt; GAL_PixelFormat *srcfmt;
GAL_PixelFormat *dstfmt; GAL_PixelFormat *dstfmt;
@@ -698,7 +699,7 @@ int GAL_MapSurface (GAL_Surface *src, GAL_Surface *dst)
map->format_version = (++dst->format_version); map->format_version = (++dst->format_version);
/* Choose your blitters wisely */ /* Choose your blitters wisely */
return(GAL_CalculateBlit(src)); return(GAL_CalculateBlit(src, srcrc, dstrc, op));
} }
void GAL_FreeBlitMap(GAL_BlitMap *map) void GAL_FreeBlitMap(GAL_BlitMap *map)
+5 -2
View File
@@ -59,11 +59,14 @@ extern void GAL_FreeFormat(GAL_PixelFormat *format);
/* Blit mapping functions */ /* Blit mapping functions */
extern GAL_BlitMap *GAL_AllocBlitMap(void); extern GAL_BlitMap *GAL_AllocBlitMap(void);
extern void GAL_InvalidateMap(GAL_BlitMap *map); extern void GAL_InvalidateMap(GAL_BlitMap *map);
extern int GAL_MapSurface (GAL_Surface *src, GAL_Surface *dst); extern int GAL_MapSurface (GAL_Surface *src, const GAL_Rect *srcrc,
GAL_Surface *dst, const GAL_Rect *dstrc, DWORD op);
extern void GAL_FreeBlitMap(GAL_BlitMap *map); extern void GAL_FreeBlitMap(GAL_BlitMap *map);
/* Miscellaneous functions */ /* Miscellaneous functions */
extern Uint32 GAL_CalculatePitch(GAL_Surface *surface); extern Uint32 GAL_CalculatePitch(GAL_Surface *surface);
extern void GAL_DitherColors(GAL_Color *colors, int bpp); extern void GAL_DitherColors(GAL_Color *colors, int bpp);
extern Uint8 GAL_FindColor(GAL_Palette *pal, Uint8 r, Uint8 g, Uint8 b); extern Uint8 GAL_FindColor(GAL_Palette *pal, Uint8 r, Uint8 g, Uint8 b);
extern void GAL_ApplyGamma(Uint16 *gamma, GAL_Color *colors, GAL_Color *output, int ncolors); extern void GAL_ApplyGamma(Uint16 *gamma, GAL_Color *colors, GAL_Color *output,
int ncolors);
-2
View File
@@ -171,8 +171,6 @@ static GAL_VideoDevice *QVFB_CreateDevice (int devindex)
this->CheckHWBlit = NULL; this->CheckHWBlit = NULL;
this->FillHWRect = NULL; this->FillHWRect = NULL;
this->SetHWColorKey = NULL;
this->SetHWAlpha = NULL;
this->free = QVFB_DeleteDevice; this->free = QVFB_DeleteDevice;
-2
View File
@@ -208,8 +208,6 @@ static GAL_VideoDevice *RTOS_XVFB_CreateDevice (int devindex)
this->CheckHWBlit = NULL; this->CheckHWBlit = NULL;
this->FillHWRect = NULL; this->FillHWRect = NULL;
this->SetHWColorKey = NULL;
this->SetHWAlpha = NULL;
this->free = RTOS_XVFB_DeleteDevice; this->free = RTOS_XVFB_DeleteDevice;
-2
View File
@@ -196,8 +196,6 @@ static GAL_VideoDevice *S3C6410_CreateDevice(int devindex)
device->AllocHWSurface = S3C6410_AllocHWSurface; device->AllocHWSurface = S3C6410_AllocHWSurface;
device->CheckHWBlit = S3C6410_CheckHWBlit; device->CheckHWBlit = S3C6410_CheckHWBlit;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = S3C6410_FreeHWSurface; device->FreeHWSurface = S3C6410_FreeHWSurface;
device->free = S3C6410_DeleteDevice; device->free = S3C6410_DeleteDevice;
+5 -2
View File
@@ -231,13 +231,16 @@ void shadowScreen_UpdateRects (_THIS, int numrects, GAL_Rect *rects)
} }
/* Blit dirty content from shadow surface to ultimate surface */ /* Blit dirty content from shadow surface to ultimate surface */
int shadowScreen_BlitToReal (_THIS) int shadowScreen_BlitToReal (_THIS, const RECT *dirty_rc)
{ {
RECT bound; RECT bound;
CHECK_VERSION_RETVAL (this, -1); CHECK_VERSION_RETVAL (this, -1);
bound = this->hidden->dirty_rc; if (dirty_rc == NULL)
bound = this->hidden->dirty_rc;
else
bound = *dirty_rc;
if (this->hidden->real_screen) { if (this->hidden->real_screen) {
GAL_Rect src_rect, dst_rect; GAL_Rect src_rect, dst_rect;
+1 -1
View File
@@ -67,7 +67,7 @@ extern "C" {
int shadowScreen_SetCursor (_THIS, GAL_Surface *surface, int hot_x, int hot_y); int shadowScreen_SetCursor (_THIS, GAL_Surface *surface, int hot_x, int hot_y);
int shadowScreen_MoveCursor (_THIS, int x, int y); int shadowScreen_MoveCursor (_THIS, int x, int y);
void shadowScreen_UpdateRects (_THIS, int numrects, GAL_Rect *rects); void shadowScreen_UpdateRects (_THIS, int numrects, GAL_Rect *rects);
int shadowScreen_BlitToReal (_THIS); int shadowScreen_BlitToReal (_THIS, const RECT *dirty_rc);
#ifdef __cplusplus #ifdef __cplusplus
} }
+2
View File
@@ -1,6 +1,8 @@
AM_CPPFLAGS = -I$(abs_top_srcdir)/src/include -I$(abs_top_srcdir)/include \ AM_CPPFLAGS = -I$(abs_top_srcdir)/src/include -I$(abs_top_srcdir)/include \
-I$(abs_top_srcdir)/src/newgal/ $(PIXMAN_CFLAGS) -I$(abs_top_srcdir)/src/newgal/ $(PIXMAN_CFLAGS)
AM_CFLAGS = -O3
SRC_FILES = shadow.c shadow_refresh_msb_right.c shadow_refresh_msb_left.c SRC_FILES = shadow.c shadow_refresh_msb_right.c shadow_refresh_msb_left.c
HDR_FILES = shadow.h HDR_FILES = shadow.h
+561 -191
View File
File diff suppressed because it is too large Load Diff
+21 -24
View File
@@ -49,15 +49,7 @@
#include <pthread.h> #include <pthread.h>
#include <semaphore.h> #include <semaphore.h>
#include <time.h>
#undef _MGUSE_PIXMAN
#ifdef _MGUSE_PIXMAN
#include <pixman.h>
#include <math.h>
#endif
//#include "sysvideo.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@@ -66,9 +58,6 @@ extern "C" {
/* Hidden "this" pointer for the video functions */ /* Hidden "this" pointer for the video functions */
#define _THIS GAL_VideoDevice *this #define _THIS GAL_VideoDevice *this
#define MAX_NR_UPDATERS 6
#define MIN_PIXELS_USING_UPDATER 4096
typedef struct _ShadowFBHeader { typedef struct _ShadowFBHeader {
unsigned int info_size; unsigned int info_size;
int width; int width;
@@ -104,29 +93,37 @@ typedef struct _RealFBInfo {
GAL_VideoDevice *real_device; GAL_VideoDevice *real_device;
#ifdef _MGUSE_PIXMAN
pixman_image_t *src_img;
pixman_image_t *dst_img;
pixman_transform_t transform;
#endif
} RealFBInfo; } RealFBInfo;
/* Private display data */ /* Private display data */
#define USE_UPDATE_SEM 0
struct GAL_PrivateVideoData { struct GAL_PrivateVideoData {
RealFBInfo * realfb_info; RealFBInfo * realfb_info;
#ifdef _MGRM_PROCESSES #ifdef _MGRM_PROCESSES
int semid; int semid;
#endif #endif
int nr_updaters; int min_pixels_using_hwaccl;
/* only valid when nr_updaters > 0 */ /* async updater */
RECT dirty_rcs[MAX_NR_UPDATERS]; int async_update;
sem_t update_sems[MAX_NR_UPDATERS]; int update_interval;
pthread_t update_thds[MAX_NR_UPDATERS]; RECT update_rect;
sem_t sync_sem; pthread_t update_thd;
sem_t sync_sem;
#if USE_UPDATE_SEM
sem_t update_sem;
#else
pthread_mutex_t update_lock;
#endif
#ifdef _DEBUG
struct timespec ts_start;
unsigned frames;
#endif
}; };
typedef struct _ShadowFBOps { typedef struct _ShadowFBOps {
+2 -4
View File
@@ -173,7 +173,7 @@ static int GFX_VideoInit(_THIS, GAL_PixelFormat * vformat);
static GAL_Rect ** GFX_ListModes(_THIS, GAL_PixelFormat * format, Uint32 flags); static GAL_Rect ** GFX_ListModes(_THIS, GAL_PixelFormat * format, Uint32 flags);
static GAL_Surface * GFX_SetVideoMode(_THIS, GAL_Surface * current, int width, int height, int bpp, Uint32 flags); static GAL_Surface * GFX_SetVideoMode(_THIS, GAL_Surface * current, int width, int height, int bpp, Uint32 flags);
static void GFX_VideoQuit(_THIS); static void GFX_VideoQuit(_THIS);
static int GFX_FillHWRect(_THIS, GAL_Surface * dst, GAL_Rect * rect, Uint32 color); static int GFX_FillHWRect(_THIS, GAL_Surface * dst, const GAL_Rect * rect, Uint32 color);
static int GFX_AllocHWSurface(_THIS, GAL_Surface * surface); static int GFX_AllocHWSurface(_THIS, GAL_Surface * surface);
static void GFX_FreeHWSurface(_THIS, GAL_Surface * surface); static void GFX_FreeHWSurface(_THIS, GAL_Surface * surface);
static int GFX_HWAccelBlit(GAL_Surface * src, GAL_Rect * srcrect, GAL_Surface * dst, GAL_Rect * dstrect); static int GFX_HWAccelBlit(GAL_Surface * src, GAL_Rect * srcrect, GAL_Surface * dst, GAL_Rect * dstrect);
@@ -217,8 +217,6 @@ static GAL_VideoDevice * GFX_CreateDevice(int devindex)
this->AllocHWSurface = GFX_AllocHWSurface; this->AllocHWSurface = GFX_AllocHWSurface;
this->CheckHWBlit = GFX_CheckHWBlit; this->CheckHWBlit = GFX_CheckHWBlit;
this->FillHWRect = GFX_FillHWRect; this->FillHWRect = GFX_FillHWRect;
this->SetHWColorKey = NULL;
this->SetHWAlpha = NULL;
this->UpdateRects = NULL; this->UpdateRects = NULL;
this->FreeHWSurface = GFX_FreeHWSurface; this->FreeHWSurface = GFX_FreeHWSurface;
@@ -846,7 +844,7 @@ static void GFX_VideoQuit (_THIS)
return; return;
} }
static int GFX_FillHWRect(_THIS, GAL_Surface * surface, GAL_Rect * rect, Uint32 color) static int GFX_FillHWRect(_THIS, GAL_Surface * surface, const GAL_Rect * rect, Uint32 color)
{ {
FUNC_ENTER(); FUNC_ENTER();
struct GFXEngine_FillRectangle_type fill_param; struct GFXEngine_FillRectangle_type fill_param;
+2 -4
View File
@@ -123,7 +123,7 @@ static int STGFB_AllocHWSurface (_THIS, GAL_Surface *surface);
static void STGFB_FreeHWSurface (_THIS, GAL_Surface *surface); static void STGFB_FreeHWSurface (_THIS, GAL_Surface *surface);
static int STGFB_HWAccelBlit (GAL_Surface *src, GAL_Rect *srcrect, GAL_Surface *dst, GAL_Rect *dstrect); static int STGFB_HWAccelBlit (GAL_Surface *src, GAL_Rect *srcrect, GAL_Surface *dst, GAL_Rect *dstrect);
static int STGFB_CheckHWBlit (_THIS, GAL_Surface * src, GAL_Surface * dst); static int STGFB_CheckHWBlit (_THIS, GAL_Surface * src, GAL_Surface * dst);
static int STGFB_FillHWRect (_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color); static int STGFB_FillHWRect (_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color);
/* STAPI functions */ /* STAPI functions */
static int STAPI_Init (_THIS); static int STAPI_Init (_THIS);
@@ -854,8 +854,6 @@ static GAL_VideoDevice *STGFB_CreateDevice (int devindex)
this->FreeHWSurface = STGFB_FreeHWSurface; this->FreeHWSurface = STGFB_FreeHWSurface;
this->CheckHWBlit = STGFB_CheckHWBlit; this->CheckHWBlit = STGFB_CheckHWBlit;
this->FillHWRect = STGFB_FillHWRect; this->FillHWRect = STGFB_FillHWRect;
this->SetHWColorKey = NULL;
this->SetHWAlpha = NULL;
this->free = STGFB_DeleteDevice; this->free = STGFB_DeleteDevice;
return this; return this;
@@ -1211,7 +1209,7 @@ static void STGFB_RequestHWSurface (_THIS, const REQ_HWSURFACE* request, REP_HWS
} }
static int STGFB_FillHWRect (_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color) static int STGFB_FillHWRect (_THIS, GAL_Surface *dst, const GAL_Rect *rect, Uint32 color)
{ {
if (dst == NULL || rect == NULL) { if (dst == NULL || rect == NULL) {
fprintf(stderr, "STGFB_FillHWRect >> dst or dstrect NULL\n"); fprintf(stderr, "STGFB_FillHWRect >> dst or dstrect NULL\n");
+2 -2
View File
@@ -289,7 +289,7 @@ int GAL_SetupStretchBlit (GAL_Surface *src, GAL_Rect *srcrect,
src->pix_filter = PIXMAN_FILTER_FAST; src->pix_filter = PIXMAN_FILTER_FAST;
} }
ops &= COLOR_BLEND_FLAGS_MASK; ops &= COLOR_BLEND_PIXMAN_MASK;
if (ops == COLOR_BLEND_LEGACY) { if (ops == COLOR_BLEND_LEGACY) {
if ((src->flags & GAL_SRCPIXELALPHA) && src->format->Amask && src != dst) { if ((src->flags & GAL_SRCPIXELALPHA) && src->format->Amask && src != dst) {
src->pix_op = PIXMAN_OP_OVER; src->pix_op = PIXMAN_OP_OVER;
@@ -376,7 +376,7 @@ int GAL_StretchBlt (GAL_Surface *src, GAL_Rect *srcrect,
if (src_img == NULL || dst_img == NULL || (src->flags & GAL_SRCCOLORKEY)) if (src_img == NULL || dst_img == NULL || (src->flags & GAL_SRCCOLORKEY))
return GAL_StretchBltLegacy (src, srcrect, dst, dstrect, return GAL_StretchBltLegacy (src, srcrect, dst, dstrect,
ops & COLOR_BLEND_FLAGS_MASK); ops & COLOR_BLEND_PIXMAN_MASK);
msk_img = src->msk_img; msk_img = src->msk_img;
op = (pixman_op_t)src->pix_op; op = (pixman_op_t)src->pix_op;
File diff suppressed because it is too large Load Diff
+41 -12
View File
@@ -242,17 +242,19 @@ int GAL_SetColorKey (GAL_Surface *surface, Uint32 flag, Uint32 key)
} }
if (flag) { if (flag) {
surface->flags |= GAL_SRCCOLORKEY;
surface->format->colorkey = key;
#if 0
GAL_VideoDevice *video = __mg_current_video; GAL_VideoDevice *video = __mg_current_video;
GAL_VideoDevice *this = __mg_current_video; GAL_VideoDevice *this = __mg_current_video;
surface->flags |= GAL_SRCCOLORKEY;
surface->format->colorkey = key;
if ((surface->flags & GAL_HWACCEL) == GAL_HWACCEL) { if ((surface->flags & GAL_HWACCEL) == GAL_HWACCEL) {
if ((video->SetHWColorKey == NULL) || if ((video->SetHWColorKey == NULL) ||
(video->SetHWColorKey(this, surface, key) < 0)) { (video->SetHWColorKey(this, surface, key) < 0)) {
surface->flags &= ~GAL_HWACCEL; surface->flags &= ~GAL_HWACCEL;
} }
} }
#endif
if (flag & GAL_RLEACCELOK) { if (flag & GAL_RLEACCELOK) {
surface->flags |= GAL_RLEACCELOK; surface->flags |= GAL_RLEACCELOK;
} else { } else {
@@ -297,9 +299,6 @@ int GAL_SetAlpha (GAL_Surface *surface, Uint32 flag, Uint8 value)
GAL_UnRLESurface(surface, 1); GAL_UnRLESurface(surface, 1);
if (flag) { if (flag) {
GAL_VideoDevice *video = __mg_current_video;
GAL_VideoDevice *this = __mg_current_video;
if (flag & GAL_SRCALPHA) { if (flag & GAL_SRCALPHA) {
surface->flags |= GAL_SRCALPHA; surface->flags |= GAL_SRCALPHA;
surface->format->alpha = value; surface->format->alpha = value;
@@ -307,6 +306,9 @@ int GAL_SetAlpha (GAL_Surface *surface, Uint32 flag, Uint8 value)
surface->flags |= GAL_SRCPIXELALPHA; surface->flags |= GAL_SRCPIXELALPHA;
} }
#if 0
GAL_VideoDevice *video = __mg_current_video;
GAL_VideoDevice *this = __mg_current_video;
if ((surface->flags & GAL_HWACCEL) == GAL_HWACCEL) { if ((surface->flags & GAL_HWACCEL) == GAL_HWACCEL) {
if ((video->SetHWAlpha == NULL) || if ((video->SetHWAlpha == NULL) ||
@@ -314,6 +316,8 @@ int GAL_SetAlpha (GAL_Surface *surface, Uint32 flag, Uint8 value)
surface->flags &= ~GAL_HWACCEL; surface->flags &= ~GAL_HWACCEL;
} }
} }
#endif
if (flag & GAL_RLEACCELOK) { if (flag & GAL_RLEACCELOK) {
surface->flags |= GAL_RLEACCELOK; surface->flags |= GAL_RLEACCELOK;
} else { } else {
@@ -513,7 +517,7 @@ int GAL_LowerBlit (GAL_Surface *src, GAL_Rect *srcrect,
/* Check to make sure the blit mapping is valid */ /* Check to make sure the blit mapping is valid */
if ((src->map->dst != dst) || if ((src->map->dst != dst) ||
(src->map->dst->format_version != src->map->format_version)) { (src->map->dst->format_version != src->map->format_version)) {
if (GAL_MapSurface(src, dst) < 0) { if (GAL_MapSurface(src, srcrect, dst, dstrect, op) < 0) {
return(-1); return(-1);
} }
} }
@@ -544,7 +548,7 @@ int GAL_LowerBlit (GAL_Surface *src, GAL_Rect *srcrect,
_DBG_PRINTF("calling do_blit: from (%d, %d, %d, %d) to (%d, %d)\n", _DBG_PRINTF("calling do_blit: from (%d, %d, %d, %d) to (%d, %d)\n",
srcrect->x, srcrect->y, srcrect->w, srcrect->h, srcrect->x, srcrect->y, srcrect->w, srcrect->h,
dstrect->x, dstrect->y); dstrect->x, dstrect->y);
ret = do_blit(src, srcrect, dst, dstrect); ret = do_blit(src->map->video, src, srcrect, dst, dstrect);
#endif #endif
return ret; return ret;
@@ -867,7 +871,7 @@ int GAL_FillRect(GAL_Surface *dst, const GAL_Rect *dstrect, Uint32 color)
if (dstrect) { if (dstrect) {
/* Perform clipping */ /* Perform clipping */
if (!GAL_IntersectRect(dstrect, &dst->clip_rect, &my_dstrect)) { if (!GAL_IntersectRect(dstrect, &dst->clip_rect, &my_dstrect)) {
return(0); return 0;
} }
} else { } else {
my_dstrect = dst->clip_rect; my_dstrect = dst->clip_rect;
@@ -876,7 +880,8 @@ int GAL_FillRect(GAL_Surface *dst, const GAL_Rect *dstrect, Uint32 color)
/* Check for hardware acceleration */ /* Check for hardware acceleration */
if (((dst->flags & GAL_HWSURFACE) == GAL_HWSURFACE) && if (((dst->flags & GAL_HWSURFACE) == GAL_HWSURFACE) &&
video->info.blit_fill) { video->info.blit_fill) {
return(video->FillHWRect(this, dst, &my_dstrect, color)); if (video->FillHWRect(this, dst, &my_dstrect, color) == 0)
return 0;
} }
#ifdef _MGUSE_PIXMAN #ifdef _MGUSE_PIXMAN
@@ -1831,10 +1836,15 @@ void GAL_FreeSurface (GAL_Surface *surface)
} }
if (surface->shared_header) { if (surface->shared_header) {
if (surface->shared_header->creator == getpid()) if (surface->flags & GAL_SSURF_ATTACHED)
GAL_FreeSharedSurfaceData(surface); GAL_DetachSharedSurfaceData(surface);
else else
GAL_DettachSharedSurfaceData(surface); GAL_FreeSharedSurfaceData(surface);
if (surface->fd >= 0) {
close(surface->fd);
surface->fd = -1;
}
surface->hwdata = NULL; surface->hwdata = NULL;
surface->pixels = NULL; surface->pixels = NULL;
@@ -2102,3 +2112,22 @@ BYTE* gal_PutPixelAlphaChannel (GAL_Surface* dst, BYTE* dstrow,
return dstrow; return dstrow;
} }
int GAL_LockSurface(GAL_Surface *surface)
{
GAL_VideoDevice *video = surface->video;
if (video && GAL_MUSTLOCK(surface) && video->LockHWSurface) {
video->LockHWSurface(video, surface);
return 0;
}
return -1;
}
void GAL_UnlockSurface (GAL_Surface *surface)
{
GAL_VideoDevice *video = surface->video;
if (video && GAL_MUSTLOCK(surface) && video->UnlockHWSurface) {
video->UnlockHWSurface(video, surface);
}
}
-2
View File
@@ -137,8 +137,6 @@ static GAL_VideoDevice * SVPXXOSD_CreateDevice (int devindex)
device->AllocHWSurface = SVPXXOSD_AllocHWSurface; device->AllocHWSurface = SVPXXOSD_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = SVPXXOSD_FreeHWSurface; device->FreeHWSurface = SVPXXOSD_FreeHWSurface;
device->UpdateRects = NULL; device->UpdateRects = NULL;
+20 -9
View File
@@ -128,6 +128,9 @@ struct GAL_VideoDevice {
*/ */
void (*UpdateRects)(_THIS, int numrects, GAL_Rect *rects); void (*UpdateRects)(_THIS, int numrects, GAL_Rect *rects);
/* Wait vertical blank */
BOOL (*WaitVBlank)(_THIS);
/* Synchronize the dirty content */ /* Synchronize the dirty content */
BOOL (*SyncUpdate)(_THIS); BOOL (*SyncUpdate)(_THIS);
@@ -171,10 +174,10 @@ struct GAL_VideoDevice {
int (*AttachSharedHWSurface)(_THIS, GAL_Surface *surface, int (*AttachSharedHWSurface)(_THIS, GAL_Surface *surface,
int prime_fd, size_t mapsize, BOOL with_rw); int prime_fd, size_t mapsize, BOOL with_rw);
/* Dettach from a shared surface in hardware video memory. /* Detach from a shared surface in hardware video memory.
Set to NULL if no hardware shared surface supported. Set to NULL if no hardware shared surface supported.
Return 0 if success, otherwise -1. */ Return 0 if success, otherwise -1. */
int (*DettachSharedHWSurface)(_THIS, GAL_Surface *surface); int (*DetachSharedHWSurface)(_THIS, GAL_Surface *surface);
/* Allocate a dumb surface from hardware. /* Allocate a dumb surface from hardware.
Set to NULL if dumb surface is not supported. Set to NULL if dumb surface is not supported.
@@ -198,22 +201,30 @@ struct GAL_VideoDevice {
/* Set the hardware accelerated blit function, if any, based /* Set the hardware accelerated blit function, if any, based
on the current flags of the surface (colorkey, alpha, etc.) on the current flags of the surface (colorkey, alpha, etc.)
*/ */
int (*CheckHWBlit)(_THIS, GAL_Surface *src, GAL_Surface *dst); int (*CheckHWBlit)(_THIS, GAL_Surface *src, const GAL_Rect *srcrc,
GAL_Surface *dst, const GAL_Rect *dstrc, DWORD op);
/* Fills a surface rectangle with the given color */ /* Fills a surface rectangle with the given color */
int (*FillHWRect)(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color); int (*FillHWRect)(_THIS, GAL_Surface *dst, const GAL_Rect *dstrc,
Uint32 color);
/* Copies pixles in the source surface to the destination surface
with or without scaling, rotation, or flip; nullable. */
int (*CopyHWSurface)(_THIS,
GAL_Surface *src, const GAL_Rect *srcrc,
GAL_Surface *dst, const GAL_Rect *dstrc, BlitCopyOperation op);
/* Returns a readable/writable surface; nullable. */
int (*LockHWSurface)(_THIS, GAL_Surface *surface);
void (*UnlockHWSurface)(_THIS, GAL_Surface *surface);
#if 0
/* Set video mem colorkey and accelerated blit function */ /* Set video mem colorkey and accelerated blit function */
int (*SetHWColorKey)(_THIS, GAL_Surface *surface, Uint32 key); int (*SetHWColorKey)(_THIS, GAL_Surface *surface, Uint32 key);
/* Set per surface hardware alpha value */ /* Set per surface hardware alpha value */
int (*SetHWAlpha)(_THIS, GAL_Surface *surface, Uint8 value); int (*SetHWAlpha)(_THIS, GAL_Surface *surface, Uint8 value);
#if 0
/* Returns a readable/writable surface */
int (*LockHWSurface)(_THIS, GAL_Surface *surface);
void (*UnlockHWSurface)(_THIS, GAL_Surface *surface);
/* Performs hardware flipping */ /* Performs hardware flipping */
int (*FlipHWSurface)(_THIS, GAL_Surface *surface); int (*FlipHWSurface)(_THIS, GAL_Surface *surface);
#endif #endif
-2
View File
@@ -383,8 +383,6 @@ static GAL_VideoDevice *USVFB_CreateDevice (int devindex)
device->AllocHWSurface = USVFB_AllocHWSurface; device->AllocHWSurface = USVFB_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = USVFB_FreeHWSurface; device->FreeHWSurface = USVFB_FreeHWSurface;
device->UpdateRects = USVFB_UpdateRects; device->UpdateRects = USVFB_UpdateRects;
-2
View File
@@ -350,8 +350,6 @@ static GAL_VideoDevice *UTPMC_CreateDevice (int devindex)
device->AllocHWSurface = UTPMC_AllocHWSurface; device->AllocHWSurface = UTPMC_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = UTPMC_FreeHWSurface; device->FreeHWSurface = UTPMC_FreeHWSurface;
device->UpdateRects = UTPMC_UpdateRects; device->UpdateRects = UTPMC_UpdateRects;
-2
View File
@@ -508,8 +508,6 @@ static GAL_VideoDevice *UTPMC_CreateDevice (int devindex)
device->AllocHWSurface = UTPMC_AllocHWSurface; device->AllocHWSurface = UTPMC_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
device->FillHWRect = NULL; device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = UTPMC_FreeHWSurface; device->FreeHWSurface = UTPMC_FreeHWSurface;
device->UpdateRects = UTPMC_UpdateRects; device->UpdateRects = UTPMC_UpdateRects;
+2 -2
View File
@@ -918,9 +918,9 @@ BOOL GAL_SyncUpdate (GAL_Surface *surface)
#ifdef _MGSCHEMA_COMPOSITING #ifdef _MGSCHEMA_COMPOSITING
if (surface->shared_header) { if (surface->shared_header) {
LOCK_SURFACE_SEM (surface->shared_header->sem_num); __mg_lock_file_for_write (surface->fd);
mark_surface_dirty (surface, numrects, rects); mark_surface_dirty (surface, numrects, rects);
UNLOCK_SURFACE_SEM (surface->shared_header->sem_num); __mg_unlock_file_for_write (surface->fd);
} }
else if (surface->dirty_info) { else if (surface->dirty_info) {
mark_surface_dirty (surface, numrects, rects); mark_surface_dirty (surface, numrects, rects);
-2
View File
@@ -148,8 +148,6 @@ static GAL_VideoDevice *WVFB_CreateDevice (int devindex)
this->CheckHWBlit = NULL; this->CheckHWBlit = NULL;
this->FillHWRect = NULL; this->FillHWRect = NULL;
this->SetHWColorKey = NULL;
this->SetHWAlpha = NULL;
this->free = WVFB_DeleteDevice; this->free = WVFB_DeleteDevice;
-2
View File
@@ -261,8 +261,6 @@ static GAL_VideoDevice *XXVFB_CreateDevice (int devindex)
this->CheckHWBlit = NULL; this->CheckHWBlit = NULL;
this->FillHWRect = NULL; this->FillHWRect = NULL;
this->SetHWColorKey = NULL;
this->SetHWAlpha = NULL;
this->free = XXVFB_DeleteDevice; this->free = XXVFB_DeleteDevice;
+2 -1
View File
@@ -14,7 +14,8 @@ SRC_FILES = gdi.c attr.c clip.c map.c coor.c rect.c \
simple-glyph-renderer.c glyph-shaped.c \ simple-glyph-renderer.c glyph-shaped.c \
textruns.c \ textruns.c \
shape-glyphs-basic.c shape-glyphs-complex.c \ shape-glyphs-basic.c shape-glyphs-complex.c \
layout.c layout-utils.c layout-ellipsize.c layout.c layout-utils.c layout-ellipsize.c \
shared-surface.c
HDR_FILES = glyph.h drawtext.h mi.h midc.h mistruct.h miwideline.h \ HDR_FILES = glyph.h drawtext.h mi.h midc.h mistruct.h miwideline.h \
pixel_ops.h mifillarc.h mispans.h polygon.h mifpoly.h \ pixel_ops.h mifillarc.h mispans.h polygon.h mifpoly.h \

Some files were not shown because too many files have changed in this diff Show More