diff options
120 files changed, 3396 insertions, 7872 deletions
diff --git a/fontconfig/fc-lang/ja.orth b/fontconfig/fc-lang/ja.orth index e87269b85..dbc16d4d7 100644 --- a/fontconfig/fc-lang/ja.orth +++ b/fontconfig/fc-lang/ja.orth @@ -21,13 +21,14 @@ # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # -# Coverage from JIS X 0208 (1990) +# Coverage from JIS X 0208 (1997) for non kanji characters, and +# Joyo Kanji List (2010, cabinet notification of regular-use chinese characters) # 0x3000 # IDEOGRAPHIC SPACE 0x3001 # IDEOGRAPHIC COMMA 0x3002 # IDEOGRAPHIC FULL STOP 0x3005 # IDEOGRAPHIC ITERATION MARK -0x3006 # IDEOGRAPHIC CLOSING MARK +#0x3006 # IDEOGRAPHIC CLOSING MARK # not in Sawarabi Gothic 0x3007 # IDEOGRAPHIC NUMBER ZERO 0x3041 # HIRAGANA LETTER SMALL A 0x3042 # HIRAGANA LETTER A @@ -216,171 +217,88 @@ 0x4E0B # <CJK> 0x4E0D # <CJK> 0x4E0E # <CJK> -0x4E10 # <CJK> -0x4E11 # <CJK> 0x4E14 # <CJK> -0x4E15 # <CJK> 0x4E16 # <CJK> -0x4E17 # <CJK> 0x4E18 # <CJK> 0x4E19 # <CJK> -0x4E1E # <CJK> 0x4E21 # <CJK> 0x4E26 # <CJK> -0x4E2A # <CJK> 0x4E2D # <CJK> -0x4E31 # <CJK> 0x4E32 # <CJK> -0x4E36 # <CJK> 0x4E38 # <CJK> 0x4E39 # <CJK> 0x4E3B # <CJK> 0x4E3C # <CJK> -0x4E3F # <CJK> -0x4E42 # <CJK> -0x4E43 # <CJK> 0x4E45 # <CJK> -0x4E4B # <CJK> -0x4E4D # <CJK> -0x4E4E # <CJK> 0x4E4F # <CJK> -0x4E55 # <CJK> -0x4E56 # <CJK> 0x4E57 # <CJK> -0x4E58 # <CJK> 0x4E59 # <CJK> 0x4E5D # <CJK> 0x4E5E # <CJK> -0x4E5F # <CJK> -0x4E62 # <CJK> 0x4E71 # <CJK> 0x4E73 # <CJK> 0x4E7E # <CJK> 0x4E80 # <CJK> -0x4E82 # <CJK> -0x4E85 # <CJK> 0x4E86 # <CJK> 0x4E88 # <CJK> 0x4E89 # <CJK> -0x4E8A # <CJK> 0x4E8B # <CJK> 0x4E8C # <CJK> -0x4E8E # <CJK> -0x4E91 # <CJK> 0x4E92 # <CJK> 0x4E94 # <CJK> 0x4E95 # <CJK> -0x4E98 # <CJK> -0x4E99 # <CJK> -0x4E9B # <CJK> 0x4E9C # <CJK> -0x4E9E # <CJK> -0x4E9F # <CJK> -0x4EA0 # <CJK> 0x4EA1 # <CJK> -0x4EA2 # <CJK> 0x4EA4 # <CJK> -0x4EA5 # <CJK> -0x4EA6 # <CJK> -0x4EA8 # <CJK> 0x4EAB # <CJK> 0x4EAC # <CJK> 0x4EAD # <CJK> -0x4EAE # <CJK> -0x4EB0 # <CJK> -0x4EB3 # <CJK> -0x4EB6 # <CJK> 0x4EBA # <CJK> -0x4EC0 # <CJK> 0x4EC1 # <CJK> -0x4EC2 # <CJK> -0x4EC4 # <CJK> -0x4EC6 # <CJK> -0x4EC7 # <CJK> 0x4ECA # <CJK> 0x4ECB # <CJK> -0x4ECD # <CJK> -0x4ECE # <CJK> 0x4ECF # <CJK> -0x4ED4 # <CJK> 0x4ED5 # <CJK> 0x4ED6 # <CJK> -0x4ED7 # <CJK> 0x4ED8 # <CJK> 0x4ED9 # <CJK> -0x4EDD # <CJK> -0x4EDE # <CJK> -0x4EDF # <CJK> 0x4EE3 # <CJK> 0x4EE4 # <CJK> 0x4EE5 # <CJK> -0x4EED # <CJK> 0x4EEE # <CJK> 0x4EF0 # <CJK> 0x4EF2 # <CJK> 0x4EF6 # <CJK> -0x4EF7 # <CJK> 0x4EFB # <CJK> 0x4F01 # <CJK> -0x4F09 # <CJK> -0x4F0A # <CJK> -0x4F0D # <CJK> 0x4F0E # <CJK> 0x4F0F # <CJK> 0x4F10 # <CJK> 0x4F11 # <CJK> 0x4F1A # <CJK> -0x4F1C # <CJK> 0x4F1D # <CJK> 0x4F2F # <CJK> -0x4F30 # <CJK> 0x4F34 # <CJK> -0x4F36 # <CJK> 0x4F38 # <CJK> 0x4F3A # <CJK> 0x4F3C # <CJK> -0x4F3D # <CJK> -0x4F43 # <CJK> 0x4F46 # <CJK> -0x4F47 # <CJK> 0x4F4D # <CJK> 0x4F4E # <CJK> 0x4F4F # <CJK> 0x4F50 # <CJK> -0x4F51 # <CJK> 0x4F53 # <CJK> 0x4F55 # <CJK> -0x4F57 # <CJK> 0x4F59 # <CJK> -0x4F5A # <CJK> -0x4F5B # <CJK> 0x4F5C # <CJK> -0x4F5D # <CJK> -0x4F5E # <CJK> -0x4F69 # <CJK> -0x4F6F # <CJK> -0x4F70 # <CJK> 0x4F73 # <CJK> 0x4F75 # <CJK> -0x4F76 # <CJK> -0x4F7B # <CJK> -0x4F7C # <CJK> 0x4F7F # <CJK> -0x4F83 # <CJK> -0x4F86 # <CJK> -0x4F88 # <CJK> 0x4F8B # <CJK> 0x4F8D # <CJK> -0x4F8F # <CJK> -0x4F91 # <CJK> -0x4F96 # <CJK> -0x4F98 # <CJK> 0x4F9B # <CJK> 0x4F9D # <CJK> -0x4FA0 # <CJK> 0x4FA1 # <CJK> -0x4FAB # <CJK> -0x4FAD # <CJK> 0x4FAE # <CJK> 0x4FAF # <CJK> 0x4FB5 # <CJK> @@ -388,364 +306,165 @@ 0x4FBF # <CJK> 0x4FC2 # <CJK> 0x4FC3 # <CJK> -0x4FC4 # <CJK> 0x4FCA # <CJK> -0x4FCE # <CJK> -0x4FD0 # <CJK> -0x4FD1 # <CJK> -0x4FD4 # <CJK> 0x4FD7 # <CJK> -0x4FD8 # <CJK> -0x4FDA # <CJK> -0x4FDB # <CJK> 0x4FDD # <CJK> -0x4FDF # <CJK> 0x4FE1 # <CJK> -0x4FE3 # <CJK> -0x4FE4 # <CJK> -0x4FE5 # <CJK> 0x4FEE # <CJK> -0x4FEF # <CJK> 0x4FF3 # <CJK> 0x4FF5 # <CJK> -0x4FF6 # <CJK> 0x4FF8 # <CJK> 0x4FFA # <CJK> -0x4FFE # <CJK> -0x5005 # <CJK> -0x5006 # <CJK> 0x5009 # <CJK> 0x500B # <CJK> 0x500D # <CJK> -0x500F # <CJK> -0x5011 # <CJK> 0x5012 # <CJK> -0x5014 # <CJK> -0x5016 # <CJK> 0x5019 # <CJK> -0x501A # <CJK> 0x501F # <CJK> -0x5021 # <CJK> 0x5023 # <CJK> 0x5024 # <CJK> -0x5025 # <CJK> -0x5026 # <CJK> -0x5028 # <CJK> -0x5029 # <CJK> -0x502A # <CJK> 0x502B # <CJK> -0x502C # <CJK> -0x502D # <CJK> -0x5036 # <CJK> 0x5039 # <CJK> -0x5043 # <CJK> -0x5047 # <CJK> -0x5048 # <CJK> 0x5049 # <CJK> 0x504F # <CJK> -0x5050 # <CJK> -0x5055 # <CJK> -0x5056 # <CJK> -0x505A # <CJK> 0x505C # <CJK> 0x5065 # <CJK> -0x506C # <CJK> -0x5072 # <CJK> 0x5074 # <CJK> 0x5075 # <CJK> 0x5076 # <CJK> -0x5078 # <CJK> 0x507D # <CJK> -0x5080 # <CJK> -0x5085 # <CJK> 0x508D # <CJK> 0x5091 # <CJK> 0x5098 # <CJK> 0x5099 # <CJK> -0x509A # <CJK> 0x50AC # <CJK> -0x50AD # <CJK> 0x50B2 # <CJK> -0x50B3 # <CJK> -0x50B4 # <CJK> 0x50B5 # <CJK> 0x50B7 # <CJK> 0x50BE # <CJK> -0x50C2 # <CJK> 0x50C5 # <CJK> -0x50C9 # <CJK> -0x50CA # <CJK> 0x50CD # <CJK> 0x50CF # <CJK> -0x50D1 # <CJK> 0x50D5 # <CJK> -0x50D6 # <CJK> 0x50DA # <CJK> -0x50DE # <CJK> -0x50E3 # <CJK> -0x50E5 # <CJK> 0x50E7 # <CJK> -0x50ED # <CJK> -0x50EE # <CJK> -0x50F5 # <CJK> -0x50F9 # <CJK> -0x50FB # <CJK> 0x5100 # <CJK> -0x5101 # <CJK> -0x5102 # <CJK> 0x5104 # <CJK> -0x5109 # <CJK> 0x5112 # <CJK> -0x5114 # <CJK> -0x5115 # <CJK> -0x5116 # <CJK> -0x5118 # <CJK> -0x511A # <CJK> 0x511F # <CJK> -0x5121 # <CJK> 0x512A # <CJK> -0x5132 # <CJK> -0x5137 # <CJK> -0x513A # <CJK> -0x513B # <CJK> -0x513C # <CJK> -0x513F # <CJK> -0x5140 # <CJK> -0x5141 # <CJK> 0x5143 # <CJK> 0x5144 # <CJK> 0x5145 # <CJK> 0x5146 # <CJK> -0x5147 # <CJK> 0x5148 # <CJK> 0x5149 # <CJK> 0x514B # <CJK> -0x514C # <CJK> 0x514D # <CJK> -0x514E # <CJK> 0x5150 # <CJK> -0x5152 # <CJK> -0x5154 # <CJK> 0x515A # <CJK> -0x515C # <CJK> -0x5162 # <CJK> 0x5165 # <CJK> 0x5168 # <CJK> -0x5169 # <CJK> -0x516A # <CJK> 0x516B # <CJK> 0x516C # <CJK> 0x516D # <CJK> -0x516E # <CJK> 0x5171 # <CJK> 0x5175 # <CJK> -0x5176 # <CJK> 0x5177 # <CJK> 0x5178 # <CJK> 0x517C # <CJK> -0x5180 # <CJK> -0x5182 # <CJK> 0x5185 # <CJK> 0x5186 # <CJK> -0x5189 # <CJK> 0x518A # <CJK> -0x518C # <CJK> 0x518D # <CJK> -0x518F # <CJK> -0x5190 # <CJK> -0x5191 # <CJK> 0x5192 # <CJK> -0x5193 # <CJK> -0x5195 # <CJK> -0x5196 # <CJK> 0x5197 # <CJK> 0x5199 # <CJK> 0x51A0 # <CJK> -0x51A2 # <CJK> -0x51A4 # <CJK> 0x51A5 # <CJK> -0x51A6 # <CJK> -0x51A8 # <CJK> -0x51A9 # <CJK> -0x51AA # <CJK> -0x51AB # <CJK> 0x51AC # <CJK> -0x51B0 # <CJK> -0x51B1 # <CJK> -0x51B2 # <CJK> -0x51B3 # <CJK> -0x51B4 # <CJK> -0x51B5 # <CJK> 0x51B6 # <CJK> 0x51B7 # <CJK> -0x51BD # <CJK> 0x51C4 # <CJK> -0x51C5 # <CJK> 0x51C6 # <CJK> -0x51C9 # <CJK> -0x51CB # <CJK> -0x51CC # <CJK> 0x51CD # <CJK> -0x51D6 # <CJK> -0x51DB # <CJK> -#0x51DC # <CJK> # not in kochi fonts 0x51DD # <CJK> -0x51E0 # <CJK> 0x51E1 # <CJK> 0x51E6 # <CJK> -0x51E7 # <CJK> -0x51E9 # <CJK> -0x51EA # <CJK> -0x51ED # <CJK> -0x51F0 # <CJK> -0x51F1 # <CJK> -0x51F5 # <CJK> 0x51F6 # <CJK> 0x51F8 # <CJK> 0x51F9 # <CJK> 0x51FA # <CJK> -0x51FD # <CJK> -0x51FE # <CJK> 0x5200 # <CJK> 0x5203 # <CJK> -0x5204 # <CJK> 0x5206 # <CJK> 0x5207 # <CJK> 0x5208 # <CJK> 0x520A # <CJK> -0x520B # <CJK> -0x520E # <CJK> 0x5211 # <CJK> -0x5214 # <CJK> 0x5217 # <CJK> 0x521D # <CJK> 0x5224 # <CJK> 0x5225 # <CJK> -0x5227 # <CJK> 0x5229 # <CJK> -0x522A # <CJK> -0x522E # <CJK> 0x5230 # <CJK> -0x5233 # <CJK> 0x5236 # <CJK> 0x5237 # <CJK> 0x5238 # <CJK> 0x5239 # <CJK> 0x523A # <CJK> 0x523B # <CJK> -0x5243 # <CJK> -0x5244 # <CJK> 0x5247 # <CJK> 0x524A # <CJK> -0x524B # <CJK> -0x524C # <CJK> 0x524D # <CJK> -0x524F # <CJK> -0x5254 # <CJK> 0x5256 # <CJK> 0x525B # <CJK> -0x525E # <CJK> +#0x525D # <CJK> # not in sazanami gothic/mincho, DroidSansJapanese 0x5263 # <CJK> 0x5264 # <CJK> -0x5265 # <CJK> -0x5269 # <CJK> -0x526A # <CJK> 0x526F # <CJK> 0x5270 # <CJK> -0x5271 # <CJK> 0x5272 # <CJK> -0x5273 # <CJK> -0x5274 # <CJK> 0x5275 # <CJK> -0x527D # <CJK> -0x527F # <CJK> -0x5283 # <CJK> 0x5287 # <CJK> -0x5288 # <CJK> -0x5289 # <CJK> -0x528D # <CJK> -0x5291 # <CJK> -0x5292 # <CJK> -0x5294 # <CJK> 0x529B # <CJK> 0x529F # <CJK> 0x52A0 # <CJK> 0x52A3 # <CJK> 0x52A9 # <CJK> 0x52AA # <CJK> -0x52AB # <CJK> -0x52AC # <CJK> -0x52AD # <CJK> 0x52B1 # <CJK> 0x52B4 # <CJK> -0x52B5 # <CJK> 0x52B9 # <CJK> -0x52BC # <CJK> 0x52BE # <CJK> -0x52C1 # <CJK> 0x52C3 # <CJK> 0x52C5 # <CJK> 0x52C7 # <CJK> 0x52C9 # <CJK> -0x52CD # <CJK> -0x52D2 # <CJK> 0x52D5 # <CJK> -0x52D7 # <CJK> 0x52D8 # <CJK> 0x52D9 # <CJK> 0x52DD # <CJK> -0x52DE # <CJK> 0x52DF # <CJK> -0x52E0 # <CJK> 0x52E2 # <CJK> -0x52E3 # <CJK> 0x52E4 # <CJK> -0x52E6 # <CJK> 0x52E7 # <CJK> 0x52F2 # <CJK> -0x52F3 # <CJK> -0x52F5 # <CJK> -0x52F8 # <CJK> -0x52F9 # <CJK> -0x52FA # <CJK> 0x52FE # <CJK> -0x52FF # <CJK> -0x5301 # <CJK> 0x5302 # <CJK> 0x5305 # <CJK> -0x5306 # <CJK> -0x5308 # <CJK> -0x530D # <CJK> -0x530F # <CJK> -0x5310 # <CJK> -0x5315 # <CJK> 0x5316 # <CJK> 0x5317 # <CJK> -0x5319 # <CJK> -0x531A # <CJK> -0x531D # <CJK> 0x5320 # <CJK> -0x5321 # <CJK> -0x5323 # <CJK> -0x532A # <CJK> -0x532F # <CJK> -0x5331 # <CJK> -0x5333 # <CJK> -0x5338 # <CJK> 0x5339 # <CJK> 0x533A # <CJK> 0x533B # <CJK> 0x533F # <CJK> -0x5340 # <CJK> 0x5341 # <CJK> 0x5343 # <CJK> -0x5345 # <CJK> -0x5346 # <CJK> 0x5347 # <CJK> 0x5348 # <CJK> -0x5349 # <CJK> 0x534A # <CJK> -0x534D # <CJK> 0x5351 # <CJK> 0x5352 # <CJK> 0x5353 # <CJK> @@ -753,43 +472,21 @@ 0x5357 # <CJK> 0x5358 # <CJK> 0x535A # <CJK> -0x535C # <CJK> -0x535E # <CJK> 0x5360 # <CJK> -0x5366 # <CJK> -0x5369 # <CJK> -0x536E # <CJK> -0x536F # <CJK> 0x5370 # <CJK> 0x5371 # <CJK> 0x5373 # <CJK> 0x5374 # <CJK> 0x5375 # <CJK> -0x5377 # <CJK> 0x5378 # <CJK> -0x537B # <CJK> -0x537F # <CJK> -0x5382 # <CJK> 0x5384 # <CJK> -0x5396 # <CJK> 0x5398 # <CJK> 0x539A # <CJK> 0x539F # <CJK> -0x53A0 # <CJK> -0x53A5 # <CJK> -0x53A6 # <CJK> -0x53A8 # <CJK> -0x53A9 # <CJK> -0x53AD # <CJK> -0x53AE # <CJK> -0x53B0 # <CJK> 0x53B3 # <CJK> -0x53B6 # <CJK> 0x53BB # <CJK> 0x53C2 # <CJK> -0x53C3 # <CJK> 0x53C8 # <CJK> -0x53C9 # <CJK> 0x53CA # <CJK> 0x53CB # <CJK> 0x53CC # <CJK> @@ -799,36 +496,20 @@ 0x53D6 # <CJK> 0x53D7 # <CJK> 0x53D9 # <CJK> -0x53DB # <CJK> -0x53DF # <CJK> -0x53E1 # <CJK> -0x53E2 # <CJK> 0x53E3 # <CJK> 0x53E4 # <CJK> 0x53E5 # <CJK> -0x53E8 # <CJK> -0x53E9 # <CJK> -0x53EA # <CJK> 0x53EB # <CJK> 0x53EC # <CJK> -0x53ED # <CJK> -0x53EE # <CJK> 0x53EF # <CJK> 0x53F0 # <CJK> -0x53F1 # <CJK> 0x53F2 # <CJK> 0x53F3 # <CJK> -0x53F6 # <CJK> 0x53F7 # <CJK> 0x53F8 # <CJK> -0x53FA # <CJK> -0x5401 # <CJK> -0x5403 # <CJK> 0x5404 # <CJK> 0x5408 # <CJK> 0x5409 # <CJK> -0x540A # <CJK> -0x540B # <CJK> 0x540C # <CJK> 0x540D # <CJK> 0x540E # <CJK> @@ -836,273 +517,82 @@ 0x5410 # <CJK> 0x5411 # <CJK> 0x541B # <CJK> -0x541D # <CJK> 0x541F # <CJK> -0x5420 # <CJK> 0x5426 # <CJK> -0x5429 # <CJK> 0x542B # <CJK> -0x542C # <CJK> -0x542D # <CJK> -0x542E # <CJK> -0x5436 # <CJK> 0x5438 # <CJK> 0x5439 # <CJK> -0x543B # <CJK> -0x543C # <CJK> -0x543D # <CJK> -0x543E # <CJK> -0x5440 # <CJK> 0x5442 # <CJK> -0x5446 # <CJK> 0x5448 # <CJK> 0x5449 # <CJK> 0x544A # <CJK> -0x544E # <CJK> -0x5451 # <CJK> -0x545F # <CJK> 0x5468 # <CJK> 0x546A # <CJK> -0x5470 # <CJK> -0x5471 # <CJK> 0x5473 # <CJK> -0x5475 # <CJK> -0x5476 # <CJK> -0x5477 # <CJK> -0x547B # <CJK> 0x547C # <CJK> 0x547D # <CJK> -0x5480 # <CJK> -0x5484 # <CJK> -0x5486 # <CJK> -0x548B # <CJK> 0x548C # <CJK> -0x548E # <CJK> -0x548F # <CJK> -0x5490 # <CJK> -0x5492 # <CJK> -0x54A2 # <CJK> -0x54A4 # <CJK> -0x54A5 # <CJK> -0x54A8 # <CJK> -0x54AB # <CJK> -0x54AC # <CJK> -0x54AF # <CJK> 0x54B2 # <CJK> -0x54B3 # <CJK> -0x54B8 # <CJK> -0x54BC # <CJK> 0x54BD # <CJK> -0x54BE # <CJK> 0x54C0 # <CJK> 0x54C1 # <CJK> -0x54C2 # <CJK> -0x54C4 # <CJK> -0x54C7 # <CJK> -0x54C8 # <CJK> -0x54C9 # <CJK> -0x54D8 # <CJK> 0x54E1 # <CJK> -0x54E2 # <CJK> -0x54E5 # <CJK> -0x54E6 # <CJK> -0x54E8 # <CJK> -0x54E9 # <CJK> -0x54ED # <CJK> -0x54EE # <CJK> 0x54F2 # <CJK> 0x54FA # <CJK> -0x54FD # <CJK> 0x5504 # <CJK> 0x5506 # <CJK> 0x5507 # <CJK> -0x550F # <CJK> 0x5510 # <CJK> -0x5514 # <CJK> -0x5516 # <CJK> -0x552E # <CJK> 0x552F # <CJK> 0x5531 # <CJK> -0x5533 # <CJK> -0x5538 # <CJK> -0x5539 # <CJK> 0x553E # <CJK> -0x5540 # <CJK> -0x5544 # <CJK> -0x5545 # <CJK> 0x5546 # <CJK> -0x554C # <CJK> 0x554F # <CJK> 0x5553 # <CJK> -0x5556 # <CJK> -0x5557 # <CJK> -0x555C # <CJK> -0x555D # <CJK> -0x5563 # <CJK> -0x557B # <CJK> -0x557C # <CJK> -0x557E # <CJK> -0x5580 # <CJK> -0x5583 # <CJK> 0x5584 # <CJK> -0x5587 # <CJK> 0x5589 # <CJK> -0x558A # <CJK> -0x558B # <CJK> -0x5598 # <CJK> -0x5599 # <CJK> 0x559A # <CJK> 0x559C # <CJK> 0x559D # <CJK> -0x559E # <CJK> -0x559F # <CJK> -0x55A7 # <CJK> -0x55A8 # <CJK> 0x55A9 # <CJK> 0x55AA # <CJK> 0x55AB # <CJK> -0x55AC # <CJK> -0x55AE # <CJK> -0x55B0 # <CJK> 0x55B6 # <CJK> -0x55C4 # <CJK> 0x55C5 # <CJK> -0x55C7 # <CJK> -0x55D4 # <CJK> -0x55DA # <CJK> -0x55DC # <CJK> -0x55DF # <CJK> 0x55E3 # <CJK> -0x55E4 # <CJK> -0x55F7 # <CJK> -0x55F9 # <CJK> -0x55FD # <CJK> -0x55FE # <CJK> 0x5606 # <CJK> -0x5609 # <CJK> -0x5614 # <CJK> -0x5616 # <CJK> -0x5617 # <CJK> -0x5618 # <CJK> -0x561B # <CJK> -0x5629 # <CJK> -0x562F # <CJK> 0x5631 # <CJK> 0x5632 # <CJK> -0x5634 # <CJK> -0x5636 # <CJK> -0x5638 # <CJK> -0x5642 # <CJK> -0x564C # <CJK> -0x564E # <CJK> -0x5650 # <CJK> -0x565B # <CJK> -0x5664 # <CJK> 0x5668 # <CJK> -0x566A # <CJK> -0x566B # <CJK> -0x566C # <CJK> 0x5674 # <CJK> -0x5678 # <CJK> -0x567A # <CJK> -0x5680 # <CJK> -0x5686 # <CJK> 0x5687 # <CJK> -0x568A # <CJK> -0x568F # <CJK> -0x5694 # <CJK> -0x56A0 # <CJK> -0x56A2 # <CJK> -0x56A5 # <CJK> -0x56AE # <CJK> -0x56B4 # <CJK> -0x56B6 # <CJK> -0x56BC # <CJK> -0x56C0 # <CJK> -0x56C1 # <CJK> -0x56C2 # <CJK> -0x56C3 # <CJK> -0x56C8 # <CJK> -0x56CE # <CJK> -0x56D1 # <CJK> -0x56D3 # <CJK> -0x56D7 # <CJK> -0x56D8 # <CJK> 0x56DA # <CJK> 0x56DB # <CJK> 0x56DE # <CJK> 0x56E0 # <CJK> 0x56E3 # <CJK> -0x56EE # <CJK> 0x56F0 # <CJK> 0x56F2 # <CJK> 0x56F3 # <CJK> -0x56F9 # <CJK> 0x56FA # <CJK> 0x56FD # <CJK> -0x56FF # <CJK> -0x5700 # <CJK> -0x5703 # <CJK> -0x5704 # <CJK> -0x5708 # <CJK> -0x5709 # <CJK> -0x570B # <CJK> -0x570D # <CJK> 0x570F # <CJK> 0x5712 # <CJK> -0x5713 # <CJK> -0x5716 # <CJK> -0x5718 # <CJK> -0x571C # <CJK> 0x571F # <CJK> -0x5726 # <CJK> 0x5727 # <CJK> 0x5728 # <CJK> -0x572D # <CJK> 0x5730 # <CJK> -0x5737 # <CJK> -0x5738 # <CJK> -0x573B # <CJK> -0x5740 # <CJK> 0x5742 # <CJK> 0x5747 # <CJK> 0x574A # <CJK> -0x574E # <CJK> -0x574F # <CJK> -0x5750 # <CJK> 0x5751 # <CJK> -0x5761 # <CJK> -0x5764 # <CJK> -0x5766 # <CJK> -0x5769 # <CJK> 0x576A # <CJK> -0x577F # <CJK> 0x5782 # <CJK> -0x5788 # <CJK> -0x5789 # <CJK> 0x578B # <CJK> -0x5793 # <CJK> -0x57A0 # <CJK> -0x57A2 # <CJK> 0x57A3 # <CJK> -0x57A4 # <CJK> -0x57AA # <CJK> -0x57B0 # <CJK> -0x57B3 # <CJK> -0x57C0 # <CJK> -0x57C3 # <CJK> -0x57C6 # <CJK> 0x57CB # <CJK> 0x57CE # <CJK> -0x57D2 # <CJK> -0x57D3 # <CJK> -0x57D4 # <CJK> -0x57D6 # <CJK> -0x57DC # <CJK> 0x57DF # <CJK> -0x57E0 # <CJK> -0x57E3 # <CJK> -0x57F4 # <CJK> 0x57F7 # <CJK> 0x57F9 # <CJK> 0x57FA # <CJK> @@ -1111,267 +601,111 @@ 0x5802 # <CJK> 0x5805 # <CJK> 0x5806 # <CJK> -0x580A # <CJK> -0x580B # <CJK> 0x5815 # <CJK> -0x5819 # <CJK> -0x581D # <CJK> -0x5821 # <CJK> 0x5824 # <CJK> 0x582A # <CJK> -0x582F # <CJK> -0x5830 # <CJK> 0x5831 # <CJK> 0x5834 # <CJK> -0x5835 # <CJK> -0x583A # <CJK> -0x583D # <CJK> 0x5840 # <CJK> 0x5841 # <CJK> 0x584A # <CJK> -0x584B # <CJK> 0x5851 # <CJK> -0x5852 # <CJK> 0x5854 # <CJK> 0x5857 # <CJK> -0x5858 # <CJK> -0x5859 # <CJK> 0x585A # <CJK> 0x585E # <CJK> -0x5862 # <CJK> +#0x5861 # <CJK> # not in DroidSansJapanese 0x5869 # <CJK> -0x586B # <CJK> -0x5870 # <CJK> -0x5872 # <CJK> -0x5875 # <CJK> -0x5879 # <CJK> 0x587E # <CJK> 0x5883 # <CJK> -0x5885 # <CJK> 0x5893 # <CJK> 0x5897 # <CJK> 0x589C # <CJK> -0x589F # <CJK> 0x58A8 # <CJK> -0x58AB # <CJK> -0x58AE # <CJK> 0x58B3 # <CJK> -0x58B8 # <CJK> -0x58B9 # <CJK> -0x58BA # <CJK> -0x58BB # <CJK> 0x58BE # <CJK> 0x58C1 # <CJK> -0x58C5 # <CJK> 0x58C7 # <CJK> 0x58CA # <CJK> 0x58CC # <CJK> -0x58D1 # <CJK> -0x58D3 # <CJK> -0x58D5 # <CJK> -0x58D7 # <CJK> -0x58D8 # <CJK> -0x58D9 # <CJK> -0x58DC # <CJK> -0x58DE # <CJK> -0x58DF # <CJK> -0x58E4 # <CJK> -0x58E5 # <CJK> 0x58EB # <CJK> -0x58EC # <CJK> 0x58EE # <CJK> -0x58EF # <CJK> 0x58F0 # <CJK> 0x58F1 # <CJK> 0x58F2 # <CJK> -0x58F7 # <CJK> -0x58F9 # <CJK> -0x58FA # <CJK> -0x58FB # <CJK> -0x58FC # <CJK> -0x58FD # <CJK> -0x5902 # <CJK> 0x5909 # <CJK> -0x590A # <CJK> 0x590F # <CJK> -0x5910 # <CJK> 0x5915 # <CJK> 0x5916 # <CJK> -0x5918 # <CJK> -0x5919 # <CJK> 0x591A # <CJK> -0x591B # <CJK> 0x591C # <CJK> 0x5922 # <CJK> -0x5925 # <CJK> 0x5927 # <CJK> 0x5929 # <CJK> 0x592A # <CJK> 0x592B # <CJK> -0x592C # <CJK> -0x592D # <CJK> 0x592E # <CJK> 0x5931 # <CJK> -0x5932 # <CJK> -0x5937 # <CJK> -0x5938 # <CJK> -0x593E # <CJK> -0x5944 # <CJK> 0x5947 # <CJK> 0x5948 # <CJK> 0x5949 # <CJK> -0x594E # <CJK> 0x594F # <CJK> -0x5950 # <CJK> 0x5951 # <CJK> 0x5954 # <CJK> -0x5955 # <CJK> -0x5957 # <CJK> -0x5958 # <CJK> -0x595A # <CJK> -0x5960 # <CJK> -0x5962 # <CJK> 0x5965 # <CJK> -0x5967 # <CJK> 0x5968 # <CJK> -0x5969 # <CJK> 0x596A # <CJK> -0x596C # <CJK> 0x596E # <CJK> 0x5973 # <CJK> 0x5974 # <CJK> -0x5978 # <CJK> 0x597D # <CJK> -0x5981 # <CJK> 0x5982 # <CJK> 0x5983 # <CJK> 0x5984 # <CJK> 0x598A # <CJK> -0x598D # <CJK> -0x5993 # <CJK> 0x5996 # <CJK> 0x5999 # <CJK> -0x599B # <CJK> -0x599D # <CJK> -0x59A3 # <CJK> 0x59A5 # <CJK> 0x59A8 # <CJK> 0x59AC # <CJK> -0x59B2 # <CJK> 0x59B9 # <CJK> 0x59BB # <CJK> -0x59BE # <CJK> -0x59C6 # <CJK> 0x59C9 # <CJK> 0x59CB # <CJK> -0x59D0 # <CJK> -0x59D1 # <CJK> 0x59D3 # <CJK> 0x59D4 # <CJK> -0x59D9 # <CJK> -0x59DA # <CJK> -0x59DC # <CJK> -0x59E5 # <CJK> -0x59E6 # <CJK> -0x59E8 # <CJK> -0x59EA # <CJK> 0x59EB # <CJK> -0x59F6 # <CJK> 0x59FB # <CJK> 0x59FF # <CJK> 0x5A01 # <CJK> -0x5A03 # <CJK> -0x5A09 # <CJK> -0x5A11 # <CJK> 0x5A18 # <CJK> -0x5A1A # <CJK> -0x5A1C # <CJK> -0x5A1F # <CJK> 0x5A20 # <CJK> -0x5A25 # <CJK> -0x5A29 # <CJK> 0x5A2F # <CJK> -0x5A35 # <CJK> -0x5A36 # <CJK> -0x5A3C # <CJK> -0x5A40 # <CJK> -0x5A41 # <CJK> 0x5A46 # <CJK> -0x5A49 # <CJK> 0x5A5A # <CJK> -0x5A62 # <CJK> 0x5A66 # <CJK> -0x5A6A # <CJK> -0x5A6C # <CJK> 0x5A7F # <CJK> 0x5A92 # <CJK> -0x5A9A # <CJK> 0x5A9B # <CJK> -0x5ABC # <CJK> -0x5ABD # <CJK> -0x5ABE # <CJK> 0x5AC1 # <CJK> -0x5AC2 # <CJK> 0x5AC9 # <CJK> -0x5ACB # <CJK> 0x5ACC # <CJK> -0x5AD0 # <CJK> -0x5AD6 # <CJK> -0x5AD7 # <CJK> 0x5AE1 # <CJK> -0x5AE3 # <CJK> -0x5AE6 # <CJK> -0x5AE9 # <CJK> -0x5AFA # <CJK> -0x5AFB # <CJK> -0x5B09 # <CJK> -0x5B0B # <CJK> -0x5B0C # <CJK> -0x5B16 # <CJK> 0x5B22 # <CJK> -0x5B2A # <CJK> -0x5B2C # <CJK> -0x5B30 # <CJK> -0x5B32 # <CJK> -0x5B36 # <CJK> -0x5B3E # <CJK> -0x5B40 # <CJK> -0x5B43 # <CJK> -0x5B45 # <CJK> 0x5B50 # <CJK> -0x5B51 # <CJK> 0x5B54 # <CJK> -0x5B55 # <CJK> 0x5B57 # <CJK> 0x5B58 # <CJK> -0x5B5A # <CJK> -0x5B5B # <CJK> -0x5B5C # <CJK> 0x5B5D # <CJK> -0x5B5F # <CJK> 0x5B63 # <CJK> 0x5B64 # <CJK> -0x5B65 # <CJK> 0x5B66 # <CJK> -0x5B69 # <CJK> 0x5B6B # <CJK> -0x5B70 # <CJK> -0x5B71 # <CJK> -0x5B73 # <CJK> -0x5B75 # <CJK> -0x5B78 # <CJK> -0x5B7A # <CJK> -0x5B80 # <CJK> -0x5B83 # <CJK> 0x5B85 # <CJK> 0x5B87 # <CJK> 0x5B88 # <CJK> 0x5B89 # <CJK> -0x5B8B # <CJK> 0x5B8C # <CJK> -0x5B8D # <CJK> -0x5B8F # <CJK> -0x5B95 # <CJK> 0x5B97 # <CJK> 0x5B98 # <CJK> 0x5B99 # <CJK> @@ -1383,47 +717,26 @@ 0x5BA2 # <CJK> 0x5BA3 # <CJK> 0x5BA4 # <CJK> -0x5BA5 # <CJK> -0x5BA6 # <CJK> 0x5BAE # <CJK> 0x5BB0 # <CJK> 0x5BB3 # <CJK> 0x5BB4 # <CJK> 0x5BB5 # <CJK> 0x5BB6 # <CJK> -0x5BB8 # <CJK> 0x5BB9 # <CJK> 0x5BBF # <CJK> 0x5BC2 # <CJK> -0x5BC3 # <CJK> 0x5BC4 # <CJK> -0x5BC5 # <CJK> 0x5BC6 # <CJK> -0x5BC7 # <CJK> -0x5BC9 # <CJK> 0x5BCC # <CJK> -0x5BD0 # <CJK> 0x5BD2 # <CJK> -0x5BD3 # <CJK> -0x5BD4 # <CJK> 0x5BDB # <CJK> 0x5BDD # <CJK> -0x5BDE # <CJK> 0x5BDF # <CJK> 0x5BE1 # <CJK> -0x5BE2 # <CJK> -0x5BE4 # <CJK> -0x5BE5 # <CJK> -0x5BE6 # <CJK> 0x5BE7 # <CJK> -0x5BE8 # <CJK> 0x5BE9 # <CJK> -0x5BEB # <CJK> 0x5BEE # <CJK> -0x5BF0 # <CJK> -0x5BF3 # <CJK> -0x5BF5 # <CJK> -0x5BF6 # <CJK> 0x5BF8 # <CJK> 0x5BFA # <CJK> 0x5BFE # <CJK> @@ -1431,28 +744,15 @@ 0x5C01 # <CJK> 0x5C02 # <CJK> 0x5C04 # <CJK> -0x5C05 # <CJK> 0x5C06 # <CJK> -0x5C07 # <CJK> -0x5C08 # <CJK> 0x5C09 # <CJK> 0x5C0A # <CJK> 0x5C0B # <CJK> -0x5C0D # <CJK> 0x5C0E # <CJK> 0x5C0F # <CJK> 0x5C11 # <CJK> -0x5C13 # <CJK> -0x5C16 # <CJK> 0x5C1A # <CJK> -0x5C20 # <CJK> -0x5C22 # <CJK> -0x5C24 # <CJK> -0x5C28 # <CJK> -0x5C2D # <CJK> 0x5C31 # <CJK> -0x5C38 # <CJK> -0x5C39 # <CJK> 0x5C3A # <CJK> 0x5C3B # <CJK> 0x5C3C # <CJK> @@ -1460,109 +760,31 @@ 0x5C3E # <CJK> 0x5C3F # <CJK> 0x5C40 # <CJK> -0x5C41 # <CJK> 0x5C45 # <CJK> -0x5C46 # <CJK> 0x5C48 # <CJK> 0x5C4A # <CJK> 0x5C4B # <CJK> -0x5C4D # <CJK> -0x5C4E # <CJK> -0x5C4F # <CJK> -0x5C50 # <CJK> -0x5C51 # <CJK> -0x5C53 # <CJK> 0x5C55 # <CJK> 0x5C5E # <CJK> -0x5C60 # <CJK> -0x5C61 # <CJK> 0x5C64 # <CJK> 0x5C65 # <CJK> -0x5C6C # <CJK> -0x5C6E # <CJK> 0x5C6F # <CJK> 0x5C71 # <CJK> -0x5C76 # <CJK> -0x5C79 # <CJK> -0x5C8C # <CJK> 0x5C90 # <CJK> -0x5C91 # <CJK> -0x5C94 # <CJK> 0x5CA1 # <CJK> -0x5CA8 # <CJK> 0x5CA9 # <CJK> -0x5CAB # <CJK> 0x5CAC # <CJK> -0x5CB1 # <CJK> 0x5CB3 # <CJK> -0x5CB6 # <CJK> -0x5CB7 # <CJK> 0x5CB8 # <CJK> -0x5CBB # <CJK> -0x5CBC # <CJK> -0x5CBE # <CJK> -0x5CC5 # <CJK> -0x5CC7 # <CJK> -0x5CD9 # <CJK> 0x5CE0 # <CJK> 0x5CE1 # <CJK> -0x5CE8 # <CJK> -0x5CE9 # <CJK> -0x5CEA # <CJK> -0x5CED # <CJK> -0x5CEF # <CJK> 0x5CF0 # <CJK> 0x5CF6 # <CJK> -0x5CFA # <CJK> -0x5CFB # <CJK> -0x5CFD # <CJK> 0x5D07 # <CJK> -0x5D0B # <CJK> 0x5D0E # <CJK> -0x5D11 # <CJK> -0x5D14 # <CJK> -0x5D15 # <CJK> 0x5D16 # <CJK> -0x5D17 # <CJK> -0x5D18 # <CJK> -0x5D19 # <CJK> -0x5D1A # <CJK> -0x5D1B # <CJK> -0x5D1F # <CJK> -0x5D22 # <CJK> 0x5D29 # <CJK> -0x5D4B # <CJK> -0x5D4C # <CJK> -0x5D4E # <CJK> 0x5D50 # <CJK> -0x5D52 # <CJK> -0x5D5C # <CJK> -0x5D69 # <CJK> -0x5D6C # <CJK> -0x5D6F # <CJK> -0x5D73 # <CJK> -0x5D76 # <CJK> -0x5D82 # <CJK> -0x5D84 # <CJK> -0x5D87 # <CJK> -0x5D8B # <CJK> -0x5D8C # <CJK> -0x5D90 # <CJK> -0x5D9D # <CJK> -0x5DA2 # <CJK> -0x5DAC # <CJK> -0x5DAE # <CJK> -0x5DB7 # <CJK> -0x5DBA # <CJK> -0x5DBC # <CJK> -0x5DBD # <CJK> -0x5DC9 # <CJK> -0x5DCC # <CJK> -0x5DCD # <CJK> -0x5DD2 # <CJK> -0x5DD3 # <CJK> -0x5DD6 # <CJK> -0x5DDB # <CJK> 0x5DDD # <CJK> 0x5DDE # <CJK> 0x5DE1 # <CJK> @@ -1571,27 +793,14 @@ 0x5DE6 # <CJK> 0x5DE7 # <CJK> 0x5DE8 # <CJK> -0x5DEB # <CJK> 0x5DEE # <CJK> 0x5DF1 # <CJK> -0x5DF2 # <CJK> -0x5DF3 # <CJK> -0x5DF4 # <CJK> -0x5DF5 # <CJK> -0x5DF7 # <CJK> 0x5DFB # <CJK> -0x5DFD # <CJK> 0x5DFE # <CJK> 0x5E02 # <CJK> 0x5E03 # <CJK> 0x5E06 # <CJK> -0x5E0B # <CJK> 0x5E0C # <CJK> -0x5E11 # <CJK> -0x5E16 # <CJK> -0x5E19 # <CJK> -0x5E1A # <CJK> -0x5E1B # <CJK> 0x5E1D # <CJK> 0x5E25 # <CJK> 0x5E2B # <CJK> @@ -1599,738 +808,301 @@ 0x5E2F # <CJK> 0x5E30 # <CJK> 0x5E33 # <CJK> -0x5E36 # <CJK> -0x5E37 # <CJK> 0x5E38 # <CJK> 0x5E3D # <CJK> -0x5E40 # <CJK> -0x5E43 # <CJK> -0x5E44 # <CJK> 0x5E45 # <CJK> -0x5E47 # <CJK> -0x5E4C # <CJK> -0x5E4E # <CJK> -0x5E54 # <CJK> 0x5E55 # <CJK> -0x5E57 # <CJK> -0x5E5F # <CJK> -0x5E61 # <CJK> -0x5E62 # <CJK> 0x5E63 # <CJK> -0x5E64 # <CJK> 0x5E72 # <CJK> 0x5E73 # <CJK> 0x5E74 # <CJK> -0x5E75 # <CJK> -0x5E76 # <CJK> 0x5E78 # <CJK> 0x5E79 # <CJK> -0x5E7A # <CJK> 0x5E7B # <CJK> 0x5E7C # <CJK> 0x5E7D # <CJK> 0x5E7E # <CJK> -0x5E7F # <CJK> 0x5E81 # <CJK> 0x5E83 # <CJK> -0x5E84 # <CJK> -0x5E87 # <CJK> 0x5E8A # <CJK> 0x5E8F # <CJK> 0x5E95 # <CJK> -0x5E96 # <CJK> 0x5E97 # <CJK> -0x5E9A # <CJK> 0x5E9C # <CJK> -0x5EA0 # <CJK> 0x5EA6 # <CJK> 0x5EA7 # <CJK> 0x5EAB # <CJK> 0x5EAD # <CJK> -0x5EB5 # <CJK> 0x5EB6 # <CJK> 0x5EB7 # <CJK> 0x5EB8 # <CJK> -0x5EC1 # <CJK> -0x5EC2 # <CJK> 0x5EC3 # <CJK> -0x5EC8 # <CJK> 0x5EC9 # <CJK> 0x5ECA # <CJK> -0x5ECF # <CJK> -0x5ED0 # <CJK> -0x5ED3 # <CJK> -0x5ED6 # <CJK> -0x5EDA # <CJK> -0x5EDB # <CJK> -0x5EDD # <CJK> -0x5EDF # <CJK> -0x5EE0 # <CJK> -0x5EE1 # <CJK> -0x5EE2 # <CJK> -0x5EE3 # <CJK> -0x5EE8 # <CJK> -0x5EE9 # <CJK> -0x5EEC # <CJK> -0x5EF0 # <CJK> -0x5EF1 # <CJK> -0x5EF3 # <CJK> -0x5EF4 # <CJK> 0x5EF6 # <CJK> 0x5EF7 # <CJK> -0x5EF8 # <CJK> 0x5EFA # <CJK> -0x5EFB # <CJK> -0x5EFC # <CJK> -0x5EFE # <CJK> -0x5EFF # <CJK> 0x5F01 # <CJK> -0x5F03 # <CJK> 0x5F04 # <CJK> -0x5F09 # <CJK> 0x5F0A # <CJK> -0x5F0B # <CJK> -0x5F0C # <CJK> -0x5F0D # <CJK> 0x5F0F # <CJK> 0x5F10 # <CJK> -0x5F11 # <CJK> 0x5F13 # <CJK> 0x5F14 # <CJK> 0x5F15 # <CJK> -0x5F16 # <CJK> -0x5F17 # <CJK> -0x5F18 # <CJK> -0x5F1B # <CJK> 0x5F1F # <CJK> 0x5F25 # <CJK> 0x5F26 # <CJK> 0x5F27 # <CJK> -0x5F29 # <CJK> -0x5F2D # <CJK> -0x5F2F # <CJK> 0x5F31 # <CJK> 0x5F35 # <CJK> 0x5F37 # <CJK> -0x5F38 # <CJK> -0x5F3C # <CJK> 0x5F3E # <CJK> -0x5F41 # <CJK> -0x5F48 # <CJK> -0x5F4A # <CJK> -0x5F4C # <CJK> -0x5F4E # <CJK> -0x5F51 # <CJK> 0x5F53 # <CJK> -0x5F56 # <CJK> -0x5F57 # <CJK> 0x5F59 # <CJK> -0x5F5C # <CJK> -0x5F5D # <CJK> -0x5F61 # <CJK> 0x5F62 # <CJK> -0x5F66 # <CJK> 0x5F69 # <CJK> -0x5F6A # <CJK> 0x5F6B # <CJK> -0x5F6C # <CJK> -0x5F6D # <CJK> 0x5F70 # <CJK> 0x5F71 # <CJK> -0x5F73 # <CJK> -0x5F77 # <CJK> 0x5F79 # <CJK> 0x5F7C # <CJK> -0x5F7F # <CJK> 0x5F80 # <CJK> 0x5F81 # <CJK> -0x5F82 # <CJK> -0x5F83 # <CJK> 0x5F84 # <CJK> 0x5F85 # <CJK> -0x5F87 # <CJK> -0x5F88 # <CJK> -0x5F8A # <CJK> 0x5F8B # <CJK> 0x5F8C # <CJK> 0x5F90 # <CJK> -0x5F91 # <CJK> 0x5F92 # <CJK> 0x5F93 # <CJK> 0x5F97 # <CJK> -0x5F98 # <CJK> -0x5F99 # <CJK> -0x5F9E # <CJK> -0x5FA0 # <CJK> 0x5FA1 # <CJK> -0x5FA8 # <CJK> 0x5FA9 # <CJK> 0x5FAA # <CJK> -0x5FAD # <CJK> 0x5FAE # <CJK> 0x5FB3 # <CJK> 0x5FB4 # <CJK> 0x5FB9 # <CJK> -0x5FBC # <CJK> -0x5FBD # <CJK> 0x5FC3 # <CJK> 0x5FC5 # <CJK> 0x5FCC # <CJK> 0x5FCD # <CJK> -0x5FD6 # <CJK> 0x5FD7 # <CJK> 0x5FD8 # <CJK> 0x5FD9 # <CJK> 0x5FDC # <CJK> -0x5FDD # <CJK> 0x5FE0 # <CJK> -0x5FE4 # <CJK> 0x5FEB # <CJK> -0x5FF0 # <CJK> -0x5FF1 # <CJK> 0x5FF5 # <CJK> -0x5FF8 # <CJK> -0x5FFB # <CJK> -0x5FFD # <CJK> -0x5FFF # <CJK> -0x600E # <CJK> -0x600F # <CJK> -0x6010 # <CJK> 0x6012 # <CJK> -0x6015 # <CJK> 0x6016 # <CJK> -0x6019 # <CJK> -0x601B # <CJK> -0x601C # <CJK> 0x601D # <CJK> 0x6020 # <CJK> -0x6021 # <CJK> 0x6025 # <CJK> -0x6026 # <CJK> 0x6027 # <CJK> 0x6028 # <CJK> -0x6029 # <CJK> 0x602A # <CJK> -0x602B # <CJK> -0x602F # <CJK> -0x6031 # <CJK> -0x603A # <CJK> -0x6041 # <CJK> -0x6042 # <CJK> -0x6043 # <CJK> -0x6046 # <CJK> -0x604A # <CJK> 0x604B # <CJK> -0x604D # <CJK> 0x6050 # <CJK> 0x6052 # <CJK> -0x6055 # <CJK> -0x6059 # <CJK> -0x605A # <CJK> -0x605F # <CJK> -0x6060 # <CJK> -0x6062 # <CJK> 0x6063 # <CJK> -0x6064 # <CJK> 0x6065 # <CJK> 0x6068 # <CJK> 0x6069 # <CJK> -0x606A # <CJK> -0x606B # <CJK> -0x606C # <CJK> 0x606D # <CJK> 0x606F # <CJK> -0x6070 # <CJK> 0x6075 # <CJK> -0x6077 # <CJK> -0x6081 # <CJK> -0x6083 # <CJK> -0x6084 # <CJK> -0x6089 # <CJK> -0x608B # <CJK> -0x608C # <CJK> -0x608D # <CJK> -0x6092 # <CJK> 0x6094 # <CJK> -0x6096 # <CJK> -0x6097 # <CJK> -0x609A # <CJK> -0x609B # <CJK> 0x609F # <CJK> 0x60A0 # <CJK> 0x60A3 # <CJK> 0x60A6 # <CJK> -0x60A7 # <CJK> 0x60A9 # <CJK> 0x60AA # <CJK> 0x60B2 # <CJK> -0x60B3 # <CJK> -0x60B4 # <CJK> -0x60B5 # <CJK> -0x60B6 # <CJK> -0x60B8 # <CJK> 0x60BC # <CJK> -0x60BD # <CJK> 0x60C5 # <CJK> -0x60C6 # <CJK> -0x60C7 # <CJK> 0x60D1 # <CJK> -0x60D3 # <CJK> -0x60D8 # <CJK> -0x60DA # <CJK> 0x60DC # <CJK> -0x60DF # <CJK> -0x60E0 # <CJK> -0x60E1 # <CJK> -0x60E3 # <CJK> 0x60E7 # <CJK> 0x60E8 # <CJK> 0x60F0 # <CJK> -0x60F1 # <CJK> 0x60F3 # <CJK> -0x60F4 # <CJK> -0x60F6 # <CJK> -0x60F7 # <CJK> -0x60F9 # <CJK> -0x60FA # <CJK> -0x60FB # <CJK> -0x6100 # <CJK> 0x6101 # <CJK> -0x6103 # <CJK> -0x6106 # <CJK> -0x6108 # <CJK> 0x6109 # <CJK> -0x610D # <CJK> -0x610E # <CJK> 0x610F # <CJK> -0x6115 # <CJK> 0x611A # <CJK> 0x611B # <CJK> 0x611F # <CJK> -0x6121 # <CJK> -0x6127 # <CJK> -0x6128 # <CJK> -0x612C # <CJK> -0x6134 # <CJK> -0x613C # <CJK> -0x613D # <CJK> -0x613E # <CJK> -0x613F # <CJK> -0x6142 # <CJK> 0x6144 # <CJK> -0x6147 # <CJK> 0x6148 # <CJK> -0x614A # <CJK> 0x614B # <CJK> 0x614C # <CJK> -0x614D # <CJK> 0x614E # <CJK> -0x6153 # <CJK> 0x6155 # <CJK> -0x6158 # <CJK> -0x6159 # <CJK> -0x615A # <CJK> -0x615D # <CJK> -0x615F # <CJK> 0x6162 # <CJK> 0x6163 # <CJK> -0x6165 # <CJK> -0x6167 # <CJK> 0x6168 # <CJK> -0x616B # <CJK> 0x616E # <CJK> -0x616F # <CJK> 0x6170 # <CJK> -0x6171 # <CJK> -0x6173 # <CJK> -0x6174 # <CJK> -0x6175 # <CJK> 0x6176 # <CJK> -0x6177 # <CJK> -0x617E # <CJK> 0x6182 # <CJK> -0x6187 # <CJK> -0x618A # <CJK> 0x618E # <CJK> -0x6190 # <CJK> -0x6191 # <CJK> -0x6194 # <CJK> -0x6196 # <CJK> -0x6199 # <CJK> -0x619A # <CJK> 0x61A4 # <CJK> 0x61A7 # <CJK> 0x61A9 # <CJK> -0x61AB # <CJK> 0x61AC # <CJK> -0x61AE # <CJK> 0x61B2 # <CJK> 0x61B6 # <CJK> -0x61BA # <CJK> 0x61BE # <CJK> -0x61C3 # <CJK> -0x61C6 # <CJK> 0x61C7 # <CJK> -0x61C8 # <CJK> -0x61C9 # <CJK> -0x61CA # <CJK> -0x61CB # <CJK> -0x61CC # <CJK> -0x61CD # <CJK> 0x61D0 # <CJK> -0x61E3 # <CJK> -0x61E6 # <CJK> 0x61F2 # <CJK> -0x61F4 # <CJK> -0x61F6 # <CJK> -0x61F7 # <CJK> 0x61F8 # <CJK> -0x61FA # <CJK> -0x61FC # <CJK> -0x61FD # <CJK> -0x61FE # <CJK> -0x61FF # <CJK> -0x6200 # <CJK> -0x6208 # <CJK> -0x6209 # <CJK> -0x620A # <CJK> -0x620C # <CJK> -0x620D # <CJK> -0x620E # <CJK> 0x6210 # <CJK> 0x6211 # <CJK> 0x6212 # <CJK> -0x6214 # <CJK> -0x6216 # <CJK> 0x621A # <CJK> -0x621B # <CJK> -0x621D # <CJK> -0x621E # <CJK> -0x621F # <CJK> -0x6221 # <CJK> 0x6226 # <CJK> -0x622A # <CJK> -0x622E # <CJK> 0x622F # <CJK> -0x6230 # <CJK> -0x6232 # <CJK> -0x6233 # <CJK> 0x6234 # <CJK> 0x6238 # <CJK> 0x623B # <CJK> 0x623F # <CJK> 0x6240 # <CJK> -0x6241 # <CJK> 0x6247 # <CJK> -0x6248 # <CJK> 0x6249 # <CJK> 0x624B # <CJK> 0x624D # <CJK> -0x624E # <CJK> 0x6253 # <CJK> 0x6255 # <CJK> -0x6258 # <CJK> -0x625B # <CJK> -0x625E # <CJK> -0x6260 # <CJK> -0x6263 # <CJK> -0x6268 # <CJK> -0x626E # <CJK> 0x6271 # <CJK> 0x6276 # <CJK> 0x6279 # <CJK> -0x627C # <CJK> -0x627E # <CJK> 0x627F # <CJK> 0x6280 # <CJK> -0x6282 # <CJK> -0x6283 # <CJK> 0x6284 # <CJK> -0x6289 # <CJK> 0x628A # <CJK> 0x6291 # <CJK> -0x6292 # <CJK> -0x6293 # <CJK> -0x6294 # <CJK> 0x6295 # <CJK> -0x6296 # <CJK> 0x6297 # <CJK> 0x6298 # <CJK> -0x629B # <CJK> 0x629C # <CJK> 0x629E # <CJK> 0x62AB # <CJK> -0x62AC # <CJK> 0x62B1 # <CJK> 0x62B5 # <CJK> 0x62B9 # <CJK> -0x62BB # <CJK> 0x62BC # <CJK> 0x62BD # <CJK> -0x62C2 # <CJK> 0x62C5 # <CJK> -0x62C6 # <CJK> -0x62C7 # <CJK> -0x62C8 # <CJK> 0x62C9 # <CJK> -0x62CA # <CJK> -0x62CC # <CJK> 0x62CD # <CJK> -0x62CF # <CJK> 0x62D0 # <CJK> -0x62D1 # <CJK> 0x62D2 # <CJK> 0x62D3 # <CJK> -0x62D4 # <CJK> -0x62D7 # <CJK> 0x62D8 # <CJK> 0x62D9 # <CJK> 0x62DB # <CJK> -0x62DC # <CJK> 0x62DD # <CJK> 0x62E0 # <CJK> 0x62E1 # <CJK> 0x62EC # <CJK> 0x62ED # <CJK> -0x62EE # <CJK> -0x62EF # <CJK> -0x62F1 # <CJK> 0x62F3 # <CJK> -0x62F5 # <CJK> 0x62F6 # <CJK> 0x62F7 # <CJK> 0x62FE # <CJK> -0x62FF # <CJK> 0x6301 # <CJK> -0x6302 # <CJK> 0x6307 # <CJK> -0x6308 # <CJK> -0x6309 # <CJK> -0x630C # <CJK> 0x6311 # <CJK> 0x6319 # <CJK> 0x631F # <CJK> -0x6327 # <CJK> 0x6328 # <CJK> 0x632B # <CJK> 0x632F # <CJK> -0x633A # <CJK> -0x633D # <CJK> -0x633E # <CJK> 0x633F # <CJK> 0x6349 # <CJK> -0x634C # <CJK> -0x634D # <CJK> -0x634F # <CJK> -0x6350 # <CJK> 0x6355 # <CJK> 0x6357 # <CJK> 0x635C # <CJK> -0x6367 # <CJK> 0x6368 # <CJK> -0x6369 # <CJK> -0x636B # <CJK> 0x636E # <CJK> -0x6372 # <CJK> -0x6376 # <CJK> -0x6377 # <CJK> -0x637A # <CJK> 0x637B # <CJK> -0x6380 # <CJK> 0x6383 # <CJK> 0x6388 # <CJK> -0x6389 # <CJK> 0x638C # <CJK> -0x638E # <CJK> -0x638F # <CJK> 0x6392 # <CJK> -0x6396 # <CJK> 0x6398 # <CJK> 0x639B # <CJK> -0x639F # <CJK> -0x63A0 # <CJK> 0x63A1 # <CJK> 0x63A2 # <CJK> -0x63A3 # <CJK> 0x63A5 # <CJK> 0x63A7 # <CJK> 0x63A8 # <CJK> -0x63A9 # <CJK> 0x63AA # <CJK> -0x63AB # <CJK> -0x63AC # <CJK> 0x63B2 # <CJK> -0x63B4 # <CJK> -0x63B5 # <CJK> -0x63BB # <CJK> -0x63BE # <CJK> -0x63C0 # <CJK> -0x63C3 # <CJK> -0x63C4 # <CJK> -0x63C6 # <CJK> -0x63C9 # <CJK> 0x63CF # <CJK> 0x63D0 # <CJK> -0x63D2 # <CJK> -0x63D6 # <CJK> 0x63DA # <CJK> 0x63DB # <CJK> 0x63E1 # <CJK> -0x63E3 # <CJK> -0x63E9 # <CJK> 0x63EE # <CJK> 0x63F4 # <CJK> -0x63F6 # <CJK> 0x63FA # <CJK> -0x6406 # <CJK> 0x640D # <CJK> -0x640F # <CJK> -0x6413 # <CJK> -0x6416 # <CJK> -0x6417 # <CJK> -0x641C # <CJK> -0x6426 # <CJK> -0x6428 # <CJK> 0x642C # <CJK> 0x642D # <CJK> -0x6434 # <CJK> -0x6436 # <CJK> 0x643A # <CJK> 0x643E # <CJK> 0x6442 # <CJK> -0x644E # <CJK> 0x6458 # <CJK> -0x6467 # <CJK> 0x6469 # <CJK> 0x646F # <CJK> -0x6476 # <CJK> -0x6478 # <CJK> -0x647A # <CJK> 0x6483 # <CJK> -0x6488 # <CJK> -0x6492 # <CJK> -0x6493 # <CJK> -0x6495 # <CJK> -0x649A # <CJK> -0x649E # <CJK> 0x64A4 # <CJK> -0x64A5 # <CJK> -0x64A9 # <CJK> -0x64AB # <CJK> -0x64AD # <CJK> 0x64AE # <CJK> -0x64B0 # <CJK> 0x64B2 # <CJK> -0x64B9 # <CJK> -0x64BB # <CJK> -0x64BC # <CJK> 0x64C1 # <CJK> -0x64C2 # <CJK> -0x64C5 # <CJK> -0x64C7 # <CJK> 0x64CD # <CJK> -0x64D2 # <CJK> -0x64D4 # <CJK> -0x64D8 # <CJK> -0x64DA # <CJK> -0x64E0 # <CJK> -0x64E1 # <CJK> -0x64E2 # <CJK> -0x64E3 # <CJK> 0x64E6 # <CJK> -0x64E7 # <CJK> 0x64EC # <CJK> -0x64EF # <CJK> -0x64F1 # <CJK> -0x64F2 # <CJK> -0x64F4 # <CJK> -0x64F6 # <CJK> -0x64FA # <CJK> -0x64FD # <CJK> -0x64FE # <CJK> -0x6500 # <CJK> -0x6505 # <CJK> -0x6518 # <CJK> -0x651C # <CJK> -0x651D # <CJK> -0x6523 # <CJK> -0x6524 # <CJK> -0x652A # <CJK> -0x652B # <CJK> -0x652C # <CJK> 0x652F # <CJK> -0x6534 # <CJK> -0x6535 # <CJK> -0x6536 # <CJK> -0x6537 # <CJK> -0x6538 # <CJK> 0x6539 # <CJK> 0x653B # <CJK> 0x653E # <CJK> 0x653F # <CJK> 0x6545 # <CJK> -0x6548 # <CJK> -0x654D # <CJK> 0x654F # <CJK> 0x6551 # <CJK> -0x6555 # <CJK> -0x6556 # <CJK> 0x6557 # <CJK> -0x6558 # <CJK> 0x6559 # <CJK> -0x655D # <CJK> -0x655E # <CJK> 0x6562 # <CJK> 0x6563 # <CJK> -0x6566 # <CJK> 0x656C # <CJK> 0x6570 # <CJK> -0x6572 # <CJK> 0x6574 # <CJK> 0x6575 # <CJK> 0x6577 # <CJK> -0x6578 # <CJK> -0x6582 # <CJK> -0x6583 # <CJK> 0x6587 # <CJK> -0x6588 # <CJK> 0x6589 # <CJK> -0x658C # <CJK> 0x658E # <CJK> -0x6590 # <CJK> 0x6591 # <CJK> 0x6597 # <CJK> 0x6599 # <CJK> -0x659B # <CJK> 0x659C # <CJK> -0x659F # <CJK> -0x65A1 # <CJK> 0x65A4 # <CJK> 0x65A5 # <CJK> -0x65A7 # <CJK> -0x65AB # <CJK> 0x65AC # <CJK> 0x65AD # <CJK> -0x65AF # <CJK> 0x65B0 # <CJK> -0x65B7 # <CJK> 0x65B9 # <CJK> -0x65BC # <CJK> 0x65BD # <CJK> -0x65C1 # <CJK> -0x65C3 # <CJK> -0x65C4 # <CJK> 0x65C5 # <CJK> -0x65C6 # <CJK> 0x65CB # <CJK> -0x65CC # <CJK> 0x65CF # <CJK> -0x65D2 # <CJK> 0x65D7 # <CJK> -0x65D9 # <CJK> -0x65DB # <CJK> -0x65E0 # <CJK> -0x65E1 # <CJK> 0x65E2 # <CJK> 0x65E5 # <CJK> 0x65E6 # <CJK> @@ -2338,21 +1110,12 @@ 0x65E8 # <CJK> 0x65E9 # <CJK> 0x65EC # <CJK> -0x65ED # <CJK> -0x65F1 # <CJK> 0x65FA # <CJK> -0x65FB # <CJK> -0x6602 # <CJK> -0x6603 # <CJK> 0x6606 # <CJK> 0x6607 # <CJK> -0x660A # <CJK> -0x660C # <CJK> 0x660E # <CJK> -0x660F # <CJK> 0x6613 # <CJK> 0x6614 # <CJK> -0x661C # <CJK> 0x661F # <CJK> 0x6620 # <CJK> 0x6625 # <CJK> @@ -2360,146 +1123,59 @@ 0x6628 # <CJK> 0x662D # <CJK> 0x662F # <CJK> -0x6634 # <CJK> -0x6635 # <CJK> -0x6636 # <CJK> 0x663C # <CJK> -0x663F # <CJK> -0x6641 # <CJK> 0x6642 # <CJK> -0x6643 # <CJK> -0x6644 # <CJK> -0x6649 # <CJK> -0x664B # <CJK> -0x664F # <CJK> -0x6652 # <CJK> -0x665D # <CJK> -0x665E # <CJK> -0x665F # <CJK> -0x6662 # <CJK> -0x6664 # <CJK> -0x6666 # <CJK> -0x6667 # <CJK> -0x6668 # <CJK> 0x6669 # <CJK> 0x666E # <CJK> 0x666F # <CJK> -0x6670 # <CJK> 0x6674 # <CJK> 0x6676 # <CJK> -0x667A # <CJK> 0x6681 # <CJK> -0x6683 # <CJK> -0x6684 # <CJK> 0x6687 # <CJK> -0x6688 # <CJK> -0x6689 # <CJK> -0x668E # <CJK> 0x6691 # <CJK> 0x6696 # <CJK> 0x6697 # <CJK> -0x6698 # <CJK> -0x669D # <CJK> -0x66A2 # <CJK> 0x66A6 # <CJK> 0x66AB # <CJK> 0x66AE # <CJK> 0x66B4 # <CJK> -0x66B8 # <CJK> -0x66B9 # <CJK> -0x66BC # <CJK> -0x66BE # <CJK> -0x66C1 # <CJK> -0x66C4 # <CJK> 0x66C7 # <CJK> -0x66C9 # <CJK> 0x66D6 # <CJK> -0x66D9 # <CJK> -0x66DA # <CJK> 0x66DC # <CJK> -0x66DD # <CJK> -0x66E0 # <CJK> -0x66E6 # <CJK> -0x66E9 # <CJK> -0x66F0 # <CJK> 0x66F2 # <CJK> -0x66F3 # <CJK> 0x66F4 # <CJK> -0x66F5 # <CJK> -0x66F7 # <CJK> 0x66F8 # <CJK> 0x66F9 # <CJK> -0x66FC # <CJK> 0x66FD # <CJK> -0x66FE # <CJK> 0x66FF # <CJK> 0x6700 # <CJK> -0x6703 # <CJK> 0x6708 # <CJK> 0x6709 # <CJK> -0x670B # <CJK> 0x670D # <CJK> -0x670F # <CJK> -0x6714 # <CJK> 0x6715 # <CJK> -0x6716 # <CJK> 0x6717 # <CJK> 0x671B # <CJK> 0x671D # <CJK> -0x671E # <CJK> 0x671F # <CJK> -0x6726 # <CJK> -0x6727 # <CJK> 0x6728 # <CJK> 0x672A # <CJK> 0x672B # <CJK> 0x672C # <CJK> 0x672D # <CJK> -0x672E # <CJK> 0x6731 # <CJK> 0x6734 # <CJK> -0x6736 # <CJK> -0x6737 # <CJK> -0x6738 # <CJK> 0x673A # <CJK> 0x673D # <CJK> -0x673F # <CJK> -0x6741 # <CJK> -0x6746 # <CJK> 0x6749 # <CJK> -0x674E # <CJK> -0x674F # <CJK> 0x6750 # <CJK> 0x6751 # <CJK> -0x6753 # <CJK> -0x6756 # <CJK> -0x6759 # <CJK> -0x675C # <CJK> -0x675E # <CJK> 0x675F # <CJK> -0x6760 # <CJK> 0x6761 # <CJK> -0x6762 # <CJK> -0x6763 # <CJK> -0x6764 # <CJK> 0x6765 # <CJK> -0x676A # <CJK> -0x676D # <CJK> 0x676F # <CJK> -0x6770 # <CJK> 0x6771 # <CJK> -0x6772 # <CJK> -0x6773 # <CJK> -0x6775 # <CJK> -0x6777 # <CJK> -0x677C # <CJK> 0x677E # <CJK> 0x677F # <CJK> -0x6785 # <CJK> -0x6787 # <CJK> -0x6789 # <CJK> -0x678B # <CJK> -0x678C # <CJK> 0x6790 # <CJK> 0x6795 # <CJK> 0x6797 # <CJK> @@ -2507,2836 +1183,820 @@ 0x679C # <CJK> 0x679D # <CJK> 0x67A0 # <CJK> -0x67A1 # <CJK> 0x67A2 # <CJK> -0x67A6 # <CJK> -0x67A9 # <CJK> 0x67AF # <CJK> -0x67B3 # <CJK> -0x67B4 # <CJK> 0x67B6 # <CJK> -0x67B7 # <CJK> -0x67B8 # <CJK> -0x67B9 # <CJK> -0x67C1 # <CJK> 0x67C4 # <CJK> -0x67C6 # <CJK> -0x67CA # <CJK> -0x67CE # <CJK> -0x67CF # <CJK> 0x67D0 # <CJK> -0x67D1 # <CJK> 0x67D3 # <CJK> 0x67D4 # <CJK> -0x67D8 # <CJK> -0x67DA # <CJK> -0x67DD # <CJK> -0x67DE # <CJK> -0x67E2 # <CJK> -0x67E4 # <CJK> -0x67E7 # <CJK> -0x67E9 # <CJK> -0x67EC # <CJK> -0x67EE # <CJK> -0x67EF # <CJK> 0x67F1 # <CJK> 0x67F3 # <CJK> -0x67F4 # <CJK> 0x67F5 # <CJK> 0x67FB # <CJK> -0x67FE # <CJK> 0x67FF # <CJK> -0x6802 # <CJK> 0x6803 # <CJK> 0x6804 # <CJK> 0x6813 # <CJK> -0x6816 # <CJK> -0x6817 # <CJK> -0x681E # <CJK> 0x6821 # <CJK> -0x6822 # <CJK> -0x6829 # <CJK> 0x682A # <CJK> -0x682B # <CJK> -0x6832 # <CJK> -0x6834 # <CJK> 0x6838 # <CJK> 0x6839 # <CJK> 0x683C # <CJK> 0x683D # <CJK> -0x6840 # <CJK> 0x6841 # <CJK> -0x6842 # <CJK> 0x6843 # <CJK> -0x6846 # <CJK> 0x6848 # <CJK> -0x684D # <CJK> -0x684E # <CJK> -0x6850 # <CJK> 0x6851 # <CJK> -0x6853 # <CJK> -0x6854 # <CJK> -0x6859 # <CJK> 0x685C # <CJK> -0x685D # <CJK> 0x685F # <CJK> -0x6863 # <CJK> -0x6867 # <CJK> -0x6874 # <CJK> -0x6876 # <CJK> -0x6877 # <CJK> -0x687E # <CJK> -0x687F # <CJK> -0x6881 # <CJK> -0x6883 # <CJK> 0x6885 # <CJK> -0x688D # <CJK> -0x688F # <CJK> -0x6893 # <CJK> -0x6894 # <CJK> 0x6897 # <CJK> -0x689B # <CJK> -0x689D # <CJK> -0x689F # <CJK> -0x68A0 # <CJK> -0x68A2 # <CJK> -0x68A6 # <CJK> -0x68A7 # <CJK> 0x68A8 # <CJK> -0x68AD # <CJK> -0x68AF # <CJK> 0x68B0 # <CJK> -0x68B1 # <CJK> -0x68B3 # <CJK> -0x68B5 # <CJK> -0x68B6 # <CJK> -0x68B9 # <CJK> -0x68BA # <CJK> -0x68BC # <CJK> 0x68C4 # <CJK> -0x68C6 # <CJK> -0x68C9 # <CJK> -0x68CA # <CJK> 0x68CB # <CJK> -0x68CD # <CJK> 0x68D2 # <CJK> -0x68D4 # <CJK> -0x68D5 # <CJK> -0x68D7 # <CJK> -0x68D8 # <CJK> 0x68DA # <CJK> 0x68DF # <CJK> -0x68E0 # <CJK> -0x68E1 # <CJK> -0x68E3 # <CJK> -0x68E7 # <CJK> 0x68EE # <CJK> -0x68EF # <CJK> -0x68F2 # <CJK> -0x68F9 # <CJK> 0x68FA # <CJK> -0x6900 # <CJK> -0x6901 # <CJK> -0x6904 # <CJK> 0x6905 # <CJK> -0x6908 # <CJK> -0x690B # <CJK> -0x690C # <CJK> 0x690D # <CJK> 0x690E # <CJK> -0x690F # <CJK> -0x6912 # <CJK> -0x6919 # <CJK> -0x691A # <CJK> -0x691B # <CJK> 0x691C # <CJK> -0x6921 # <CJK> -0x6922 # <CJK> -0x6923 # <CJK> -0x6925 # <CJK> -0x6926 # <CJK> -0x6928 # <CJK> -0x692A # <CJK> -0x6930 # <CJK> -0x6934 # <CJK> -0x6936 # <CJK> -0x6939 # <CJK> -0x693D # <CJK> -0x693F # <CJK> -0x694A # <CJK> -0x6953 # <CJK> -0x6954 # <CJK> -0x6955 # <CJK> -0x6959 # <CJK> -0x695A # <CJK> -0x695C # <CJK> -0x695D # <CJK> -0x695E # <CJK> -0x6960 # <CJK> -0x6961 # <CJK> -0x6962 # <CJK> -0x696A # <CJK> -0x696B # <CJK> 0x696D # <CJK> -0x696E # <CJK> -0x696F # <CJK> -0x6973 # <CJK> -0x6974 # <CJK> 0x6975 # <CJK> 0x6977 # <CJK> -0x6978 # <CJK> -0x6979 # <CJK> 0x697C # <CJK> 0x697D # <CJK> -0x697E # <CJK> -0x6981 # <CJK> 0x6982 # <CJK> -0x698A # <CJK> -0x698E # <CJK> -0x6991 # <CJK> -0x6994 # <CJK> -0x6995 # <CJK> -0x699B # <CJK> -0x699C # <CJK> -0x69A0 # <CJK> -0x69A7 # <CJK> -0x69AE # <CJK> -0x69B1 # <CJK> -0x69B2 # <CJK> -0x69B4 # <CJK> -0x69BB # <CJK> -0x69BE # <CJK> -0x69BF # <CJK> -0x69C1 # <CJK> -0x69C3 # <CJK> -0x69C7 # <CJK> -0x69CA # <CJK> 0x69CB # <CJK> -0x69CC # <CJK> -0x69CD # <CJK> -0x69CE # <CJK> -0x69D0 # <CJK> -0x69D3 # <CJK> 0x69D8 # <CJK> -0x69D9 # <CJK> -0x69DD # <CJK> -0x69DE # <CJK> -0x69E7 # <CJK> -0x69E8 # <CJK> -0x69EB # <CJK> -0x69ED # <CJK> -0x69F2 # <CJK> -0x69F9 # <CJK> -0x69FB # <CJK> 0x69FD # <CJK> -0x69FF # <CJK> -0x6A02 # <CJK> -0x6A05 # <CJK> -0x6A0A # <CJK> -0x6A0B # <CJK> -0x6A0C # <CJK> -0x6A12 # <CJK> -0x6A13 # <CJK> -0x6A14 # <CJK> -0x6A17 # <CJK> 0x6A19 # <CJK> -0x6A1B # <CJK> -0x6A1E # <CJK> -0x6A1F # <CJK> 0x6A21 # <CJK> -0x6A22 # <CJK> -0x6A23 # <CJK> 0x6A29 # <CJK> 0x6A2A # <CJK> -0x6A2B # <CJK> -0x6A2E # <CJK> -0x6A35 # <CJK> -0x6A36 # <CJK> -0x6A38 # <CJK> 0x6A39 # <CJK> -0x6A3A # <CJK> -0x6A3D # <CJK> -0x6A44 # <CJK> -0x6A47 # <CJK> -0x6A48 # <CJK> 0x6A4B # <CJK> -0x6A58 # <CJK> -0x6A59 # <CJK> 0x6A5F # <CJK> -0x6A61 # <CJK> -0x6A62 # <CJK> -0x6A66 # <CJK> -0x6A72 # <CJK> -0x6A78 # <CJK> -0x6A7F # <CJK> -0x6A80 # <CJK> -0x6A84 # <CJK> -0x6A8D # <CJK> -0x6A8E # <CJK> -0x6A90 # <CJK> -0x6A97 # <CJK> -0x6A9C # <CJK> -0x6AA0 # <CJK> -0x6AA2 # <CJK> -0x6AA3 # <CJK> -0x6AAA # <CJK> -0x6AAC # <CJK> -0x6AAE # <CJK> -0x6AB3 # <CJK> -0x6AB8 # <CJK> -0x6ABB # <CJK> -0x6AC1 # <CJK> -0x6AC2 # <CJK> -0x6AC3 # <CJK> -0x6AD1 # <CJK> -0x6AD3 # <CJK> -0x6ADA # <CJK> -0x6ADB # <CJK> -0x6ADE # <CJK> -0x6ADF # <CJK> -0x6AE8 # <CJK> -0x6AEA # <CJK> -0x6AFA # <CJK> -0x6AFB # <CJK> 0x6B04 # <CJK> -0x6B05 # <CJK> -0x6B0A # <CJK> -0x6B12 # <CJK> -0x6B16 # <CJK> -0x6B1D # <CJK> -0x6B1F # <CJK> 0x6B20 # <CJK> 0x6B21 # <CJK> -0x6B23 # <CJK> 0x6B27 # <CJK> 0x6B32 # <CJK> -0x6B37 # <CJK> -0x6B38 # <CJK> -0x6B39 # <CJK> 0x6B3A # <CJK> -0x6B3D # <CJK> 0x6B3E # <CJK> -0x6B43 # <CJK> -0x6B47 # <CJK> -0x6B49 # <CJK> 0x6B4C # <CJK> -0x6B4E # <CJK> -0x6B50 # <CJK> 0x6B53 # <CJK> -0x6B54 # <CJK> -0x6B59 # <CJK> -0x6B5B # <CJK> -0x6B5F # <CJK> -0x6B61 # <CJK> 0x6B62 # <CJK> 0x6B63 # <CJK> -0x6B64 # <CJK> 0x6B66 # <CJK> 0x6B69 # <CJK> -0x6B6A # <CJK> 0x6B6F # <CJK> 0x6B73 # <CJK> 0x6B74 # <CJK> -0x6B78 # <CJK> -0x6B79 # <CJK> 0x6B7B # <CJK> -0x6B7F # <CJK> -0x6B80 # <CJK> -0x6B83 # <CJK> -0x6B84 # <CJK> -0x6B86 # <CJK> 0x6B89 # <CJK> 0x6B8A # <CJK> 0x6B8B # <CJK> -0x6B8D # <CJK> -0x6B95 # <CJK> 0x6B96 # <CJK> -0x6B98 # <CJK> -0x6B9E # <CJK> -0x6BA4 # <CJK> -0x6BAA # <CJK> -0x6BAB # <CJK> -0x6BAF # <CJK> -0x6BB1 # <CJK> -0x6BB2 # <CJK> -0x6BB3 # <CJK> 0x6BB4 # <CJK> 0x6BB5 # <CJK> -0x6BB7 # <CJK> 0x6BBA # <CJK> 0x6BBB # <CJK> -0x6BBC # <CJK> 0x6BBF # <CJK> 0x6BC0 # <CJK> -0x6BC5 # <CJK> -0x6BC6 # <CJK> -0x6BCB # <CJK> 0x6BCD # <CJK> 0x6BCE # <CJK> 0x6BD2 # <CJK> -0x6BD3 # <CJK> 0x6BD4 # <CJK> -0x6BD8 # <CJK> 0x6BDB # <CJK> -0x6BDF # <CJK> -0x6BEB # <CJK> -0x6BEC # <CJK> -0x6BEF # <CJK> -0x6BF3 # <CJK> -0x6C08 # <CJK> 0x6C0F # <CJK> 0x6C11 # <CJK> -0x6C13 # <CJK> -0x6C14 # <CJK> 0x6C17 # <CJK> -0x6C1B # <CJK> -0x6C23 # <CJK> -0x6C24 # <CJK> 0x6C34 # <CJK> 0x6C37 # <CJK> 0x6C38 # <CJK> 0x6C3E # <CJK> -0x6C40 # <CJK> 0x6C41 # <CJK> 0x6C42 # <CJK> 0x6C4E # <CJK> -0x6C50 # <CJK> -0x6C55 # <CJK> 0x6C57 # <CJK> 0x6C5A # <CJK> -0x6C5D # <CJK> -0x6C5E # <CJK> 0x6C5F # <CJK> 0x6C60 # <CJK> -0x6C62 # <CJK> -0x6C68 # <CJK> -0x6C6A # <CJK> 0x6C70 # <CJK> -0x6C72 # <CJK> -0x6C73 # <CJK> 0x6C7A # <CJK> 0x6C7D # <CJK> -0x6C7E # <CJK> -0x6C81 # <CJK> -0x6C82 # <CJK> 0x6C83 # <CJK> 0x6C88 # <CJK> -0x6C8C # <CJK> -0x6C8D # <CJK> -0x6C90 # <CJK> -0x6C92 # <CJK> -0x6C93 # <CJK> 0x6C96 # <CJK> 0x6C99 # <CJK> -0x6C9A # <CJK> -0x6C9B # <CJK> 0x6CA1 # <CJK> 0x6CA2 # <CJK> -0x6CAB # <CJK> -0x6CAE # <CJK> -0x6CB1 # <CJK> 0x6CB3 # <CJK> 0x6CB8 # <CJK> 0x6CB9 # <CJK> -0x6CBA # <CJK> 0x6CBB # <CJK> 0x6CBC # <CJK> -0x6CBD # <CJK> -0x6CBE # <CJK> 0x6CBF # <CJK> 0x6CC1 # <CJK> -0x6CC4 # <CJK> -0x6CC5 # <CJK> 0x6CC9 # <CJK> 0x6CCA # <CJK> 0x6CCC # <CJK> -0x6CD3 # <CJK> 0x6CD5 # <CJK> -0x6CD7 # <CJK> -0x6CD9 # <CJK> -0x6CDB # <CJK> -0x6CDD # <CJK> 0x6CE1 # <CJK> 0x6CE2 # <CJK> 0x6CE3 # <CJK> 0x6CE5 # <CJK> 0x6CE8 # <CJK> -0x6CEA # <CJK> -0x6CEF # <CJK> 0x6CF0 # <CJK> -0x6CF1 # <CJK> 0x6CF3 # <CJK> 0x6D0B # <CJK> -0x6D0C # <CJK> -0x6D12 # <CJK> 0x6D17 # <CJK> -0x6D19 # <CJK> -0x6D1B # <CJK> 0x6D1E # <CJK> -0x6D1F # <CJK> 0x6D25 # <CJK> -0x6D29 # <CJK> 0x6D2A # <CJK> -0x6D2B # <CJK> -0x6D32 # <CJK> -0x6D33 # <CJK> -0x6D35 # <CJK> -0x6D36 # <CJK> -0x6D38 # <CJK> 0x6D3B # <CJK> -0x6D3D # <CJK> 0x6D3E # <CJK> 0x6D41 # <CJK> 0x6D44 # <CJK> 0x6D45 # <CJK> -0x6D59 # <CJK> -0x6D5A # <CJK> 0x6D5C # <CJK> -0x6D63 # <CJK> -0x6D64 # <CJK> 0x6D66 # <CJK> -0x6D69 # <CJK> 0x6D6A # <CJK> -0x6D6C # <CJK> 0x6D6E # <CJK> 0x6D74 # <CJK> 0x6D77 # <CJK> 0x6D78 # <CJK> -0x6D79 # <CJK> -0x6D85 # <CJK> 0x6D88 # <CJK> -0x6D8C # <CJK> -0x6D8E # <CJK> -0x6D93 # <CJK> -0x6D95 # <CJK> 0x6D99 # <CJK> -0x6D9B # <CJK> -0x6D9C # <CJK> 0x6DAF # <CJK> 0x6DB2 # <CJK> -0x6DB5 # <CJK> -0x6DB8 # <CJK> 0x6DBC # <CJK> -0x6DC0 # <CJK> -0x6DC5 # <CJK> -0x6DC6 # <CJK> -0x6DC7 # <CJK> -0x6DCB # <CJK> -0x6DCC # <CJK> 0x6DD1 # <CJK> -0x6DD2 # <CJK> -0x6DD5 # <CJK> -0x6DD8 # <CJK> -0x6DD9 # <CJK> -0x6DDE # <CJK> 0x6DE1 # <CJK> -0x6DE4 # <CJK> -0x6DE6 # <CJK> -0x6DE8 # <CJK> -0x6DEA # <CJK> 0x6DEB # <CJK> -0x6DEC # <CJK> -0x6DEE # <CJK> 0x6DF1 # <CJK> -0x6DF3 # <CJK> -0x6DF5 # <CJK> 0x6DF7 # <CJK> -0x6DF9 # <CJK> -0x6DFA # <CJK> 0x6DFB # <CJK> 0x6E05 # <CJK> 0x6E07 # <CJK> 0x6E08 # <CJK> 0x6E09 # <CJK> -0x6E0A # <CJK> 0x6E0B # <CJK> 0x6E13 # <CJK> -0x6E15 # <CJK> -0x6E19 # <CJK> -0x6E1A # <CJK> 0x6E1B # <CJK> -0x6E1D # <CJK> -0x6E1F # <CJK> -0x6E20 # <CJK> 0x6E21 # <CJK> -0x6E23 # <CJK> -0x6E24 # <CJK> -0x6E25 # <CJK> 0x6E26 # <CJK> 0x6E29 # <CJK> -0x6E2B # <CJK> 0x6E2C # <CJK> -0x6E2D # <CJK> -0x6E2E # <CJK> 0x6E2F # <CJK> -0x6E38 # <CJK> -0x6E3A # <CJK> -0x6E3E # <CJK> -0x6E43 # <CJK> -0x6E4A # <CJK> -0x6E4D # <CJK> -0x6E4E # <CJK> 0x6E56 # <CJK> -0x6E58 # <CJK> -0x6E5B # <CJK> -0x6E5F # <CJK> 0x6E67 # <CJK> -0x6E6B # <CJK> -0x6E6E # <CJK> 0x6E6F # <CJK> -0x6E72 # <CJK> -0x6E76 # <CJK> 0x6E7E # <CJK> 0x6E7F # <CJK> 0x6E80 # <CJK> -0x6E82 # <CJK> -0x6E8C # <CJK> -0x6E8F # <CJK> 0x6E90 # <CJK> 0x6E96 # <CJK> -0x6E98 # <CJK> -0x6E9C # <CJK> 0x6E9D # <CJK> -0x6E9F # <CJK> -0x6EA2 # <CJK> -0x6EA5 # <CJK> -0x6EAA # <CJK> -0x6EAF # <CJK> -0x6EB2 # <CJK> 0x6EB6 # <CJK> -0x6EB7 # <CJK> 0x6EBA # <CJK> -0x6EBD # <CJK> -0x6EC2 # <CJK> -0x6EC4 # <CJK> 0x6EC5 # <CJK> -0x6EC9 # <CJK> 0x6ECB # <CJK> -0x6ECC # <CJK> 0x6ED1 # <CJK> -0x6ED3 # <CJK> -0x6ED4 # <CJK> -0x6ED5 # <CJK> 0x6EDD # <CJK> 0x6EDE # <CJK> -0x6EEC # <CJK> -0x6EEF # <CJK> -0x6EF2 # <CJK> 0x6EF4 # <CJK> -0x6EF7 # <CJK> -0x6EF8 # <CJK> -0x6EFE # <CJK> -0x6EFF # <CJK> 0x6F01 # <CJK> 0x6F02 # <CJK> 0x6F06 # <CJK> -0x6F09 # <CJK> 0x6F0F # <CJK> -0x6F11 # <CJK> -0x6F13 # <CJK> 0x6F14 # <CJK> -0x6F15 # <CJK> 0x6F20 # <CJK> 0x6F22 # <CJK> -0x6F23 # <CJK> 0x6F2B # <CJK> 0x6F2C # <CJK> -0x6F31 # <CJK> -0x6F32 # <CJK> 0x6F38 # <CJK> -0x6F3E # <CJK> -0x6F3F # <CJK> -0x6F41 # <CJK> -0x6F45 # <CJK> 0x6F54 # <CJK> -0x6F58 # <CJK> -0x6F5B # <CJK> 0x6F5C # <CJK> 0x6F5F # <CJK> 0x6F64 # <CJK> -0x6F66 # <CJK> -0x6F6D # <CJK> 0x6F6E # <CJK> -0x6F6F # <CJK> 0x6F70 # <CJK> -0x6F74 # <CJK> -0x6F78 # <CJK> -0x6F7A # <CJK> -0x6F7C # <CJK> -0x6F80 # <CJK> -0x6F81 # <CJK> -0x6F82 # <CJK> 0x6F84 # <CJK> -0x6F86 # <CJK> -0x6F8E # <CJK> -0x6F91 # <CJK> -0x6F97 # <CJK> -0x6FA1 # <CJK> -0x6FA3 # <CJK> -0x6FA4 # <CJK> -0x6FAA # <CJK> -0x6FB1 # <CJK> -0x6FB3 # <CJK> -0x6FB9 # <CJK> 0x6FC0 # <CJK> 0x6FC1 # <CJK> -0x6FC2 # <CJK> 0x6FC3 # <CJK> -0x6FC6 # <CJK> -0x6FD4 # <CJK> -0x6FD5 # <CJK> -0x6FD8 # <CJK> -0x6FDB # <CJK> -0x6FDF # <CJK> -0x6FE0 # <CJK> -0x6FE1 # <CJK> -0x6FE4 # <CJK> 0x6FEB # <CJK> -0x6FEC # <CJK> -0x6FEE # <CJK> 0x6FEF # <CJK> -0x6FF1 # <CJK> -0x6FF3 # <CJK> -0x6FF6 # <CJK> -0x6FFA # <CJK> -0x6FFE # <CJK> -0x7001 # <CJK> -0x7009 # <CJK> -0x700B # <CJK> -0x700F # <CJK> -0x7011 # <CJK> -0x7015 # <CJK> -0x7018 # <CJK> -0x701A # <CJK> -0x701B # <CJK> -0x701D # <CJK> -0x701E # <CJK> -0x701F # <CJK> -0x7026 # <CJK> -0x7027 # <CJK> 0x702C # <CJK> -0x7030 # <CJK> -0x7032 # <CJK> -0x703E # <CJK> -0x704C # <CJK> -0x7051 # <CJK> -0x7058 # <CJK> -0x7063 # <CJK> 0x706B # <CJK> 0x706F # <CJK> 0x7070 # <CJK> -0x7078 # <CJK> -0x707C # <CJK> 0x707D # <CJK> 0x7089 # <CJK> 0x708A # <CJK> 0x708E # <CJK> -0x7092 # <CJK> -0x7099 # <CJK> -0x70AC # <CJK> 0x70AD # <CJK> -0x70AE # <CJK> -0x70AF # <CJK> -0x70B3 # <CJK> -0x70B8 # <CJK> 0x70B9 # <CJK> 0x70BA # <CJK> 0x70C8 # <CJK> -0x70CB # <CJK> -0x70CF # <CJK> -0x70D9 # <CJK> -0x70DD # <CJK> -0x70DF # <CJK> -0x70F1 # <CJK> -0x70F9 # <CJK> -0x70FD # <CJK> -0x7109 # <CJK> -0x7114 # <CJK> -0x7119 # <CJK> -0x711A # <CJK> -0x711C # <CJK> 0x7121 # <CJK> 0x7126 # <CJK> 0x7136 # <CJK> 0x713C # <CJK> -0x7149 # <CJK> -0x714C # <CJK> 0x714E # <CJK> -0x7155 # <CJK> -0x7156 # <CJK> 0x7159 # <CJK> -0x7162 # <CJK> -0x7164 # <CJK> -0x7165 # <CJK> -0x7166 # <CJK> 0x7167 # <CJK> 0x7169 # <CJK> -0x716C # <CJK> 0x716E # <CJK> -0x717D # <CJK> -0x7184 # <CJK> -0x7188 # <CJK> 0x718A # <CJK> -0x718F # <CJK> -0x7194 # <CJK> -0x7195 # <CJK> -#0x7199 # <CJK> # not in kochi fonts 0x719F # <CJK> -0x71A8 # <CJK> -0x71AC # <CJK> 0x71B1 # <CJK> -0x71B9 # <CJK> -0x71BE # <CJK> 0x71C3 # <CJK> -0x71C8 # <CJK> -0x71C9 # <CJK> -0x71CE # <CJK> -0x71D0 # <CJK> -0x71D2 # <CJK> -0x71D4 # <CJK> -0x71D5 # <CJK> -0x71D7 # <CJK> -0x71DF # <CJK> -0x71E0 # <CJK> 0x71E5 # <CJK> -0x71E6 # <CJK> -0x71E7 # <CJK> -0x71EC # <CJK> -0x71ED # <CJK> -0x71EE # <CJK> -0x71F5 # <CJK> -0x71F9 # <CJK> -0x71FB # <CJK> -0x71FC # <CJK> -0x71FF # <CJK> 0x7206 # <CJK> -0x720D # <CJK> -0x7210 # <CJK> -0x721B # <CJK> -0x7228 # <CJK> 0x722A # <CJK> -0x722C # <CJK> -0x722D # <CJK> -0x7230 # <CJK> -0x7232 # <CJK> 0x7235 # <CJK> 0x7236 # <CJK> -0x723A # <CJK> -0x723B # <CJK> -0x723C # <CJK> 0x723D # <CJK> -0x723E # <CJK> -0x723F # <CJK> -0x7240 # <CJK> -0x7246 # <CJK> 0x7247 # <CJK> 0x7248 # <CJK> -0x724B # <CJK> -0x724C # <CJK> -0x7252 # <CJK> -0x7258 # <CJK> 0x7259 # <CJK> 0x725B # <CJK> -0x725D # <CJK> -0x725F # <CJK> -0x7261 # <CJK> -0x7262 # <CJK> 0x7267 # <CJK> 0x7269 # <CJK> 0x7272 # <CJK> -0x7274 # <CJK> 0x7279 # <CJK> -0x727D # <CJK> -0x727E # <CJK> -0x7280 # <CJK> -0x7281 # <CJK> -0x7282 # <CJK> -0x7287 # <CJK> -0x7292 # <CJK> -0x7296 # <CJK> 0x72A0 # <CJK> -0x72A2 # <CJK> -0x72A7 # <CJK> 0x72AC # <CJK> 0x72AF # <CJK> -0x72B2 # <CJK> 0x72B6 # <CJK> -0x72B9 # <CJK> 0x72C2 # <CJK> -0x72C3 # <CJK> -0x72C4 # <CJK> -0x72C6 # <CJK> -0x72CE # <CJK> -0x72D0 # <CJK> -0x72D2 # <CJK> -0x72D7 # <CJK> 0x72D9 # <CJK> -0x72DB # <CJK> -0x72E0 # <CJK> -0x72E1 # <CJK> -0x72E2 # <CJK> 0x72E9 # <CJK> 0x72EC # <CJK> 0x72ED # <CJK> -0x72F7 # <CJK> -0x72F8 # <CJK> -0x72F9 # <CJK> -0x72FC # <CJK> -0x72FD # <CJK> -0x730A # <CJK> -0x7316 # <CJK> -0x7317 # <CJK> 0x731B # <CJK> -0x731C # <CJK> -0x731D # <CJK> 0x731F # <CJK> -0x7325 # <CJK> -0x7329 # <CJK> -0x732A # <CJK> 0x732B # <CJK> 0x732E # <CJK> -0x732F # <CJK> -0x7334 # <CJK> 0x7336 # <CJK> -0x7337 # <CJK> -0x733E # <CJK> 0x733F # <CJK> 0x7344 # <CJK> -0x7345 # <CJK> -0x734E # <CJK> -0x734F # <CJK> -0x7357 # <CJK> 0x7363 # <CJK> -0x7368 # <CJK> -0x736A # <CJK> -0x7370 # <CJK> 0x7372 # <CJK> -0x7375 # <CJK> -0x7378 # <CJK> -0x737A # <CJK> -0x737B # <CJK> 0x7384 # <CJK> 0x7387 # <CJK> 0x7389 # <CJK> 0x738B # <CJK> -0x7396 # <CJK> 0x73A9 # <CJK> -0x73B2 # <CJK> -0x73B3 # <CJK> -0x73BB # <CJK> -0x73C0 # <CJK> -0x73C2 # <CJK> -0x73C8 # <CJK> -0x73CA # <CJK> 0x73CD # <CJK> -0x73CE # <CJK> -0x73DE # <CJK> 0x73E0 # <CJK> -0x73E5 # <CJK> -0x73EA # <CJK> 0x73ED # <CJK> -0x73EE # <CJK> -0x73F1 # <CJK> -0x73F8 # <CJK> 0x73FE # <CJK> 0x7403 # <CJK> -0x7405 # <CJK> 0x7406 # <CJK> -0x7409 # <CJK> -0x7422 # <CJK> -0x7425 # <CJK> -0x7432 # <CJK> -0x7433 # <CJK> 0x7434 # <CJK> -0x7435 # <CJK> -0x7436 # <CJK> -0x743A # <CJK> -0x743F # <CJK> -0x7441 # <CJK> -0x7455 # <CJK> -0x7459 # <CJK> -0x745A # <CJK> -0x745B # <CJK> -0x745C # <CJK> -0x745E # <CJK> -0x745F # <CJK> 0x7460 # <CJK> -0x7463 # <CJK> -0x7464 # <CJK> -0x7469 # <CJK> -0x746A # <CJK> -0x746F # <CJK> -0x7470 # <CJK> -0x7473 # <CJK> -0x7476 # <CJK> -0x747E # <CJK> 0x7483 # <CJK> -0x748B # <CJK> -0x749E # <CJK> -0x74A2 # <CJK> 0x74A7 # <CJK> 0x74B0 # <CJK> 0x74BD # <CJK> -0x74CA # <CJK> -0x74CF # <CJK> -0x74D4 # <CJK> -0x74DC # <CJK> -0x74E0 # <CJK> -0x74E2 # <CJK> -0x74E3 # <CJK> 0x74E6 # <CJK> -0x74E7 # <CJK> -0x74E9 # <CJK> -0x74EE # <CJK> -0x74F0 # <CJK> -0x74F1 # <CJK> -0x74F2 # <CJK> 0x74F6 # <CJK> -0x74F7 # <CJK> -0x74F8 # <CJK> -0x7503 # <CJK> -0x7504 # <CJK> -0x7505 # <CJK> -0x750C # <CJK> -0x750D # <CJK> -0x750E # <CJK> -0x7511 # <CJK> -0x7513 # <CJK> -0x7515 # <CJK> 0x7518 # <CJK> 0x751A # <CJK> -0x751C # <CJK> -0x751E # <CJK> 0x751F # <CJK> 0x7523 # <CJK> -0x7525 # <CJK> -0x7526 # <CJK> 0x7528 # <CJK> -0x752B # <CJK> -0x752C # <CJK> 0x7530 # <CJK> 0x7531 # <CJK> 0x7532 # <CJK> 0x7533 # <CJK> 0x7537 # <CJK> -0x7538 # <CJK> 0x753A # <CJK> 0x753B # <CJK> -0x753C # <CJK> -0x7544 # <CJK> -0x7546 # <CJK> -0x7549 # <CJK> -0x754A # <CJK> -0x754B # <CJK> 0x754C # <CJK> -0x754D # <CJK> 0x754F # <CJK> 0x7551 # <CJK> 0x7554 # <CJK> 0x7559 # <CJK> -0x755A # <CJK> -0x755B # <CJK> 0x755C # <CJK> 0x755D # <CJK> -0x7560 # <CJK> -0x7562 # <CJK> -0x7564 # <CJK> 0x7565 # <CJK> -0x7566 # <CJK> -0x7567 # <CJK> -0x7569 # <CJK> 0x756A # <CJK> -0x756B # <CJK> -0x756D # <CJK> 0x7570 # <CJK> 0x7573 # <CJK> -0x7574 # <CJK> -0x7576 # <CJK> -0x7577 # <CJK> -0x7578 # <CJK> 0x757F # <CJK> -0x7582 # <CJK> -0x7586 # <CJK> -0x7587 # <CJK> -0x7589 # <CJK> -0x758A # <CJK> -0x758B # <CJK> 0x758E # <CJK> -0x758F # <CJK> 0x7591 # <CJK> -0x7594 # <CJK> -0x759A # <CJK> -0x759D # <CJK> -0x75A3 # <CJK> -0x75A5 # <CJK> 0x75AB # <CJK> -0x75B1 # <CJK> 0x75B2 # <CJK> -0x75B3 # <CJK> -0x75B5 # <CJK> -0x75B8 # <CJK> -0x75B9 # <CJK> -0x75BC # <CJK> -0x75BD # <CJK> 0x75BE # <CJK> -0x75C2 # <CJK> -0x75C3 # <CJK> 0x75C5 # <CJK> 0x75C7 # <CJK> -0x75CA # <CJK> -0x75CD # <CJK> -0x75D2 # <CJK> -0x75D4 # <CJK> 0x75D5 # <CJK> 0x75D8 # <CJK> -0x75D9 # <CJK> 0x75DB # <CJK> -0x75DE # <CJK> 0x75E2 # <CJK> -0x75E3 # <CJK> 0x75E9 # <CJK> -0x75F0 # <CJK> -0x75F2 # <CJK> -0x75F3 # <CJK> 0x75F4 # <CJK> -0x75FA # <CJK> -0x75FC # <CJK> -0x75FE # <CJK> -0x75FF # <CJK> -0x7601 # <CJK> -0x7609 # <CJK> -0x760B # <CJK> 0x760D # <CJK> -0x761F # <CJK> -0x7620 # <CJK> -0x7621 # <CJK> -0x7622 # <CJK> -0x7624 # <CJK> -0x7627 # <CJK> -0x7630 # <CJK> -0x7634 # <CJK> -0x763B # <CJK> 0x7642 # <CJK> -0x7646 # <CJK> -0x7647 # <CJK> -0x7648 # <CJK> -0x764C # <CJK> 0x7652 # <CJK> 0x7656 # <CJK> -0x7658 # <CJK> -0x765C # <CJK> -0x7661 # <CJK> -0x7662 # <CJK> -0x7667 # <CJK> -0x7668 # <CJK> -0x7669 # <CJK> -0x766A # <CJK> -0x766C # <CJK> -0x7670 # <CJK> -0x7672 # <CJK> -0x7676 # <CJK> -0x7678 # <CJK> 0x767A # <CJK> 0x767B # <CJK> -0x767C # <CJK> 0x767D # <CJK> 0x767E # <CJK> -0x7680 # <CJK> -0x7683 # <CJK> 0x7684 # <CJK> 0x7686 # <CJK> 0x7687 # <CJK> -0x7688 # <CJK> -0x768B # <CJK> -0x768E # <CJK> -0x7690 # <CJK> -0x7693 # <CJK> -0x7696 # <CJK> -0x7699 # <CJK> -0x769A # <CJK> 0x76AE # <CJK> -0x76B0 # <CJK> -0x76B4 # <CJK> -0x76B7 # <CJK> -0x76B8 # <CJK> -0x76B9 # <CJK> -0x76BA # <CJK> 0x76BF # <CJK> -0x76C2 # <CJK> -0x76C3 # <CJK> 0x76C6 # <CJK> -0x76C8 # <CJK> 0x76CA # <CJK> -0x76CD # <CJK> -0x76D2 # <CJK> -0x76D6 # <CJK> 0x76D7 # <CJK> 0x76DB # <CJK> -0x76DC # <CJK> -0x76DE # <CJK> 0x76DF # <CJK> -0x76E1 # <CJK> 0x76E3 # <CJK> 0x76E4 # <CJK> -0x76E5 # <CJK> -0x76E7 # <CJK> -0x76EA # <CJK> 0x76EE # <CJK> 0x76F2 # <CJK> 0x76F4 # <CJK> 0x76F8 # <CJK> -0x76FB # <CJK> 0x76FE # <CJK> 0x7701 # <CJK> -0x7704 # <CJK> -0x7707 # <CJK> -0x7708 # <CJK> 0x7709 # <CJK> 0x770B # <CJK> 0x770C # <CJK> -0x771B # <CJK> -0x771E # <CJK> 0x771F # <CJK> 0x7720 # <CJK> -0x7724 # <CJK> -0x7725 # <CJK> -0x7726 # <CJK> -0x7729 # <CJK> -0x7737 # <CJK> -0x7738 # <CJK> 0x773A # <CJK> 0x773C # <CJK> 0x7740 # <CJK> -0x7747 # <CJK> -0x775A # <CJK> -0x775B # <CJK> 0x7761 # <CJK> 0x7763 # <CJK> -0x7765 # <CJK> 0x7766 # <CJK> -0x7768 # <CJK> -0x776B # <CJK> -0x7779 # <CJK> -0x777E # <CJK> -0x777F # <CJK> -0x778B # <CJK> -0x778E # <CJK> -0x7791 # <CJK> -0x779E # <CJK> -0x77A0 # <CJK> -0x77A5 # <CJK> 0x77AC # <CJK> 0x77AD # <CJK> -0x77B0 # <CJK> 0x77B3 # <CJK> -0x77B6 # <CJK> -0x77B9 # <CJK> -0x77BB # <CJK> -0x77BC # <CJK> -0x77BD # <CJK> -0x77BF # <CJK> -0x77C7 # <CJK> -0x77CD # <CJK> -0x77D7 # <CJK> -0x77DA # <CJK> 0x77DB # <CJK> -0x77DC # <CJK> 0x77E2 # <CJK> -0x77E3 # <CJK> 0x77E5 # <CJK> -0x77E7 # <CJK> -0x77E9 # <CJK> 0x77ED # <CJK> -0x77EE # <CJK> 0x77EF # <CJK> 0x77F3 # <CJK> -0x77FC # <CJK> 0x7802 # <CJK> -0x780C # <CJK> -0x7812 # <CJK> 0x7814 # <CJK> 0x7815 # <CJK> -0x7820 # <CJK> -0x7825 # <CJK> -0x7826 # <CJK> -0x7827 # <CJK> 0x7832 # <CJK> 0x7834 # <CJK> -0x783A # <CJK> -0x783F # <CJK> -0x7845 # <CJK> 0x785D # <CJK> 0x786B # <CJK> 0x786C # <CJK> -0x786F # <CJK> -0x7872 # <CJK> -0x7874 # <CJK> -0x787C # <CJK> 0x7881 # <CJK> -0x7886 # <CJK> -0x7887 # <CJK> -0x788C # <CJK> -0x788D # <CJK> -0x788E # <CJK> 0x7891 # <CJK> -0x7893 # <CJK> -0x7895 # <CJK> -0x7897 # <CJK> -0x789A # <CJK> -0x78A3 # <CJK> -0x78A7 # <CJK> -0x78A9 # <CJK> -0x78AA # <CJK> -0x78AF # <CJK> -0x78B5 # <CJK> 0x78BA # <CJK> -0x78BC # <CJK> -0x78BE # <CJK> 0x78C1 # <CJK> -0x78C5 # <CJK> -0x78C6 # <CJK> -0x78CA # <CJK> -0x78CB # <CJK> -0x78D0 # <CJK> -0x78D1 # <CJK> -0x78D4 # <CJK> -0x78DA # <CJK> -0x78E7 # <CJK> 0x78E8 # <CJK> -0x78EC # <CJK> -0x78EF # <CJK> -0x78F4 # <CJK> -0x78FD # <CJK> 0x7901 # <CJK> -0x7907 # <CJK> 0x790E # <CJK> -0x7911 # <CJK> -0x7912 # <CJK> -0x7919 # <CJK> -0x7926 # <CJK> -0x792A # <CJK> -0x792B # <CJK> -0x792C # <CJK> 0x793A # <CJK> 0x793C # <CJK> 0x793E # <CJK> -0x7940 # <CJK> -0x7941 # <CJK> -0x7947 # <CJK> 0x7948 # <CJK> 0x7949 # <CJK> -0x7950 # <CJK> -0x7953 # <CJK> -0x7955 # <CJK> 0x7956 # <CJK> -0x7957 # <CJK> -0x795A # <CJK> 0x795D # <CJK> 0x795E # <CJK> -0x795F # <CJK> -0x7960 # <CJK> -0x7962 # <CJK> 0x7965 # <CJK> 0x7968 # <CJK> 0x796D # <CJK> -0x7977 # <CJK> -0x797A # <CJK> -0x797F # <CJK> -0x7980 # <CJK> 0x7981 # <CJK> -0x7984 # <CJK> 0x7985 # <CJK> -0x798A # <CJK> 0x798D # <CJK> -0x798E # <CJK> 0x798F # <CJK> -0x799D # <CJK> -0x79A6 # <CJK> -0x79A7 # <CJK> -0x79AA # <CJK> -0x79AE # <CJK> -0x79B0 # <CJK> -0x79B3 # <CJK> -0x79B9 # <CJK> -0x79BA # <CJK> -0x79BD # <CJK> -0x79BE # <CJK> -0x79BF # <CJK> 0x79C0 # <CJK> 0x79C1 # <CJK> -0x79C9 # <CJK> 0x79CB # <CJK> 0x79D1 # <CJK> 0x79D2 # <CJK> -0x79D5 # <CJK> 0x79D8 # <CJK> 0x79DF # <CJK> -0x79E1 # <CJK> -0x79E3 # <CJK> -0x79E4 # <CJK> -0x79E6 # <CJK> -0x79E7 # <CJK> 0x79E9 # <CJK> -0x79EC # <CJK> 0x79F0 # <CJK> 0x79FB # <CJK> -0x7A00 # <CJK> -0x7A08 # <CJK> 0x7A0B # <CJK> -0x7A0D # <CJK> 0x7A0E # <CJK> -0x7A14 # <CJK> -0x7A17 # <CJK> -0x7A18 # <CJK> -0x7A19 # <CJK> 0x7A1A # <CJK> -0x7A1C # <CJK> -0x7A1F # <CJK> -0x7A20 # <CJK> 0x7A2E # <CJK> -0x7A31 # <CJK> 0x7A32 # <CJK> -0x7A37 # <CJK> -0x7A3B # <CJK> 0x7A3C # <CJK> 0x7A3D # <CJK> -0x7A3E # <CJK> 0x7A3F # <CJK> 0x7A40 # <CJK> 0x7A42 # <CJK> -0x7A43 # <CJK> -0x7A46 # <CJK> -0x7A49 # <CJK> 0x7A4D # <CJK> -0x7A4E # <CJK> 0x7A4F # <CJK> -0x7A50 # <CJK> -0x7A57 # <CJK> -0x7A61 # <CJK> -0x7A62 # <CJK> -0x7A63 # <CJK> -0x7A69 # <CJK> 0x7A6B # <CJK> -0x7A70 # <CJK> 0x7A74 # <CJK> 0x7A76 # <CJK> -0x7A79 # <CJK> 0x7A7A # <CJK> -0x7A7D # <CJK> -0x7A7F # <CJK> 0x7A81 # <CJK> 0x7A83 # <CJK> -0x7A84 # <CJK> -0x7A88 # <CJK> 0x7A92 # <CJK> 0x7A93 # <CJK> -0x7A95 # <CJK> -0x7A96 # <CJK> -0x7A97 # <CJK> -0x7A98 # <CJK> 0x7A9F # <CJK> -0x7AA9 # <CJK> -0x7AAA # <CJK> 0x7AAE # <CJK> 0x7AAF # <CJK> -0x7AB0 # <CJK> -0x7AB6 # <CJK> -0x7ABA # <CJK> -0x7ABF # <CJK> -0x7AC3 # <CJK> -0x7AC4 # <CJK> -0x7AC5 # <CJK> -0x7AC7 # <CJK> -0x7AC8 # <CJK> -0x7ACA # <CJK> 0x7ACB # <CJK> -0x7ACD # <CJK> -0x7ACF # <CJK> -0x7AD2 # <CJK> -0x7AD3 # <CJK> -0x7AD5 # <CJK> -0x7AD9 # <CJK> -0x7ADA # <CJK> 0x7ADC # <CJK> -0x7ADD # <CJK> -0x7ADF # <CJK> 0x7AE0 # <CJK> -0x7AE1 # <CJK> -0x7AE2 # <CJK> -0x7AE3 # <CJK> 0x7AE5 # <CJK> -0x7AE6 # <CJK> -0x7AEA # <CJK> -0x7AED # <CJK> 0x7AEF # <CJK> -0x7AF0 # <CJK> 0x7AF6 # <CJK> -0x7AF8 # <CJK> 0x7AF9 # <CJK> -0x7AFA # <CJK> -0x7AFF # <CJK> -0x7B02 # <CJK> -0x7B04 # <CJK> -0x7B06 # <CJK> -0x7B08 # <CJK> -0x7B0A # <CJK> -0x7B0B # <CJK> -0x7B0F # <CJK> 0x7B11 # <CJK> -0x7B18 # <CJK> -0x7B19 # <CJK> 0x7B1B # <CJK> -0x7B1E # <CJK> -0x7B20 # <CJK> -0x7B25 # <CJK> 0x7B26 # <CJK> -0x7B28 # <CJK> 0x7B2C # <CJK> -0x7B33 # <CJK> -0x7B35 # <CJK> -0x7B36 # <CJK> -0x7B39 # <CJK> -0x7B45 # <CJK> 0x7B46 # <CJK> -0x7B48 # <CJK> 0x7B49 # <CJK> 0x7B4B # <CJK> -0x7B4C # <CJK> -0x7B4D # <CJK> -0x7B4F # <CJK> -0x7B50 # <CJK> -0x7B51 # <CJK> 0x7B52 # <CJK> 0x7B54 # <CJK> 0x7B56 # <CJK> -0x7B5D # <CJK> -0x7B65 # <CJK> -0x7B67 # <CJK> -0x7B6C # <CJK> -0x7B6E # <CJK> -0x7B70 # <CJK> -0x7B71 # <CJK> -0x7B74 # <CJK> -0x7B75 # <CJK> -0x7B7A # <CJK> -0x7B86 # <CJK> 0x7B87 # <CJK> 0x7B8B # <CJK> -0x7B8D # <CJK> -0x7B8F # <CJK> -0x7B92 # <CJK> -0x7B94 # <CJK> -0x7B95 # <CJK> 0x7B97 # <CJK> -0x7B98 # <CJK> -0x7B99 # <CJK> -0x7B9A # <CJK> -0x7B9C # <CJK> -0x7B9D # <CJK> -0x7B9F # <CJK> 0x7BA1 # <CJK> -0x7BAA # <CJK> -0x7BAD # <CJK> 0x7BB1 # <CJK> -0x7BB4 # <CJK> 0x7BB8 # <CJK> 0x7BC0 # <CJK> -0x7BC1 # <CJK> 0x7BC4 # <CJK> -0x7BC6 # <CJK> -0x7BC7 # <CJK> 0x7BC9 # <CJK> -0x7BCB # <CJK> -0x7BCC # <CJK> -0x7BCF # <CJK> -0x7BDD # <CJK> -0x7BE0 # <CJK> 0x7BE4 # <CJK> -0x7BE5 # <CJK> -0x7BE6 # <CJK> -0x7BE9 # <CJK> -0x7BED # <CJK> -0x7BF3 # <CJK> -0x7BF6 # <CJK> -0x7BF7 # <CJK> -0x7C00 # <CJK> -0x7C07 # <CJK> -0x7C0D # <CJK> -0x7C11 # <CJK> -0x7C12 # <CJK> -0x7C13 # <CJK> -0x7C14 # <CJK> -0x7C17 # <CJK> -0x7C1F # <CJK> 0x7C21 # <CJK> -0x7C23 # <CJK> -0x7C27 # <CJK> -0x7C2A # <CJK> -0x7C2B # <CJK> -0x7C37 # <CJK> -0x7C38 # <CJK> -0x7C3D # <CJK> -0x7C3E # <CJK> 0x7C3F # <CJK> -0x7C40 # <CJK> -0x7C43 # <CJK> -0x7C4C # <CJK> 0x7C4D # <CJK> -0x7C4F # <CJK> -0x7C50 # <CJK> -0x7C54 # <CJK> -0x7C56 # <CJK> -0x7C58 # <CJK> -0x7C5F # <CJK> 0x7C60 # <CJK> -0x7C64 # <CJK> -0x7C65 # <CJK> -0x7C6C # <CJK> 0x7C73 # <CJK> -0x7C75 # <CJK> -0x7C7E # <CJK> -0x7C81 # <CJK> -0x7C82 # <CJK> -0x7C83 # <CJK> 0x7C89 # <CJK> 0x7C8B # <CJK> -0x7C8D # <CJK> -0x7C90 # <CJK> 0x7C92 # <CJK> -0x7C95 # <CJK> 0x7C97 # <CJK> 0x7C98 # <CJK> 0x7C9B # <CJK> -0x7C9F # <CJK> -0x7CA1 # <CJK> -0x7CA2 # <CJK> -0x7CA4 # <CJK> -0x7CA5 # <CJK> 0x7CA7 # <CJK> -0x7CA8 # <CJK> -0x7CAB # <CJK> -0x7CAD # <CJK> -0x7CAE # <CJK> -0x7CB1 # <CJK> -0x7CB2 # <CJK> -0x7CB3 # <CJK> -0x7CB9 # <CJK> -0x7CBD # <CJK> 0x7CBE # <CJK> -0x7CC0 # <CJK> -0x7CC2 # <CJK> -0x7CC5 # <CJK> -0x7CCA # <CJK> -0x7CCE # <CJK> -0x7CD2 # <CJK> 0x7CD6 # <CJK> -0x7CD8 # <CJK> -0x7CDC # <CJK> -0x7CDE # <CJK> -0x7CDF # <CJK> -0x7CE0 # <CJK> -0x7CE2 # <CJK> 0x7CE7 # <CJK> -0x7CEF # <CJK> -0x7CF2 # <CJK> -0x7CF4 # <CJK> -0x7CF6 # <CJK> 0x7CF8 # <CJK> -0x7CFA # <CJK> 0x7CFB # <CJK> 0x7CFE # <CJK> 0x7D00 # <CJK> -0x7D02 # <CJK> 0x7D04 # <CJK> 0x7D05 # <CJK> -0x7D06 # <CJK> -0x7D0A # <CJK> 0x7D0B # <CJK> 0x7D0D # <CJK> -0x7D10 # <CJK> 0x7D14 # <CJK> -0x7D15 # <CJK> -0x7D17 # <CJK> -0x7D18 # <CJK> 0x7D19 # <CJK> 0x7D1A # <CJK> 0x7D1B # <CJK> -0x7D1C # <CJK> 0x7D20 # <CJK> 0x7D21 # <CJK> 0x7D22 # <CJK> 0x7D2B # <CJK> -0x7D2C # <CJK> -0x7D2E # <CJK> 0x7D2F # <CJK> 0x7D30 # <CJK> -0x7D32 # <CJK> 0x7D33 # <CJK> -0x7D35 # <CJK> 0x7D39 # <CJK> 0x7D3A # <CJK> -0x7D3F # <CJK> 0x7D42 # <CJK> -0x7D43 # <CJK> 0x7D44 # <CJK> -0x7D45 # <CJK> -0x7D46 # <CJK> -0x7D4B # <CJK> 0x7D4C # <CJK> -0x7D4E # <CJK> -0x7D4F # <CJK> 0x7D50 # <CJK> -0x7D56 # <CJK> -0x7D5B # <CJK> 0x7D5E # <CJK> 0x7D61 # <CJK> -0x7D62 # <CJK> -0x7D63 # <CJK> 0x7D66 # <CJK> -0x7D68 # <CJK> -0x7D6E # <CJK> 0x7D71 # <CJK> -0x7D72 # <CJK> -0x7D73 # <CJK> 0x7D75 # <CJK> 0x7D76 # <CJK> 0x7D79 # <CJK> -0x7D7D # <CJK> -0x7D89 # <CJK> -0x7D8F # <CJK> -0x7D93 # <CJK> 0x7D99 # <CJK> 0x7D9A # <CJK> -0x7D9B # <CJK> -0x7D9C # <CJK> -0x7D9F # <CJK> -0x7DA2 # <CJK> -0x7DA3 # <CJK> -0x7DAB # <CJK> -0x7DAC # <CJK> 0x7DAD # <CJK> -0x7DAE # <CJK> -0x7DAF # <CJK> -0x7DB0 # <CJK> 0x7DB1 # <CJK> 0x7DB2 # <CJK> -0x7DB4 # <CJK> -0x7DB5 # <CJK> -0x7DB8 # <CJK> -0x7DBA # <CJK> 0x7DBB # <CJK> -0x7DBD # <CJK> -0x7DBE # <CJK> 0x7DBF # <CJK> -0x7DC7 # <CJK> 0x7DCA # <CJK> -0x7DCB # <CJK> 0x7DCF # <CJK> 0x7DD1 # <CJK> 0x7DD2 # <CJK> -0x7DD5 # <CJK> -0x7DD8 # <CJK> 0x7DDA # <CJK> -0x7DDC # <CJK> -0x7DDD # <CJK> -0x7DDE # <CJK> 0x7DE0 # <CJK> -0x7DE1 # <CJK> -0x7DE4 # <CJK> 0x7DE8 # <CJK> 0x7DE9 # <CJK> -0x7DEC # <CJK> 0x7DEF # <CJK> -0x7DF2 # <CJK> 0x7DF4 # <CJK> 0x7DFB # <CJK> 0x7E01 # <CJK> 0x7E04 # <CJK> -0x7E05 # <CJK> -0x7E09 # <CJK> -0x7E0A # <CJK> -0x7E0B # <CJK> -0x7E12 # <CJK> 0x7E1B # <CJK> -0x7E1E # <CJK> -0x7E1F # <CJK> -0x7E21 # <CJK> -0x7E22 # <CJK> -0x7E23 # <CJK> 0x7E26 # <CJK> 0x7E2B # <CJK> 0x7E2E # <CJK> -0x7E31 # <CJK> -0x7E32 # <CJK> -0x7E35 # <CJK> -0x7E37 # <CJK> -0x7E39 # <CJK> -0x7E3A # <CJK> -0x7E3B # <CJK> -0x7E3D # <CJK> 0x7E3E # <CJK> 0x7E41 # <CJK> -0x7E43 # <CJK> -0x7E46 # <CJK> 0x7E4A # <CJK> -0x7E4B # <CJK> -0x7E4D # <CJK> 0x7E54 # <CJK> 0x7E55 # <CJK> -0x7E56 # <CJK> -0x7E59 # <CJK> -0x7E5A # <CJK> -0x7E5D # <CJK> -0x7E5E # <CJK> -0x7E66 # <CJK> -0x7E67 # <CJK> -0x7E69 # <CJK> -0x7E6A # <CJK> 0x7E6D # <CJK> 0x7E70 # <CJK> -0x7E79 # <CJK> -0x7E7B # <CJK> -0x7E7C # <CJK> -0x7E7D # <CJK> -0x7E7F # <CJK> -0x7E82 # <CJK> -0x7E83 # <CJK> -0x7E88 # <CJK> -0x7E89 # <CJK> -0x7E8C # <CJK> -0x7E8E # <CJK> -0x7E8F # <CJK> -0x7E90 # <CJK> -0x7E92 # <CJK> -0x7E93 # <CJK> -0x7E94 # <CJK> -0x7E96 # <CJK> -0x7E9B # <CJK> -0x7E9C # <CJK> 0x7F36 # <CJK> -0x7F38 # <CJK> -0x7F3A # <CJK> -0x7F45 # <CJK> -0x7F4C # <CJK> -0x7F4D # <CJK> -0x7F4E # <CJK> -0x7F50 # <CJK> -0x7F51 # <CJK> -0x7F54 # <CJK> -0x7F55 # <CJK> -0x7F58 # <CJK> -0x7F5F # <CJK> -0x7F60 # <CJK> -0x7F67 # <CJK> -0x7F68 # <CJK> -0x7F69 # <CJK> 0x7F6A # <CJK> -0x7F6B # <CJK> 0x7F6E # <CJK> 0x7F70 # <CJK> 0x7F72 # <CJK> 0x7F75 # <CJK> 0x7F77 # <CJK> -0x7F78 # <CJK> -0x7F79 # <CJK> -0x7F82 # <CJK> -0x7F83 # <CJK> 0x7F85 # <CJK> -0x7F86 # <CJK> -0x7F87 # <CJK> -0x7F88 # <CJK> 0x7F8A # <CJK> -0x7F8C # <CJK> 0x7F8E # <CJK> -0x7F94 # <CJK> -0x7F9A # <CJK> -0x7F9D # <CJK> 0x7F9E # <CJK> -0x7FA3 # <CJK> 0x7FA4 # <CJK> 0x7FA8 # <CJK> 0x7FA9 # <CJK> -0x7FAE # <CJK> -0x7FAF # <CJK> -0x7FB2 # <CJK> -0x7FB6 # <CJK> -0x7FB8 # <CJK> -0x7FB9 # <CJK> 0x7FBD # <CJK> 0x7FC1 # <CJK> -0x7FC5 # <CJK> -0x7FC6 # <CJK> -0x7FCA # <CJK> 0x7FCC # <CJK> 0x7FD2 # <CJK> -0x7FD4 # <CJK> -0x7FD5 # <CJK> -0x7FE0 # <CJK> -0x7FE1 # <CJK> -0x7FE6 # <CJK> -0x7FE9 # <CJK> -0x7FEB # <CJK> -0x7FF0 # <CJK> -0x7FF3 # <CJK> -0x7FF9 # <CJK> 0x7FFB # <CJK> 0x7FFC # <CJK> -0x8000 # <CJK> 0x8001 # <CJK> 0x8003 # <CJK> -0x8004 # <CJK> 0x8005 # <CJK> -0x8006 # <CJK> -0x800B # <CJK> -0x800C # <CJK> 0x8010 # <CJK> -0x8012 # <CJK> 0x8015 # <CJK> 0x8017 # <CJK> -0x8018 # <CJK> -0x8019 # <CJK> -0x801C # <CJK> -0x8021 # <CJK> -0x8028 # <CJK> 0x8033 # <CJK> -0x8036 # <CJK> -0x803B # <CJK> -0x803D # <CJK> -0x803F # <CJK> -0x8046 # <CJK> -0x804A # <CJK> -0x8052 # <CJK> 0x8056 # <CJK> -0x8058 # <CJK> -0x805A # <CJK> 0x805E # <CJK> -0x805F # <CJK> -0x8061 # <CJK> -0x8062 # <CJK> -0x8068 # <CJK> -0x806F # <CJK> -0x8070 # <CJK> -0x8072 # <CJK> -0x8073 # <CJK> 0x8074 # <CJK> -0x8076 # <CJK> 0x8077 # <CJK> -0x8079 # <CJK> -0x807D # <CJK> -0x807E # <CJK> -0x807F # <CJK> -0x8084 # <CJK> -0x8085 # <CJK> -0x8086 # <CJK> -0x8087 # <CJK> 0x8089 # <CJK> -0x808B # <CJK> 0x808C # <CJK> -0x8093 # <CJK> 0x8096 # <CJK> 0x8098 # <CJK> -0x809A # <CJK> -0x809B # <CJK> 0x809D # <CJK> 0x80A1 # <CJK> 0x80A2 # <CJK> 0x80A5 # <CJK> 0x80A9 # <CJK> 0x80AA # <CJK> -0x80AC # <CJK> -0x80AD # <CJK> 0x80AF # <CJK> -0x80B1 # <CJK> 0x80B2 # <CJK> -0x80B4 # <CJK> 0x80BA # <CJK> 0x80C3 # <CJK> -0x80C4 # <CJK> 0x80C6 # <CJK> 0x80CC # <CJK> 0x80CE # <CJK> -0x80D6 # <CJK> -0x80D9 # <CJK> -0x80DA # <CJK> -0x80DB # <CJK> -0x80DD # <CJK> 0x80DE # <CJK> -0x80E1 # <CJK> -0x80E4 # <CJK> -0x80E5 # <CJK> -0x80EF # <CJK> -0x80F1 # <CJK> 0x80F4 # <CJK> 0x80F8 # <CJK> -0x80FC # <CJK> 0x80FD # <CJK> 0x8102 # <CJK> 0x8105 # <CJK> -0x8106 # <CJK> 0x8107 # <CJK> 0x8108 # <CJK> -0x8109 # <CJK> 0x810A # <CJK> 0x811A # <CJK> -0x811B # <CJK> -0x8123 # <CJK> -0x8129 # <CJK> -0x812F # <CJK> 0x8131 # <CJK> 0x8133 # <CJK> -0x8139 # <CJK> -0x813E # <CJK> -0x8146 # <CJK> -0x814B # <CJK> 0x814E # <CJK> 0x8150 # <CJK> -0x8151 # <CJK> -0x8153 # <CJK> -0x8154 # <CJK> 0x8155 # <CJK> -0x815F # <CJK> -0x8165 # <CJK> -0x8166 # <CJK> 0x816B # <CJK> -0x816E # <CJK> 0x8170 # <CJK> -0x8171 # <CJK> -0x8174 # <CJK> 0x8178 # <CJK> 0x8179 # <CJK> 0x817A # <CJK> -0x817F # <CJK> -0x8180 # <CJK> -0x8182 # <CJK> -0x8183 # <CJK> -0x8188 # <CJK> -0x818A # <CJK> -0x818F # <CJK> -0x8193 # <CJK> -0x8195 # <CJK> 0x819A # <CJK> 0x819C # <CJK> 0x819D # <CJK> -0x81A0 # <CJK> -0x81A3 # <CJK> -0x81A4 # <CJK> 0x81A8 # <CJK> -0x81A9 # <CJK> -0x81B0 # <CJK> 0x81B3 # <CJK> -0x81B5 # <CJK> -0x81B8 # <CJK> -0x81BA # <CJK> -0x81BD # <CJK> -0x81BE # <CJK> -0x81BF # <CJK> -0x81C0 # <CJK> -0x81C2 # <CJK> 0x81C6 # <CJK> -0x81C8 # <CJK> -0x81C9 # <CJK> -0x81CD # <CJK> -0x81D1 # <CJK> 0x81D3 # <CJK> -0x81D8 # <CJK> -0x81D9 # <CJK> -0x81DA # <CJK> -0x81DF # <CJK> -0x81E0 # <CJK> 0x81E3 # <CJK> -0x81E5 # <CJK> -0x81E7 # <CJK> 0x81E8 # <CJK> 0x81EA # <CJK> 0x81ED # <CJK> 0x81F3 # <CJK> 0x81F4 # <CJK> -0x81FA # <CJK> -0x81FB # <CJK> 0x81FC # <CJK> -0x81FE # <CJK> -0x8201 # <CJK> -0x8202 # <CJK> -0x8205 # <CJK> -0x8207 # <CJK> 0x8208 # <CJK> -0x8209 # <CJK> -0x820A # <CJK> 0x820C # <CJK> -0x820D # <CJK> 0x820E # <CJK> -0x8210 # <CJK> -0x8212 # <CJK> -0x8216 # <CJK> 0x8217 # <CJK> -0x8218 # <CJK> -0x821B # <CJK> -0x821C # <CJK> 0x821E # <CJK> 0x821F # <CJK> -0x8229 # <CJK> 0x822A # <CJK> -0x822B # <CJK> 0x822C # <CJK> -0x822E # <CJK> -0x8233 # <CJK> -0x8235 # <CJK> 0x8236 # <CJK> 0x8237 # <CJK> -0x8238 # <CJK> 0x8239 # <CJK> -0x8240 # <CJK> 0x8247 # <CJK> -0x8258 # <CJK> -0x8259 # <CJK> -0x825A # <CJK> -0x825D # <CJK> -0x825F # <CJK> -0x8262 # <CJK> -0x8264 # <CJK> 0x8266 # <CJK> -0x8268 # <CJK> -0x826A # <CJK> -0x826B # <CJK> -0x826E # <CJK> 0x826F # <CJK> -0x8271 # <CJK> 0x8272 # <CJK> 0x8276 # <CJK> -0x8277 # <CJK> -0x8278 # <CJK> -0x827E # <CJK> 0x828B # <CJK> -0x828D # <CJK> -0x8292 # <CJK> -0x8299 # <CJK> 0x829D # <CJK> -0x829F # <CJK> -0x82A5 # <CJK> -0x82A6 # <CJK> -0x82AB # <CJK> -0x82AC # <CJK> -0x82AD # <CJK> 0x82AF # <CJK> 0x82B1 # <CJK> 0x82B3 # <CJK> 0x82B8 # <CJK> -0x82B9 # <CJK> -0x82BB # <CJK> 0x82BD # <CJK> -0x82C5 # <CJK> -0x82D1 # <CJK> -0x82D2 # <CJK> -0x82D3 # <CJK> -0x82D4 # <CJK> 0x82D7 # <CJK> -0x82D9 # <CJK> 0x82DB # <CJK> -0x82DC # <CJK> -0x82DE # <CJK> -0x82DF # <CJK> -0x82E1 # <CJK> -0x82E3 # <CJK> 0x82E5 # <CJK> 0x82E6 # <CJK> -0x82E7 # <CJK> -0x82EB # <CJK> 0x82F1 # <CJK> -0x82F3 # <CJK> -0x82F4 # <CJK> -0x82F9 # <CJK> -0x82FA # <CJK> -0x82FB # <CJK> 0x8302 # <CJK> -0x8303 # <CJK> -0x8304 # <CJK> -0x8305 # <CJK> -0x8306 # <CJK> -0x8309 # <CJK> 0x830E # <CJK> -0x8316 # <CJK> -0x8317 # <CJK> -0x8318 # <CJK> -0x831C # <CJK> -0x8323 # <CJK> 0x8328 # <CJK> -0x832B # <CJK> -0x832F # <CJK> -0x8331 # <CJK> -0x8332 # <CJK> -0x8334 # <CJK> -0x8335 # <CJK> 0x8336 # <CJK> -0x8338 # <CJK> -0x8339 # <CJK> -0x8340 # <CJK> -0x8345 # <CJK> 0x8349 # <CJK> -0x834A # <CJK> -0x834F # <CJK> -0x8350 # <CJK> 0x8352 # <CJK> 0x8358 # <CJK> -0x8373 # <CJK> -0x8375 # <CJK> 0x8377 # <CJK> -0x837B # <CJK> -0x837C # <CJK> -0x8385 # <CJK> -0x8387 # <CJK> -0x8389 # <CJK> -0x838A # <CJK> -0x838E # <CJK> -0x8393 # <CJK> -0x8396 # <CJK> -0x839A # <CJK> -0x839E # <CJK> -0x839F # <CJK> -0x83A0 # <CJK> -0x83A2 # <CJK> -0x83A8 # <CJK> -0x83AA # <CJK> -0x83AB # <CJK> -0x83B1 # <CJK> -0x83B5 # <CJK> -0x83BD # <CJK> -0x83C1 # <CJK> -0x83C5 # <CJK> 0x83CA # <CJK> 0x83CC # <CJK> -0x83CE # <CJK> 0x83D3 # <CJK> -0x83D6 # <CJK> -0x83D8 # <CJK> 0x83DC # <CJK> -0x83DF # <CJK> -0x83E0 # <CJK> -0x83E9 # <CJK> -0x83EB # <CJK> 0x83EF # <CJK> -0x83F0 # <CJK> -0x83F1 # <CJK> -0x83F2 # <CJK> -0x83F4 # <CJK> -0x83F7 # <CJK> -0x83FB # <CJK> -0x83FD # <CJK> -0x8403 # <CJK> -0x8404 # <CJK> -0x8407 # <CJK> -0x840B # <CJK> -0x840C # <CJK> -0x840D # <CJK> 0x840E # <CJK> -0x8413 # <CJK> -0x8420 # <CJK> -0x8422 # <CJK> -0x8429 # <CJK> -0x842A # <CJK> -0x842C # <CJK> -0x8431 # <CJK> -0x8435 # <CJK> -0x8438 # <CJK> -0x843C # <CJK> 0x843D # <CJK> -0x8446 # <CJK> 0x8449 # <CJK> -0x844E # <CJK> 0x8457 # <CJK> 0x845B # <CJK> -0x8461 # <CJK> -0x8462 # <CJK> -0x8463 # <CJK> -0x8466 # <CJK> -0x8469 # <CJK> -0x846B # <CJK> 0x846C # <CJK> -0x846D # <CJK> -0x846E # <CJK> -0x846F # <CJK> -0x8471 # <CJK> -0x8475 # <CJK> -0x8477 # <CJK> -0x8479 # <CJK> -0x847A # <CJK> -0x8482 # <CJK> -0x8484 # <CJK> -0x848B # <CJK> -0x8490 # <CJK> -0x8494 # <CJK> -0x8499 # <CJK> -0x849C # <CJK> -0x849F # <CJK> -0x84A1 # <CJK> -0x84AD # <CJK> -0x84B2 # <CJK> 0x84B8 # <CJK> -0x84B9 # <CJK> -0x84BB # <CJK> -0x84BC # <CJK> -0x84BF # <CJK> -0x84C1 # <CJK> 0x84C4 # <CJK> -0x84C6 # <CJK> -0x84C9 # <CJK> -0x84CA # <CJK> 0x84CB # <CJK> -0x84CD # <CJK> -0x84D0 # <CJK> -0x84D1 # <CJK> -0x84D6 # <CJK> -0x84D9 # <CJK> -0x84DA # <CJK> -0x84EC # <CJK> -0x84EE # <CJK> -0x84F4 # <CJK> -0x84FC # <CJK> -0x84FF # <CJK> -0x8500 # <CJK> -0x8506 # <CJK> 0x8511 # <CJK> -0x8513 # <CJK> -0x8514 # <CJK> -0x8515 # <CJK> -0x8517 # <CJK> -0x8518 # <CJK> -0x851A # <CJK> -0x851F # <CJK> -0x8521 # <CJK> -0x8526 # <CJK> -0x852C # <CJK> -0x852D # <CJK> 0x8535 # <CJK> 0x853D # <CJK> -0x8540 # <CJK> -0x8541 # <CJK> -0x8543 # <CJK> -0x8548 # <CJK> -0x8549 # <CJK> -0x854A # <CJK> -0x854B # <CJK> -0x854E # <CJK> -0x8555 # <CJK> -0x8557 # <CJK> -0x8558 # <CJK> -0x855A # <CJK> -0x8563 # <CJK> -0x8568 # <CJK> -0x8569 # <CJK> -0x856A # <CJK> -0x856D # <CJK> -0x8577 # <CJK> -0x857E # <CJK> -0x8580 # <CJK> 0x8584 # <CJK> -0x8587 # <CJK> -0x8588 # <CJK> -0x858A # <CJK> -0x8590 # <CJK> -0x8591 # <CJK> -0x8594 # <CJK> -0x8597 # <CJK> -0x8599 # <CJK> -0x859B # <CJK> -0x859C # <CJK> -0x85A4 # <CJK> 0x85A6 # <CJK> -0x85A8 # <CJK> -0x85A9 # <CJK> 0x85AA # <CJK> 0x85AB # <CJK> 0x85AC # <CJK> -0x85AE # <CJK> -0x85AF # <CJK> -0x85B9 # <CJK> -0x85BA # <CJK> -0x85C1 # <CJK> -0x85C9 # <CJK> 0x85CD # <CJK> -0x85CF # <CJK> -0x85D0 # <CJK> -0x85D5 # <CJK> -0x85DC # <CJK> -0x85DD # <CJK> 0x85E4 # <CJK> -0x85E5 # <CJK> 0x85E9 # <CJK> -0x85EA # <CJK> -0x85F7 # <CJK> -0x85F9 # <CJK> -0x85FA # <CJK> 0x85FB # <CJK> -0x85FE # <CJK> -0x8602 # <CJK> -0x8606 # <CJK> -0x8607 # <CJK> -0x860A # <CJK> -0x860B # <CJK> -0x8613 # <CJK> -0x8616 # <CJK> -0x8617 # <CJK> -0x861A # <CJK> -0x8622 # <CJK> -0x862D # <CJK> -0x862F # <CJK> -0x8630 # <CJK> -0x863F # <CJK> -0x864D # <CJK> 0x864E # <CJK> 0x8650 # <CJK> -0x8654 # <CJK> -0x8655 # <CJK> 0x865A # <CJK> 0x865C # <CJK> 0x865E # <CJK> -0x865F # <CJK> -0x8667 # <CJK> 0x866B # <CJK> -0x8671 # <CJK> 0x8679 # <CJK> -0x867B # <CJK> 0x868A # <CJK> -0x868B # <CJK> -0x868C # <CJK> -0x8693 # <CJK> 0x8695 # <CJK> -0x86A3 # <CJK> -0x86A4 # <CJK> -0x86A9 # <CJK> -0x86AA # <CJK> -0x86AB # <CJK> -0x86AF # <CJK> -0x86B0 # <CJK> -0x86B6 # <CJK> -0x86C4 # <CJK> -0x86C6 # <CJK> 0x86C7 # <CJK> -0x86C9 # <CJK> -0x86CB # <CJK> 0x86CD # <CJK> -0x86CE # <CJK> -0x86D4 # <CJK> -0x86D9 # <CJK> -0x86DB # <CJK> -0x86DE # <CJK> -0x86DF # <CJK> -0x86E4 # <CJK> -0x86E9 # <CJK> -0x86EC # <CJK> -0x86ED # <CJK> 0x86EE # <CJK> -0x86EF # <CJK> -0x86F8 # <CJK> -0x86F9 # <CJK> -0x86FB # <CJK> -0x86FE # <CJK> -0x8700 # <CJK> 0x8702 # <CJK> -0x8703 # <CJK> -0x8706 # <CJK> -0x8708 # <CJK> -0x8709 # <CJK> -0x870A # <CJK> -0x870D # <CJK> -0x8711 # <CJK> -0x8712 # <CJK> -0x8718 # <CJK> -0x871A # <CJK> 0x871C # <CJK> -0x8725 # <CJK> -0x8729 # <CJK> -0x8734 # <CJK> -0x8737 # <CJK> -0x873B # <CJK> -0x873F # <CJK> -0x8749 # <CJK> -0x874B # <CJK> -0x874C # <CJK> -0x874E # <CJK> -0x8753 # <CJK> -0x8755 # <CJK> -0x8757 # <CJK> -0x8759 # <CJK> -0x875F # <CJK> -0x8760 # <CJK> -0x8763 # <CJK> -0x8766 # <CJK> -0x8768 # <CJK> -0x876A # <CJK> -0x876E # <CJK> -0x8774 # <CJK> -0x8776 # <CJK> -0x8778 # <CJK> -0x877F # <CJK> -0x8782 # <CJK> 0x878D # <CJK> -0x879F # <CJK> -0x87A2 # <CJK> -0x87AB # <CJK> -0x87AF # <CJK> -0x87B3 # <CJK> -0x87BA # <CJK> -0x87BB # <CJK> -0x87BD # <CJK> -0x87C0 # <CJK> -0x87C4 # <CJK> -0x87C6 # <CJK> -0x87C7 # <CJK> -0x87CB # <CJK> -0x87D0 # <CJK> -0x87D2 # <CJK> -0x87E0 # <CJK> -0x87EF # <CJK> -0x87F2 # <CJK> -0x87F6 # <CJK> -0x87F7 # <CJK> -0x87F9 # <CJK> -0x87FB # <CJK> -0x87FE # <CJK> -0x8805 # <CJK> -0x880D # <CJK> -0x880E # <CJK> -0x880F # <CJK> -0x8811 # <CJK> -0x8815 # <CJK> -0x8816 # <CJK> -0x8821 # <CJK> -0x8822 # <CJK> -0x8823 # <CJK> -0x8827 # <CJK> -0x8831 # <CJK> -0x8836 # <CJK> -0x8839 # <CJK> -0x883B # <CJK> 0x8840 # <CJK> -0x8842 # <CJK> -0x8844 # <CJK> 0x8846 # <CJK> 0x884C # <CJK> -0x884D # <CJK> -0x8852 # <CJK> 0x8853 # <CJK> 0x8857 # <CJK> -0x8859 # <CJK> 0x885B # <CJK> 0x885D # <CJK> -0x885E # <CJK> 0x8861 # <CJK> -0x8862 # <CJK> 0x8863 # <CJK> 0x8868 # <CJK> -0x886B # <CJK> 0x8870 # <CJK> -0x8872 # <CJK> -0x8875 # <CJK> 0x8877 # <CJK> -0x887D # <CJK> -0x887E # <CJK> -0x887F # <CJK> -0x8881 # <CJK> -0x8882 # <CJK> -0x8888 # <CJK> 0x888B # <CJK> -0x888D # <CJK> -0x8892 # <CJK> 0x8896 # <CJK> -0x8897 # <CJK> -0x8899 # <CJK> -0x889E # <CJK> -0x88A2 # <CJK> -0x88A4 # <CJK> 0x88AB # <CJK> -0x88AE # <CJK> -0x88B0 # <CJK> -0x88B1 # <CJK> -0x88B4 # <CJK> -0x88B5 # <CJK> -0x88B7 # <CJK> -0x88BF # <CJK> 0x88C1 # <CJK> 0x88C2 # <CJK> -0x88C3 # <CJK> -0x88C4 # <CJK> 0x88C5 # <CJK> 0x88CF # <CJK> -0x88D4 # <CJK> 0x88D5 # <CJK> -0x88D8 # <CJK> -0x88D9 # <CJK> 0x88DC # <CJK> -0x88DD # <CJK> -0x88DF # <CJK> -0x88E1 # <CJK> -0x88E8 # <CJK> -0x88F2 # <CJK> -0x88F3 # <CJK> -0x88F4 # <CJK> 0x88F8 # <CJK> -0x88F9 # <CJK> -0x88FC # <CJK> 0x88FD # <CJK> 0x88FE # <CJK> -0x8902 # <CJK> -0x8904 # <CJK> 0x8907 # <CJK> -0x890A # <CJK> -0x890C # <CJK> 0x8910 # <CJK> 0x8912 # <CJK> -0x8913 # <CJK> -0x891D # <CJK> -0x891E # <CJK> -0x8925 # <CJK> -0x892A # <CJK> -0x892B # <CJK> -0x8936 # <CJK> -0x8938 # <CJK> -0x893B # <CJK> -0x8941 # <CJK> -0x8943 # <CJK> -0x8944 # <CJK> -0x894C # <CJK> -0x894D # <CJK> -0x8956 # <CJK> -0x895E # <CJK> 0x895F # <CJK> -0x8960 # <CJK> -0x8964 # <CJK> -0x8966 # <CJK> -0x896A # <CJK> -0x896D # <CJK> -0x896F # <CJK> 0x8972 # <CJK> -0x8974 # <CJK> -0x8977 # <CJK> -0x897E # <CJK> 0x897F # <CJK> 0x8981 # <CJK> -0x8983 # <CJK> 0x8986 # <CJK> 0x8987 # <CJK> -0x8988 # <CJK> -0x898A # <CJK> 0x898B # <CJK> 0x898F # <CJK> -0x8993 # <CJK> 0x8996 # <CJK> -0x8997 # <CJK> -0x8998 # <CJK> 0x899A # <CJK> -0x89A1 # <CJK> -0x89A6 # <CJK> 0x89A7 # <CJK> -0x89A9 # <CJK> 0x89AA # <CJK> -0x89AC # <CJK> -0x89AF # <CJK> -0x89B2 # <CJK> 0x89B3 # <CJK> -0x89BA # <CJK> -0x89BD # <CJK> -0x89BF # <CJK> -0x89C0 # <CJK> 0x89D2 # <CJK> -0x89DA # <CJK> -0x89DC # <CJK> -0x89DD # <CJK> 0x89E3 # <CJK> 0x89E6 # <CJK> -0x89E7 # <CJK> -0x89F4 # <CJK> -0x89F8 # <CJK> 0x8A00 # <CJK> 0x8A02 # <CJK> 0x8A03 # <CJK> 0x8A08 # <CJK> -0x8A0A # <CJK> -0x8A0C # <CJK> 0x8A0E # <CJK> -0x8A10 # <CJK> 0x8A13 # <CJK> -0x8A16 # <CJK> 0x8A17 # <CJK> 0x8A18 # <CJK> -0x8A1B # <CJK> -0x8A1D # <CJK> 0x8A1F # <CJK> -0x8A23 # <CJK> -0x8A25 # <CJK> 0x8A2A # <CJK> 0x8A2D # <CJK> 0x8A31 # <CJK> 0x8A33 # <CJK> 0x8A34 # <CJK> -0x8A36 # <CJK> 0x8A3A # <CJK> -0x8A3B # <CJK> 0x8A3C # <CJK> -0x8A41 # <CJK> -0x8A46 # <CJK> -0x8A48 # <CJK> 0x8A50 # <CJK> -0x8A51 # <CJK> -0x8A52 # <CJK> 0x8A54 # <CJK> 0x8A55 # <CJK> -0x8A5B # <CJK> 0x8A5E # <CJK> 0x8A60 # <CJK> -0x8A62 # <CJK> 0x8A63 # <CJK> 0x8A66 # <CJK> 0x8A69 # <CJK> -0x8A6B # <CJK> -0x8A6C # <CJK> -0x8A6D # <CJK> 0x8A6E # <CJK> 0x8A70 # <CJK> 0x8A71 # <CJK> 0x8A72 # <CJK> 0x8A73 # <CJK> -0x8A7C # <CJK> -0x8A82 # <CJK> -0x8A84 # <CJK> -0x8A85 # <CJK> 0x8A87 # <CJK> 0x8A89 # <CJK> 0x8A8C # <CJK> 0x8A8D # <CJK> -0x8A91 # <CJK> 0x8A93 # <CJK> 0x8A95 # <CJK> 0x8A98 # <CJK> -0x8A9A # <CJK> 0x8A9E # <CJK> 0x8AA0 # <CJK> -0x8AA1 # <CJK> -0x8AA3 # <CJK> 0x8AA4 # <CJK> -0x8AA5 # <CJK> -0x8AA6 # <CJK> -0x8AA8 # <CJK> 0x8AAC # <CJK> 0x8AAD # <CJK> 0x8AB0 # <CJK> 0x8AB2 # <CJK> -0x8AB9 # <CJK> -0x8ABC # <CJK> 0x8ABF # <CJK> -0x8AC2 # <CJK> -0x8AC4 # <CJK> 0x8AC7 # <CJK> 0x8ACB # <CJK> -0x8ACC # <CJK> -0x8ACD # <CJK> -0x8ACF # <CJK> -0x8AD2 # <CJK> 0x8AD6 # <CJK> -0x8ADA # <CJK> -0x8ADB # <CJK> -0x8ADC # <CJK> -0x8ADE # <CJK> -0x8AE0 # <CJK> -0x8AE1 # <CJK> -0x8AE2 # <CJK> -0x8AE4 # <CJK> 0x8AE6 # <CJK> 0x8AE7 # <CJK> -0x8AEB # <CJK> 0x8AED # <CJK> 0x8AEE # <CJK> -0x8AF1 # <CJK> -0x8AF3 # <CJK> -0x8AF7 # <CJK> 0x8AF8 # <CJK> -0x8AFA # <CJK> 0x8AFE # <CJK> 0x8B00 # <CJK> 0x8B01 # <CJK> -0x8B02 # <CJK> 0x8B04 # <CJK> -0x8B07 # <CJK> -0x8B0C # <CJK> 0x8B0E # <CJK> -0x8B10 # <CJK> -0x8B14 # <CJK> -0x8B16 # <CJK> -0x8B17 # <CJK> 0x8B19 # <CJK> -0x8B1A # <CJK> 0x8B1B # <CJK> 0x8B1D # <CJK> -0x8B20 # <CJK> 0x8B21 # <CJK> -0x8B26 # <CJK> -0x8B28 # <CJK> -0x8B2B # <CJK> -0x8B2C # <CJK> -0x8B33 # <CJK> 0x8B39 # <CJK> -0x8B3E # <CJK> -0x8B41 # <CJK> -0x8B49 # <CJK> -0x8B4C # <CJK> -0x8B4E # <CJK> -0x8B4F # <CJK> -0x8B56 # <CJK> 0x8B58 # <CJK> -0x8B5A # <CJK> -0x8B5B # <CJK> 0x8B5C # <CJK> -0x8B5F # <CJK> 0x8B66 # <CJK> -0x8B6B # <CJK> -0x8B6C # <CJK> -0x8B6F # <CJK> 0x8B70 # <CJK> -0x8B71 # <CJK> 0x8B72 # <CJK> -0x8B74 # <CJK> 0x8B77 # <CJK> -0x8B7D # <CJK> -0x8B80 # <CJK> -0x8B83 # <CJK> -0x8B8A # <CJK> -0x8B8C # <CJK> -0x8B8E # <CJK> -0x8B90 # <CJK> -0x8B92 # <CJK> -0x8B93 # <CJK> -0x8B96 # <CJK> -0x8B99 # <CJK> -0x8B9A # <CJK> 0x8C37 # <CJK> -0x8C3A # <CJK> -0x8C3F # <CJK> -0x8C41 # <CJK> 0x8C46 # <CJK> -0x8C48 # <CJK> 0x8C4A # <CJK> -0x8C4C # <CJK> -0x8C4E # <CJK> -0x8C50 # <CJK> -0x8C55 # <CJK> 0x8C5A # <CJK> 0x8C61 # <CJK> -0x8C62 # <CJK> 0x8C6A # <CJK> -0x8C6B # <CJK> -0x8C6C # <CJK> -0x8C78 # <CJK> -0x8C79 # <CJK> -0x8C7A # <CJK> -0x8C7C # <CJK> -0x8C82 # <CJK> -0x8C85 # <CJK> -0x8C89 # <CJK> -0x8C8A # <CJK> 0x8C8C # <CJK> -0x8C8D # <CJK> -0x8C8E # <CJK> -0x8C94 # <CJK> -0x8C98 # <CJK> 0x8C9D # <CJK> 0x8C9E # <CJK> 0x8CA0 # <CJK> @@ -5348,1218 +2008,338 @@ 0x8CAA # <CJK> 0x8CAB # <CJK> 0x8CAC # <CJK> -0x8CAD # <CJK> -0x8CAE # <CJK> 0x8CAF # <CJK> -0x8CB0 # <CJK> -0x8CB2 # <CJK> -0x8CB3 # <CJK> 0x8CB4 # <CJK> -0x8CB6 # <CJK> 0x8CB7 # <CJK> 0x8CB8 # <CJK> 0x8CBB # <CJK> 0x8CBC # <CJK> -0x8CBD # <CJK> 0x8CBF # <CJK> 0x8CC0 # <CJK> -0x8CC1 # <CJK> 0x8CC2 # <CJK> 0x8CC3 # <CJK> 0x8CC4 # <CJK> 0x8CC7 # <CJK> -0x8CC8 # <CJK> 0x8CCA # <CJK> -0x8CCD # <CJK> -0x8CCE # <CJK> -0x8CD1 # <CJK> 0x8CD3 # <CJK> -0x8CDA # <CJK> 0x8CDB # <CJK> 0x8CDC # <CJK> 0x8CDE # <CJK> 0x8CE0 # <CJK> 0x8CE2 # <CJK> -0x8CE3 # <CJK> -0x8CE4 # <CJK> 0x8CE6 # <CJK> 0x8CEA # <CJK> 0x8CED # <CJK> -0x8CFA # <CJK> -0x8CFB # <CJK> 0x8CFC # <CJK> -0x8CFD # <CJK> -0x8D04 # <CJK> -0x8D05 # <CJK> -0x8D07 # <CJK> 0x8D08 # <CJK> -0x8D0A # <CJK> -0x8D0B # <CJK> -0x8D0D # <CJK> -0x8D0F # <CJK> -0x8D10 # <CJK> -0x8D13 # <CJK> -0x8D14 # <CJK> -0x8D16 # <CJK> 0x8D64 # <CJK> 0x8D66 # <CJK> -0x8D67 # <CJK> -0x8D6B # <CJK> -0x8D6D # <CJK> 0x8D70 # <CJK> -0x8D71 # <CJK> -0x8D73 # <CJK> 0x8D74 # <CJK> 0x8D77 # <CJK> -0x8D81 # <CJK> 0x8D85 # <CJK> 0x8D8A # <CJK> -0x8D99 # <CJK> 0x8DA3 # <CJK> -0x8DA8 # <CJK> 0x8DB3 # <CJK> -0x8DBA # <CJK> -0x8DBE # <CJK> -0x8DC2 # <CJK> -0x8DCB # <CJK> -0x8DCC # <CJK> -0x8DCF # <CJK> -0x8DD6 # <CJK> -0x8DDA # <CJK> -0x8DDB # <CJK> 0x8DDD # <CJK> -0x8DDF # <CJK> 0x8DE1 # <CJK> -0x8DE3 # <CJK> -0x8DE8 # <CJK> -0x8DEA # <CJK> -0x8DEB # <CJK> 0x8DEF # <CJK> 0x8DF3 # <CJK> 0x8DF5 # <CJK> -0x8DFC # <CJK> -0x8DFF # <CJK> -0x8E08 # <CJK> -0x8E09 # <CJK> 0x8E0A # <CJK> 0x8E0F # <CJK> -0x8E10 # <CJK> -0x8E1D # <CJK> -0x8E1E # <CJK> -0x8E1F # <CJK> 0x8E2A # <CJK> -0x8E30 # <CJK> -0x8E34 # <CJK> -0x8E35 # <CJK> -0x8E42 # <CJK> -0x8E44 # <CJK> -0x8E47 # <CJK> -0x8E48 # <CJK> -0x8E49 # <CJK> -0x8E4A # <CJK> -0x8E4C # <CJK> -0x8E50 # <CJK> -0x8E55 # <CJK> -0x8E59 # <CJK> -0x8E5F # <CJK> -0x8E60 # <CJK> -0x8E63 # <CJK> -0x8E64 # <CJK> -0x8E72 # <CJK> 0x8E74 # <CJK> -0x8E76 # <CJK> -0x8E7C # <CJK> -0x8E81 # <CJK> -0x8E84 # <CJK> -0x8E85 # <CJK> -0x8E87 # <CJK> -0x8E8A # <CJK> -0x8E8B # <CJK> 0x8E8D # <CJK> -0x8E91 # <CJK> -0x8E93 # <CJK> -0x8E94 # <CJK> -0x8E99 # <CJK> -0x8EA1 # <CJK> -0x8EAA # <CJK> 0x8EAB # <CJK> -0x8EAC # <CJK> -0x8EAF # <CJK> -0x8EB0 # <CJK> -0x8EB1 # <CJK> -0x8EBE # <CJK> -0x8EC5 # <CJK> -0x8EC6 # <CJK> -0x8EC8 # <CJK> 0x8ECA # <CJK> -0x8ECB # <CJK> 0x8ECC # <CJK> 0x8ECD # <CJK> 0x8ED2 # <CJK> -0x8EDB # <CJK> 0x8EDF # <CJK> 0x8EE2 # <CJK> -0x8EE3 # <CJK> -0x8EEB # <CJK> 0x8EF8 # <CJK> -0x8EFB # <CJK> -0x8EFC # <CJK> 0x8EFD # <CJK> -0x8EFE # <CJK> 0x8F03 # <CJK> -0x8F05 # <CJK> 0x8F09 # <CJK> -0x8F0A # <CJK> -0x8F0C # <CJK> -0x8F12 # <CJK> -0x8F13 # <CJK> -0x8F14 # <CJK> -0x8F15 # <CJK> -0x8F19 # <CJK> -0x8F1B # <CJK> -0x8F1C # <CJK> 0x8F1D # <CJK> -0x8F1F # <CJK> -0x8F26 # <CJK> 0x8F29 # <CJK> 0x8F2A # <CJK> -0x8F2F # <CJK> -0x8F33 # <CJK> 0x8F38 # <CJK> -0x8F39 # <CJK> -0x8F3B # <CJK> -0x8F3E # <CJK> -0x8F3F # <CJK> -0x8F42 # <CJK> 0x8F44 # <CJK> -0x8F45 # <CJK> -0x8F46 # <CJK> -0x8F49 # <CJK> -0x8F4C # <CJK> -0x8F4D # <CJK> -0x8F4E # <CJK> -0x8F57 # <CJK> -0x8F5C # <CJK> -0x8F5F # <CJK> -0x8F61 # <CJK> -0x8F62 # <CJK> -0x8F63 # <CJK> -0x8F64 # <CJK> 0x8F9B # <CJK> -0x8F9C # <CJK> 0x8F9E # <CJK> -0x8F9F # <CJK> 0x8FA3 # <CJK> -0x8FA7 # <CJK> -0x8FA8 # <CJK> -0x8FAD # <CJK> -0x8FAE # <CJK> -0x8FAF # <CJK> -0x8FB0 # <CJK> 0x8FB1 # <CJK> 0x8FB2 # <CJK> -0x8FB7 # <CJK> 0x8FBA # <CJK> -0x8FBB # <CJK> 0x8FBC # <CJK> -0x8FBF # <CJK> -0x8FC2 # <CJK> -0x8FC4 # <CJK> 0x8FC5 # <CJK> 0x8FCE # <CJK> 0x8FD1 # <CJK> 0x8FD4 # <CJK> -0x8FDA # <CJK> -0x8FE2 # <CJK> -0x8FE5 # <CJK> -0x8FE6 # <CJK> -0x8FE9 # <CJK> -0x8FEA # <CJK> 0x8FEB # <CJK> 0x8FED # <CJK> -0x8FEF # <CJK> 0x8FF0 # <CJK> -0x8FF4 # <CJK> 0x8FF7 # <CJK> -0x8FF8 # <CJK> -0x8FF9 # <CJK> -0x8FFA # <CJK> 0x8FFD # <CJK> 0x9000 # <CJK> 0x9001 # <CJK> 0x9003 # <CJK> -0x9005 # <CJK> 0x9006 # <CJK> -0x900B # <CJK> -0x900D # <CJK> -0x900E # <CJK> 0x900F # <CJK> 0x9010 # <CJK> -0x9011 # <CJK> 0x9013 # <CJK> 0x9014 # <CJK> -0x9015 # <CJK> -0x9016 # <CJK> -0x9017 # <CJK> -0x9019 # <CJK> 0x901A # <CJK> 0x901D # <CJK> -0x901E # <CJK> 0x901F # <CJK> 0x9020 # <CJK> -0x9021 # <CJK> -0x9022 # <CJK> 0x9023 # <CJK> -0x9027 # <CJK> 0x902E # <CJK> 0x9031 # <CJK> 0x9032 # <CJK> -0x9035 # <CJK> -0x9036 # <CJK> 0x9038 # <CJK> -0x9039 # <CJK> -0x903C # <CJK> -0x903E # <CJK> -0x9041 # <CJK> 0x9042 # <CJK> 0x9045 # <CJK> 0x9047 # <CJK> -0x9049 # <CJK> 0x904A # <CJK> 0x904B # <CJK> 0x904D # <CJK> 0x904E # <CJK> -0x904F # <CJK> -0x9050 # <CJK> -0x9051 # <CJK> -0x9052 # <CJK> 0x9053 # <CJK> 0x9054 # <CJK> 0x9055 # <CJK> -0x9056 # <CJK> -0x9058 # <CJK> -0x9059 # <CJK> 0x905C # <CJK> -0x905E # <CJK> 0x9060 # <CJK> 0x9061 # <CJK> 0x9063 # <CJK> -0x9065 # <CJK> -0x9068 # <CJK> 0x9069 # <CJK> 0x906D # <CJK> 0x906E # <CJK> -0x906F # <CJK> -0x9072 # <CJK> 0x9075 # <CJK> -0x9076 # <CJK> 0x9077 # <CJK> 0x9078 # <CJK> 0x907A # <CJK> -0x907C # <CJK> -0x907D # <CJK> 0x907F # <CJK> -0x9080 # <CJK> -0x9081 # <CJK> -0x9082 # <CJK> -0x9083 # <CJK> 0x9084 # <CJK> -0x9087 # <CJK> -0x9089 # <CJK> -0x908A # <CJK> -0x908F # <CJK> -0x9091 # <CJK> 0x90A3 # <CJK> 0x90A6 # <CJK> -0x90A8 # <CJK> 0x90AA # <CJK> -0x90AF # <CJK> -0x90B1 # <CJK> -0x90B5 # <CJK> 0x90B8 # <CJK> -0x90C1 # <CJK> 0x90CA # <CJK> 0x90CE # <CJK> -0x90DB # <CJK> 0x90E1 # <CJK> -0x90E2 # <CJK> -0x90E4 # <CJK> 0x90E8 # <CJK> 0x90ED # <CJK> 0x90F5 # <CJK> 0x90F7 # <CJK> 0x90FD # <CJK> -0x9102 # <CJK> -0x9112 # <CJK> -0x9119 # <CJK> -0x912D # <CJK> -0x9130 # <CJK> -0x9132 # <CJK> -0x9149 # <CJK> -0x914A # <CJK> -0x914B # <CJK> 0x914C # <CJK> 0x914D # <CJK> 0x914E # <CJK> 0x9152 # <CJK> 0x9154 # <CJK> -0x9156 # <CJK> -0x9158 # <CJK> 0x9162 # <CJK> -0x9163 # <CJK> -0x9165 # <CJK> -0x9169 # <CJK> 0x916A # <CJK> 0x916C # <CJK> -0x9172 # <CJK> -0x9173 # <CJK> 0x9175 # <CJK> 0x9177 # <CJK> 0x9178 # <CJK> -0x9182 # <CJK> -0x9187 # <CJK> -0x9189 # <CJK> -0x918B # <CJK> -0x918D # <CJK> -0x9190 # <CJK> 0x9192 # <CJK> -0x9197 # <CJK> 0x919C # <CJK> -0x91A2 # <CJK> -0x91A4 # <CJK> -0x91AA # <CJK> -0x91AB # <CJK> -0x91AF # <CJK> -0x91B4 # <CJK> -0x91B5 # <CJK> 0x91B8 # <CJK> -0x91BA # <CJK> -0x91C0 # <CJK> -0x91C1 # <CJK> -0x91C6 # <CJK> 0x91C7 # <CJK> 0x91C8 # <CJK> -0x91C9 # <CJK> -0x91CB # <CJK> 0x91CC # <CJK> 0x91CD # <CJK> 0x91CE # <CJK> 0x91CF # <CJK> -0x91D0 # <CJK> 0x91D1 # <CJK> -0x91D6 # <CJK> -0x91D8 # <CJK> -0x91DB # <CJK> 0x91DC # <CJK> 0x91DD # <CJK> -0x91DF # <CJK> -0x91E1 # <CJK> 0x91E3 # <CJK> -0x91E6 # <CJK> -0x91E7 # <CJK> -0x91F5 # <CJK> -0x91F6 # <CJK> -0x91FC # <CJK> -0x91FF # <CJK> 0x920D # <CJK> -0x920E # <CJK> -0x9211 # <CJK> -0x9214 # <CJK> -0x9215 # <CJK> -0x921E # <CJK> -0x9229 # <CJK> -0x922C # <CJK> 0x9234 # <CJK> -0x9237 # <CJK> -0x923F # <CJK> 0x9244 # <CJK> -0x9245 # <CJK> -0x9248 # <CJK> -0x9249 # <CJK> -0x924B # <CJK> -0x9250 # <CJK> -0x9257 # <CJK> -0x925A # <CJK> 0x925B # <CJK> -0x925E # <CJK> 0x9262 # <CJK> -0x9264 # <CJK> -0x9266 # <CJK> 0x9271 # <CJK> -0x927E # <CJK> 0x9280 # <CJK> 0x9283 # <CJK> 0x9285 # <CJK> -0x9291 # <CJK> -0x9293 # <CJK> -0x9295 # <CJK> -0x9296 # <CJK> 0x9298 # <CJK> -0x929A # <CJK> -0x929B # <CJK> -0x929C # <CJK> 0x92AD # <CJK> -0x92B7 # <CJK> -0x92B9 # <CJK> -0x92CF # <CJK> -0x92D2 # <CJK> -0x92E4 # <CJK> -0x92E9 # <CJK> -0x92EA # <CJK> 0x92ED # <CJK> -0x92F2 # <CJK> 0x92F3 # <CJK> -0x92F8 # <CJK> -0x92FA # <CJK> 0x92FC # <CJK> -0x9306 # <CJK> -0x930F # <CJK> -0x9310 # <CJK> -0x9318 # <CJK> -0x9319 # <CJK> -0x931A # <CJK> 0x9320 # <CJK> -0x9322 # <CJK> -0x9323 # <CJK> 0x9326 # <CJK> -0x9328 # <CJK> -0x932B # <CJK> 0x932C # <CJK> 0x932E # <CJK> 0x932F # <CJK> 0x9332 # <CJK> -0x9335 # <CJK> -0x933A # <CJK> -0x933B # <CJK> -0x9344 # <CJK> 0x934B # <CJK> -0x934D # <CJK> -0x9354 # <CJK> -0x9356 # <CJK> 0x935B # <CJK> -0x935C # <CJK> -0x9360 # <CJK> -0x936C # <CJK> -0x936E # <CJK> 0x9375 # <CJK> -0x937C # <CJK> -0x937E # <CJK> 0x938C # <CJK> -0x9394 # <CJK> 0x9396 # <CJK> -0x9397 # <CJK> -0x939A # <CJK> -0x93A7 # <CJK> -0x93AC # <CJK> -0x93AD # <CJK> 0x93AE # <CJK> -0x93B0 # <CJK> -0x93B9 # <CJK> -0x93C3 # <CJK> -0x93C8 # <CJK> -0x93D0 # <CJK> -0x93D1 # <CJK> -0x93D6 # <CJK> -0x93D7 # <CJK> -0x93D8 # <CJK> -0x93DD # <CJK> 0x93E1 # <CJK> -0x93E4 # <CJK> -0x93E5 # <CJK> -0x93E8 # <CJK> -0x9403 # <CJK> -0x9407 # <CJK> -0x9410 # <CJK> -0x9413 # <CJK> -0x9414 # <CJK> 0x9418 # <CJK> -0x9419 # <CJK> -0x941A # <CJK> -0x9421 # <CJK> -0x942B # <CJK> -0x9435 # <CJK> -0x9436 # <CJK> -0x9438 # <CJK> -0x943A # <CJK> -0x9441 # <CJK> -0x9444 # <CJK> 0x9451 # <CJK> -0x9452 # <CJK> -0x9453 # <CJK> -0x945A # <CJK> -0x945B # <CJK> -0x945E # <CJK> -0x9460 # <CJK> -0x9462 # <CJK> -0x946A # <CJK> -0x9470 # <CJK> -0x9475 # <CJK> -0x9477 # <CJK> -0x947C # <CJK> -0x947D # <CJK> -0x947E # <CJK> -0x947F # <CJK> -0x9481 # <CJK> 0x9577 # <CJK> 0x9580 # <CJK> -0x9582 # <CJK> -0x9583 # <CJK> -0x9587 # <CJK> 0x9589 # <CJK> -0x958A # <CJK> 0x958B # <CJK> -0x958F # <CJK> 0x9591 # <CJK> 0x9593 # <CJK> -0x9594 # <CJK> -0x9596 # <CJK> -0x9598 # <CJK> -0x9599 # <CJK> -0x95A0 # <CJK> 0x95A2 # <CJK> 0x95A3 # <CJK> -0x95A4 # <CJK> 0x95A5 # <CJK> -0x95A7 # <CJK> -0x95A8 # <CJK> -0x95AD # <CJK> 0x95B2 # <CJK> -0x95B9 # <CJK> -0x95BB # <CJK> -0x95BC # <CJK> -0x95BE # <CJK> -0x95C3 # <CJK> 0x95C7 # <CJK> -0x95CA # <CJK> -0x95CC # <CJK> -0x95CD # <CJK> -0x95D4 # <CJK> -0x95D5 # <CJK> -0x95D6 # <CJK> 0x95D8 # <CJK> -0x95DC # <CJK> -0x95E1 # <CJK> -0x95E2 # <CJK> -0x95E5 # <CJK> 0x961C # <CJK> -0x9621 # <CJK> -0x9628 # <CJK> 0x962A # <CJK> -0x962E # <CJK> -0x962F # <CJK> 0x9632 # <CJK> 0x963B # <CJK> -0x963F # <CJK> -0x9640 # <CJK> -0x9642 # <CJK> 0x9644 # <CJK> -0x964B # <CJK> -0x964C # <CJK> 0x964D # <CJK> -0x964F # <CJK> 0x9650 # <CJK> 0x965B # <CJK> -0x965C # <CJK> -0x965D # <CJK> -0x965E # <CJK> -0x965F # <CJK> 0x9662 # <CJK> 0x9663 # <CJK> 0x9664 # <CJK> 0x9665 # <CJK> -0x9666 # <CJK> 0x966A # <CJK> -0x966C # <CJK> 0x9670 # <CJK> -0x9672 # <CJK> 0x9673 # <CJK> 0x9675 # <CJK> 0x9676 # <CJK> -0x9677 # <CJK> 0x9678 # <CJK> 0x967A # <CJK> 0x967D # <CJK> 0x9685 # <CJK> 0x9686 # <CJK> -0x9688 # <CJK> 0x968A # <CJK> -0x968B # <CJK> -0x968D # <CJK> 0x968E # <CJK> 0x968F # <CJK> 0x9694 # <CJK> -0x9695 # <CJK> -0x9697 # <CJK> -0x9698 # <CJK> 0x9699 # <CJK> 0x969B # <CJK> 0x969C # <CJK> 0x96A0 # <CJK> 0x96A3 # <CJK> -0x96A7 # <CJK> -0x96A8 # <CJK> -0x96AA # <CJK> -0x96B0 # <CJK> -0x96B1 # <CJK> -0x96B2 # <CJK> -0x96B4 # <CJK> -0x96B6 # <CJK> 0x96B7 # <CJK> -0x96B8 # <CJK> -0x96B9 # <CJK> 0x96BB # <CJK> -0x96BC # <CJK> -0x96C0 # <CJK> -0x96C1 # <CJK> 0x96C4 # <CJK> 0x96C5 # <CJK> 0x96C6 # <CJK> 0x96C7 # <CJK> -0x96C9 # <CJK> -0x96CB # <CJK> 0x96CC # <CJK> -0x96CD # <CJK> -0x96CE # <CJK> 0x96D1 # <CJK> -0x96D5 # <CJK> -0x96D6 # <CJK> -0x96D9 # <CJK> -0x96DB # <CJK> -0x96DC # <CJK> 0x96E2 # <CJK> 0x96E3 # <CJK> 0x96E8 # <CJK> 0x96EA # <CJK> -0x96EB # <CJK> 0x96F0 # <CJK> 0x96F2 # <CJK> 0x96F6 # <CJK> 0x96F7 # <CJK> -0x96F9 # <CJK> 0x96FB # <CJK> 0x9700 # <CJK> -0x9704 # <CJK> -0x9706 # <CJK> 0x9707 # <CJK> -0x9708 # <CJK> 0x970A # <CJK> -0x970D # <CJK> -0x970E # <CJK> -0x970F # <CJK> -0x9711 # <CJK> -0x9713 # <CJK> -0x9716 # <CJK> -0x9719 # <CJK> 0x971C # <CJK> -0x971E # <CJK> -0x9724 # <CJK> 0x9727 # <CJK> -0x972A # <CJK> -0x9730 # <CJK> 0x9732 # <CJK> -0x9738 # <CJK> -0x9739 # <CJK> -0x973D # <CJK> -0x973E # <CJK> -0x9742 # <CJK> -0x9744 # <CJK> -0x9746 # <CJK> -0x9748 # <CJK> -0x9749 # <CJK> 0x9752 # <CJK> -0x9756 # <CJK> 0x9759 # <CJK> -0x975C # <CJK> 0x975E # <CJK> -0x9760 # <CJK> -0x9761 # <CJK> 0x9762 # <CJK> -0x9764 # <CJK> -0x9766 # <CJK> -0x9768 # <CJK> 0x9769 # <CJK> -0x976B # <CJK> -0x976D # <CJK> -0x9771 # <CJK> 0x9774 # <CJK> -0x9779 # <CJK> -0x977A # <CJK> -0x977C # <CJK> -0x9781 # <CJK> -0x9784 # <CJK> -0x9785 # <CJK> -0x9786 # <CJK> -0x978B # <CJK> -0x978D # <CJK> -0x978F # <CJK> -0x9790 # <CJK> -0x9798 # <CJK> -0x979C # <CJK> -0x97A0 # <CJK> -0x97A3 # <CJK> -0x97A6 # <CJK> -0x97A8 # <CJK> -0x97AB # <CJK> -0x97AD # <CJK> -0x97B3 # <CJK> -0x97B4 # <CJK> -0x97C3 # <CJK> -0x97C6 # <CJK> -0x97C8 # <CJK> -0x97CB # <CJK> 0x97D3 # <CJK> -0x97DC # <CJK> -0x97ED # <CJK> -0x97EE # <CJK> -0x97F2 # <CJK> 0x97F3 # <CJK> -0x97F5 # <CJK> -0x97F6 # <CJK> 0x97FB # <CJK> 0x97FF # <CJK> -0x9801 # <CJK> 0x9802 # <CJK> 0x9803 # <CJK> 0x9805 # <CJK> 0x9806 # <CJK> 0x9808 # <CJK> -0x980C # <CJK> -0x980F # <CJK> 0x9810 # <CJK> 0x9811 # <CJK> 0x9812 # <CJK> 0x9813 # <CJK> -0x9817 # <CJK> 0x9818 # <CJK> -0x981A # <CJK> -0x9821 # <CJK> -0x9824 # <CJK> -0x982C # <CJK> 0x982D # <CJK> -0x9834 # <CJK> -0x9837 # <CJK> -0x9838 # <CJK> +#0x9830 # <CJK> # not in DroidSansJapanese 0x983B # <CJK> 0x983C # <CJK> -0x983D # <CJK> -0x9846 # <CJK> -0x984B # <CJK> 0x984C # <CJK> 0x984D # <CJK> 0x984E # <CJK> -0x984F # <CJK> 0x9854 # <CJK> 0x9855 # <CJK> 0x9858 # <CJK> -0x985B # <CJK> 0x985E # <CJK> 0x9867 # <CJK> -0x986B # <CJK> -0x986F # <CJK> -0x9870 # <CJK> -0x9871 # <CJK> -0x9873 # <CJK> -0x9874 # <CJK> 0x98A8 # <CJK> -0x98AA # <CJK> -0x98AF # <CJK> -0x98B1 # <CJK> -0x98B6 # <CJK> -0x98C3 # <CJK> -0x98C4 # <CJK> -0x98C6 # <CJK> 0x98DB # <CJK> -0x98DC # <CJK> 0x98DF # <CJK> 0x98E2 # <CJK> -0x98E9 # <CJK> -0x98EB # <CJK> -0x98ED # <CJK> -0x98EE # <CJK> 0x98EF # <CJK> 0x98F2 # <CJK> -0x98F4 # <CJK> 0x98FC # <CJK> 0x98FD # <CJK> 0x98FE # <CJK> -0x9903 # <CJK> 0x9905 # <CJK> -0x9909 # <CJK> 0x990A # <CJK> 0x990C # <CJK> -0x9910 # <CJK> -0x9912 # <CJK> 0x9913 # <CJK> -0x9914 # <CJK> -0x9918 # <CJK> -0x991D # <CJK> -0x991E # <CJK> -0x9920 # <CJK> -0x9921 # <CJK> -0x9924 # <CJK> 0x9928 # <CJK> -0x992C # <CJK> -0x992E # <CJK> -0x993D # <CJK> -0x993E # <CJK> -0x9942 # <CJK> -0x9945 # <CJK> -0x9949 # <CJK> -0x994B # <CJK> -0x994C # <CJK> -0x9950 # <CJK> -0x9951 # <CJK> -0x9952 # <CJK> -0x9955 # <CJK> -0x9957 # <CJK> 0x9996 # <CJK> -0x9997 # <CJK> -0x9998 # <CJK> 0x9999 # <CJK> -0x99A5 # <CJK> -0x99A8 # <CJK> 0x99AC # <CJK> -0x99AD # <CJK> -0x99AE # <CJK> -0x99B3 # <CJK> -0x99B4 # <CJK> -0x99BC # <CJK> -0x99C1 # <CJK> 0x99C4 # <CJK> 0x99C5 # <CJK> 0x99C6 # <CJK> -0x99C8 # <CJK> 0x99D0 # <CJK> -0x99D1 # <CJK> 0x99D2 # <CJK> -0x99D5 # <CJK> -0x99D8 # <CJK> -0x99DB # <CJK> -0x99DD # <CJK> -0x99DF # <CJK> -0x99E2 # <CJK> -0x99ED # <CJK> -0x99EE # <CJK> -0x99F1 # <CJK> -0x99F2 # <CJK> -0x99F8 # <CJK> -0x99FB # <CJK> -0x99FF # <CJK> -0x9A01 # <CJK> -0x9A05 # <CJK> 0x9A0E # <CJK> -0x9A0F # <CJK> 0x9A12 # <CJK> 0x9A13 # <CJK> -0x9A19 # <CJK> -0x9A28 # <CJK> -0x9A2B # <CJK> 0x9A30 # <CJK> -0x9A37 # <CJK> -0x9A3E # <CJK> -0x9A40 # <CJK> -0x9A42 # <CJK> -0x9A43 # <CJK> -0x9A45 # <CJK> -0x9A4D # <CJK> -0x9A55 # <CJK> -0x9A57 # <CJK> 0x9A5A # <CJK> -0x9A5B # <CJK> -0x9A5F # <CJK> -0x9A62 # <CJK> -0x9A64 # <CJK> -0x9A65 # <CJK> -0x9A69 # <CJK> -0x9A6A # <CJK> -0x9A6B # <CJK> 0x9AA8 # <CJK> -0x9AAD # <CJK> -0x9AB0 # <CJK> 0x9AB8 # <CJK> -0x9ABC # <CJK> -0x9AC0 # <CJK> 0x9AC4 # <CJK> -0x9ACF # <CJK> -0x9AD1 # <CJK> -0x9AD3 # <CJK> -0x9AD4 # <CJK> 0x9AD8 # <CJK> -0x9ADE # <CJK> -0x9ADF # <CJK> -0x9AE2 # <CJK> -0x9AE3 # <CJK> -0x9AE6 # <CJK> 0x9AEA # <CJK> -0x9AEB # <CJK> -0x9AED # <CJK> -0x9AEE # <CJK> -0x9AEF # <CJK> -0x9AF1 # <CJK> -0x9AF4 # <CJK> -0x9AF7 # <CJK> -0x9AFB # <CJK> -0x9B06 # <CJK> -0x9B18 # <CJK> -0x9B1A # <CJK> -0x9B1F # <CJK> -0x9B22 # <CJK> -0x9B23 # <CJK> -0x9B25 # <CJK> -0x9B27 # <CJK> -0x9B28 # <CJK> -0x9B29 # <CJK> -0x9B2A # <CJK> -0x9B2E # <CJK> -0x9B2F # <CJK> 0x9B31 # <CJK> -0x9B32 # <CJK> -0x9B3B # <CJK> 0x9B3C # <CJK> -0x9B41 # <CJK> 0x9B42 # <CJK> -0x9B43 # <CJK> -0x9B44 # <CJK> 0x9B45 # <CJK> -0x9B4D # <CJK> -0x9B4E # <CJK> -0x9B4F # <CJK> -0x9B51 # <CJK> 0x9B54 # <CJK> -0x9B58 # <CJK> 0x9B5A # <CJK> -0x9B6F # <CJK> -0x9B74 # <CJK> -0x9B83 # <CJK> -0x9B8E # <CJK> -0x9B91 # <CJK> -0x9B92 # <CJK> -0x9B93 # <CJK> -0x9B96 # <CJK> -0x9B97 # <CJK> -0x9B9F # <CJK> -0x9BA0 # <CJK> -0x9BA8 # <CJK> -0x9BAA # <CJK> -0x9BAB # <CJK> -0x9BAD # <CJK> 0x9BAE # <CJK> -0x9BB4 # <CJK> -0x9BB9 # <CJK> -0x9BC0 # <CJK> -0x9BC6 # <CJK> -0x9BC9 # <CJK> -0x9BCA # <CJK> -0x9BCF # <CJK> -0x9BD1 # <CJK> -0x9BD2 # <CJK> -0x9BD4 # <CJK> -0x9BD6 # <CJK> -0x9BDB # <CJK> -0x9BE1 # <CJK> -0x9BE2 # <CJK> -0x9BE3 # <CJK> -0x9BE4 # <CJK> 0x9BE8 # <CJK> -0x9BF0 # <CJK> -0x9BF1 # <CJK> -0x9BF2 # <CJK> -0x9BF5 # <CJK> -0x9C04 # <CJK> -0x9C06 # <CJK> -0x9C08 # <CJK> -0x9C09 # <CJK> -0x9C0A # <CJK> -0x9C0C # <CJK> -0x9C0D # <CJK> -0x9C10 # <CJK> -0x9C12 # <CJK> -0x9C13 # <CJK> -0x9C14 # <CJK> -0x9C15 # <CJK> -0x9C1B # <CJK> -0x9C21 # <CJK> -0x9C24 # <CJK> -0x9C25 # <CJK> -0x9C2D # <CJK> -0x9C2E # <CJK> -0x9C2F # <CJK> -0x9C30 # <CJK> -0x9C32 # <CJK> -0x9C39 # <CJK> -0x9C3A # <CJK> -0x9C3B # <CJK> -0x9C3E # <CJK> -0x9C46 # <CJK> -0x9C47 # <CJK> -0x9C48 # <CJK> -0x9C52 # <CJK> -0x9C57 # <CJK> -0x9C5A # <CJK> -0x9C60 # <CJK> -0x9C67 # <CJK> -0x9C76 # <CJK> -0x9C78 # <CJK> 0x9CE5 # <CJK> -0x9CE7 # <CJK> -0x9CE9 # <CJK> -0x9CEB # <CJK> -0x9CEC # <CJK> -0x9CF0 # <CJK> -0x9CF3 # <CJK> 0x9CF4 # <CJK> -0x9CF6 # <CJK> -0x9D03 # <CJK> -0x9D06 # <CJK> -0x9D07 # <CJK> -0x9D08 # <CJK> -0x9D09 # <CJK> -0x9D0E # <CJK> -0x9D12 # <CJK> -0x9D15 # <CJK> -0x9D1B # <CJK> -0x9D1F # <CJK> -0x9D23 # <CJK> -0x9D26 # <CJK> -0x9D28 # <CJK> -0x9D2A # <CJK> -0x9D2B # <CJK> -0x9D2C # <CJK> -0x9D3B # <CJK> -0x9D3E # <CJK> -0x9D3F # <CJK> -0x9D41 # <CJK> -0x9D44 # <CJK> -0x9D46 # <CJK> -0x9D48 # <CJK> -0x9D50 # <CJK> -0x9D51 # <CJK> -0x9D59 # <CJK> -0x9D5C # <CJK> -0x9D5D # <CJK> -0x9D5E # <CJK> -0x9D60 # <CJK> -0x9D61 # <CJK> -0x9D64 # <CJK> -0x9D6C # <CJK> -0x9D6F # <CJK> -0x9D72 # <CJK> -0x9D7A # <CJK> -0x9D87 # <CJK> -0x9D89 # <CJK> 0x9D8F # <CJK> -0x9D9A # <CJK> -0x9DA4 # <CJK> -0x9DA9 # <CJK> -0x9DAB # <CJK> -0x9DAF # <CJK> -0x9DB2 # <CJK> 0x9DB4 # <CJK> -0x9DB8 # <CJK> -0x9DBA # <CJK> -0x9DBB # <CJK> -0x9DC1 # <CJK> -0x9DC2 # <CJK> -0x9DC4 # <CJK> -0x9DC6 # <CJK> -0x9DCF # <CJK> -0x9DD3 # <CJK> -0x9DD9 # <CJK> -0x9DE6 # <CJK> -0x9DED # <CJK> -0x9DEF # <CJK> -0x9DF2 # <CJK> -0x9DF8 # <CJK> -0x9DF9 # <CJK> -0x9DFA # <CJK> -0x9DFD # <CJK> -0x9E1A # <CJK> -0x9E1B # <CJK> -0x9E1E # <CJK> -0x9E75 # <CJK> -0x9E78 # <CJK> -0x9E79 # <CJK> -0x9E7D # <CJK> 0x9E7F # <CJK> -0x9E81 # <CJK> -0x9E88 # <CJK> -0x9E8B # <CJK> -0x9E8C # <CJK> -0x9E91 # <CJK> -0x9E92 # <CJK> 0x9E93 # <CJK> -0x9E95 # <CJK> 0x9E97 # <CJK> -0x9E9D # <CJK> -0x9E9F # <CJK> -0x9EA5 # <CJK> 0x9EA6 # <CJK> -0x9EA9 # <CJK> -0x9EAA # <CJK> -0x9EAD # <CJK> -0x9EB8 # <CJK> -0x9EB9 # <CJK> 0x9EBA # <CJK> 0x9EBB # <CJK> -0x9EBC # <CJK> -0x9EBE # <CJK> -0x9EBF # <CJK> 0x9EC4 # <CJK> -0x9ECC # <CJK> -0x9ECD # <CJK> -0x9ECE # <CJK> -0x9ECF # <CJK> -0x9ED0 # <CJK> 0x9ED2 # <CJK> -0x9ED4 # <CJK> -0x9ED8 # <CJK> 0x9ED9 # <CJK> -0x9EDB # <CJK> -0x9EDC # <CJK> -0x9EDD # <CJK> -0x9EDE # <CJK> -0x9EE0 # <CJK> -0x9EE5 # <CJK> -0x9EE8 # <CJK> -0x9EEF # <CJK> -0x9EF4 # <CJK> -0x9EF6 # <CJK> -0x9EF7 # <CJK> -0x9EF9 # <CJK> -0x9EFB # <CJK> -0x9EFC # <CJK> -0x9EFD # <CJK> -0x9F07 # <CJK> -0x9F08 # <CJK> -0x9F0E # <CJK> 0x9F13 # <CJK> -0x9F15 # <CJK> -0x9F20 # <CJK> -0x9F21 # <CJK> -0x9F2C # <CJK> 0x9F3B # <CJK> -0x9F3E # <CJK> -0x9F4A # <CJK> -0x9F4B # <CJK> -0x9F4E # <CJK> -0x9F4F # <CJK> -0x9F52 # <CJK> -0x9F54 # <CJK> -0x9F5F # <CJK> -0x9F60 # <CJK> -0x9F61 # <CJK> 0x9F62 # <CJK> -0x9F63 # <CJK> -0x9F66 # <CJK> -0x9F67 # <CJK> -0x9F6A # <CJK> -0x9F6C # <CJK> -0x9F72 # <CJK> -0x9F76 # <CJK> -0x9F77 # <CJK> -0x9F8D # <CJK> -0x9F95 # <CJK> -0x9F9C # <CJK> -0x9F9D # <CJK> -0x9FA0 # <CJK> -#0xFFE5 # FULLWIDTH YEN SIGN +#0x20B9F # <CJK> diff --git a/mesalib/common.py b/mesalib/common.py index 22c172571..d6e621545 100644 --- a/mesalib/common.py +++ b/mesalib/common.py @@ -91,6 +91,7 @@ def AddOptions(opts): opts.Add(EnumOption('platform', 'target platform', host_platform, allowed_values=('cygwin', 'darwin', 'freebsd', 'haiku', 'linux', 'sunos', 'windows'))) opts.Add(BoolOption('embedded', 'embedded build', 'no')) + opts.Add(BoolOption('analyze', 'enable static code analysis where available', 'no')) opts.Add('toolchain', 'compiler toolchain', default_toolchain) opts.Add(BoolOption('gles', 'EXPERIMENTAL: enable OpenGL ES support', 'no')) opts.Add(BoolOption('llvm', 'use LLVM', default_llvm)) diff --git a/mesalib/docs/index.html b/mesalib/docs/index.html index 3342747e7..186bda28c 100644 --- a/mesalib/docs/index.html +++ b/mesalib/docs/index.html @@ -16,6 +16,23 @@ <h1>News</h1> +<h2>April 18, 2014</h2> +<p> +<a href="relnotes/10.1.1.html">Mesa 10.1.1</a> is released. +This is a bug-fix release. +</p> + +<h2>April 18, 2014</h2> +<p> +<a href="relnotes/10.0.5.html">Mesa 10.0.5</a> is released. +This is a bug-fix release. +<br> +NOTE: Since the 10.1.1 release is being released concurrently, it is +anticipated that 10.0.5 will be the final release in the 10.0 +series. Users of 10.0 are encouraged to migrate to the 10.1 series in +order to obtain future fixes. +</p> + <h2>March 12, 2014</h2> <p> <a href="relnotes/10.0.4.html">Mesa 10.0.4</a> is released. diff --git a/mesalib/docs/relnotes.html b/mesalib/docs/relnotes.html index 7ec7296fc..4e2b7d6ff 100644 --- a/mesalib/docs/relnotes.html +++ b/mesalib/docs/relnotes.html @@ -21,7 +21,9 @@ The release notes summarize what's new or changed in each Mesa release. </p> <ul> +<li><a href="relnotes/10.1.1html">10.1.1 release notes</a> <li><a href="relnotes/10.1.html">10.1 release notes</a> +<li><a href="relnotes/10.0.5.html">10.0.5 release notes</a> <li><a href="relnotes/10.0.4.html">10.0.4 release notes</a> <li><a href="relnotes/10.0.3.html">10.0.3 release notes</a> <li><a href="relnotes/10.0.2.html">10.0.2 release notes</a> diff --git a/mesalib/docs/relnotes/10.0.5.html b/mesalib/docs/relnotes/10.0.5.html new file mode 100644 index 000000000..3e08ee1ed --- /dev/null +++ b/mesalib/docs/relnotes/10.0.5.html @@ -0,0 +1,173 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html lang="en"> +<head> + <meta http-equiv="content-type" content="text/html; charset=utf-8"> + <title>Mesa Release Notes</title> + <link rel="stylesheet" type="text/css" href="../mesa.css"> +</head> +<body> + +<div class="header"> + <h1>The Mesa 3D Graphics Library</h1> +</div> + +<iframe src="../contents.html"></iframe> +<div class="content"> + +<h1>Mesa 10.0.5 Release Notes / April 18, 2014</h1> + +<p> +Mesa 10.0.5 is a bug fix release which fixes bugs found since the 10.0.4 release. +</p> +<p> +Mesa 10.0.5 implements the OpenGL 3.3 API, but the version reported by +glGetString(GL_VERSION) or glGetIntegerv(GL_MAJOR_VERSION) / +glGetIntegerv(GL_MINOR_VERSION) depends on the particular driver being used. +Some drivers don't support all the features required in OpenGL 3.3. OpenGL +3.3 is <strong>only</strong> available if requested at context creation +because compatibility contexts not supported. +</p> + + +<h2>MD5 checksums</h2> +<pre> +db606aadd0fe321f3664099677d159bc MesaLib-10.0.5.tar.gz +e6009ccd8898d7104bb325b6af9ec354 MesaLib-10.0.5.tar.bz2 +c8ab9e502542bf32299a4df85b0b704d MesaLib-10.0.5.zip +</pre> + + +<h2>New features</h2> +<p>None</p> + +<h2>Bug fixes</h2> + +<p>This list is likely incomplete.</p> + +<ul> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=58660">Bug 58660</a> - CAYMAN broken with HyperZ on</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=64471">Bug 64471</a> - Radeon HD6570 lockup in Brütal Legend with HyperZ</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=66352">Bug 66352</a> - GPU lockup in L4D2 on TURKS with HyperZ</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=68799">Bug 68799</a> - [APITRACE] Hyper-Z lockup with Falcon BMS 4.32u6 on CAYMAN</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=71547">Bug 71547</a> - compilation failure :#error "SSE4.1 instruction set not enabled"</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=72685">Bug 72685</a> - [radeonsi hyperz] Artifacts in Unigine Sanctuary</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=73088">Bug 73088</a> - [HyperZ] Juniper (6770): Gone Home / Unigine Heaven 4.0 lock up system after several minutes of use</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=74428">Bug 74428</a> - hyperz causes gpu hang in Counter-strike: Source</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=74803">Bug 74803</a> - [r600g] HyperZ broken on RV630 (Cogs shadows are broken)</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=74863">Bug 74863</a> - [r600g] HyperZ broken on RV770 and CYPRESS (Left 4 Dead 2 trees corruption) bisected!</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=74892">Bug 74892</a> - HyperZ GPU lockup with radeonsi 7970M PITCAIRN and Distance Alpha game</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=74988">Bug 74988</a> - Buffer overrun (segfault) decompressing ETC2 texture in GLBenchmark 3.0 Manhattan</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=75279">Bug 75279</a> - XCloseDisplay() takes one minute around nouveau_dri.so, freezing Firefox startup</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=77102">Bug 77102</a> - gallium nouveau has no profile in vdpau and libva</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=77207">Bug 77207</a> - [ivb/hsw] batch overwritten with garbage</li> + +</ul> + +<h2>Changes</h2> + +<p>The full set of changes can be viewed by using the following git command:</p> + +<pre> + git log mesa-10.0.4..mesa-10.0.5 +</pre> + +<p>Alex Deucher (1):</p> +<ul> + <li>radeon: reverse DBG_NO_HYPERZ logic</li> +</ul> + +<p>Brian Paul (9):</p> +<ul> + <li>mesa: add unpacking code for MESA_FORMAT_Z32_FLOAT_S8X24_UINT</li> + <li>mesa: fix copy & paste bugs in pack_ubyte_SARGB8()</li> + <li>mesa: fix copy & paste bugs in pack_ubyte_SRGB8()</li> + <li>mesa: fix unpack_Z32_FLOAT_X24S8() / unpack_Z32_FLOAT() mix-up</li> + <li>st/mesa: add null pointer checking in query object functions</li> + <li>mesa: fix glMultiDrawArrays inside a display list</li> + <li>cso: fix sampler view count in cso_set_sampler_views()</li> + <li>svga: replace sampler assertion with conditional</li> + <li>svga: move LIST_INITHEAD(dirty_buffers) earlier in svga_context_create()</li> +</ul> + +<p>Carl Worth (3):</p> +<ul> + <li>docs: Add md5sums for the 10.0.4 release.</li> + <li>Ignore patches which don't apply.</li> + <li>Update version to 10.0.5</li> +</ul> + +<p>Christian König (2):</p> +<ul> + <li>st/mesa: recreate sampler view on context change v3</li> + <li>st/mesa: fix sampler view handling with shared textures v4</li> +</ul> + +<p>Courtney Goeltzenleuchter (1):</p> +<ul> + <li>mesa: add bounds checking to eliminate buffer overrun</li> +</ul> + +<p>Emil Velikov (2):</p> +<ul> + <li>mesa: return v.value_int64 when the requested type is TYPE_INT64</li> + <li>glx: drop obsolete _XUnlock_Mutex in __glXInitialize error path</li> +</ul> + +<p>Eric Anholt (1):</p> +<ul> + <li>i965: Fix buffer overruns in MSAA MCS buffer clearing.</li> +</ul> + +<p>Ilia Mirkin (6):</p> +<ul> + <li>nouveau: fix fence waiting logic in screen destroy</li> + <li>nv50: adjust blit_3d handling of ms output textures</li> + <li>mesa/main: condition GL_DEPTH_STENCIL on ARB_depth_texture</li> + <li>nouveau: add forgotten GL_COMPRESSED_INTENSITY to texture format list</li> + <li>nouveau: there may not have been a texture if the fbo was incomplete</li> + <li>nouveau: fix firmware check on nvd7/nvd9</li> +</ul> + +<p>Johannes Nixdorf (1):</p> +<ul> + <li>configure.ac: fix the detection of expat with pkg-config</li> +</ul> + +<p>Jonathan Gray (1):</p> +<ul> + <li>gallium: add endian detection for OpenBSD</li> +</ul> + +<p>José Fonseca (1):</p> +<ul> + <li>draw: Duplicate TGSI tokens in draw_pipe_pstipple module.</li> +</ul> + +<p>Matt Turner (1):</p> +<ul> + <li>mesa: Wrap SSE4.1 code in #ifdef __SSE4_1__.</li> +</ul> + +<p>Paul Berry (1):</p> +<ul> + <li>i965/gen7: Prefer vertical alignment of 4 when possible.</li> +</ul> + +</div> +</body> +</html> diff --git a/mesalib/docs/relnotes/10.1.1.html b/mesalib/docs/relnotes/10.1.1.html new file mode 100644 index 000000000..88997485b --- /dev/null +++ b/mesalib/docs/relnotes/10.1.1.html @@ -0,0 +1,254 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html lang="en"> +<head> + <meta http-equiv="content-type" content="text/html; charset=utf-8"> + <title>Mesa Release Notes</title> + <link rel="stylesheet" type="text/css" href="../mesa.css"> +</head> +<body> + +<div class="header"> + <h1>The Mesa 3D Graphics Library</h1> +</div> + +<iframe src="../contents.html"></iframe> +<div class="content"> + +<h1>Mesa 10.1.1 Release Notes / April 18, 2014</h1> + +<p> +Mesa 10.1.1 is a bug fix release which fixes bugs found since the 10.1 release. +</p> +<p> +Mesa 10.1.1 implements the OpenGL 3.3 API, but the version reported by +glGetString(GL_VERSION) or glGetIntegerv(GL_MAJOR_VERSION) / +glGetIntegerv(GL_MINOR_VERSION) depends on the particular driver being used. +Some drivers don't support all the features required in OpenGL 3.3. OpenGL +3.3 is <strong>only</strong> available if requested at context creation +because compatibility contexts are not supported. +</p> + + +<h2>MD5 checksums</h2> +<pre> +96e63674ccfa98e7ec6eb4fee3f770c3 MesaLib-10.1.1.tar.gz +1fde7ed079df7aeb9b6a744ca033de8d MesaLib-10.1.1.tar.bz2 +e64d0a562638664b13d2edf22321df59 MesaLib-10.1.1.zip +</pre> + + +<h2>New features</h2> +<p>None</p> + +<h2>Bug fixes</h2> + +<ul> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=71547">Bug 71547</a> - compilation failure :#error "SSE4.1 instruction set not enabled"</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=74868">Bug 74868</a> - r600g: Diablo III Crashes After a few minutes</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=74988">Bug 74988</a> - Buffer overrun (segfault) decompressing ETC2 texture in GLBenchmark 3.0 Manhattan</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=75279">Bug 75279</a> - XCloseDisplay() takes one minute around nouveau_dri.so, freezing Firefox startup</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=75543">Bug 75543</a> - OSMesa Gallium OSMesaMakeCurrent</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=75660">Bug 75660</a> - u_inlines.h:277:pipe_buffer_map_range: Assertion `length' failed.</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=76323">Bug 76323</a> - GLSL compiler ignores layout(binding=N) on uniform blocks</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=76377">Bug 76377</a> - DRI3 should only be enabled on Linux due to a udev dependency</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=76749">Bug 76749</a> - [HSW] DOTA world lighting has no effect</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=77102">Bug 77102</a> - gallium nouveau has no profile in vdpau and libva</li> + +<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=77207">Bug 77207</a> - [ivb/hsw] batch overwritten with garbage</li> + +</ul> + +<h2>Changes</h2> + +<p>Aaron Watry (1):</p> +<ul> + <li>gallium/util: Fix memory leak</li> +</ul> + +<p>Alexander von Gluck IV (1):</p> +<ul> + <li>haiku: Fix build through scons corrections and viewport fixes</li> +</ul> + +<p>Anuj Phogat (2):</p> +<ul> + <li>mesa: Set initial internal format of a texture to GL_RGBA</li> + <li>mesa: Allow GL_DEPTH_COMPONENT and GL_DEPTH_STENCIL combinations in glTexImage{123}D()</li> +</ul> + +<p>Brian Paul (12):</p> +<ul> + <li>softpipe: use 64-bit arithmetic in softpipe_resource_layout()</li> + <li>mesa: don't call ctx->Driver.ClearBufferSubData() if size==0</li> + <li>st/osmesa: check buffer size when searching for buffers</li> + <li>mesa: fix copy & paste bugs in pack_ubyte_SARGB8()</li> + <li>mesa: fix copy & paste bugs in pack_ubyte_SRGB8()</li> + <li>c11/threads: don't include assert.h if the assert macro is already defined</li> + <li>mesa: fix unpack_Z32_FLOAT_X24S8() / unpack_Z32_FLOAT() mix-up</li> + <li>st/mesa: add null pointer checking in query object functions</li> + <li>mesa: fix glMultiDrawArrays inside a display list</li> + <li>cso: fix sampler view count in cso_set_sampler_views()</li> + <li>svga: replace sampler assertion with conditional</li> + <li>svga: move LIST_INITHEAD(dirty_buffers) earlier in svga_context_create()</li> +</ul> + +<p>Carl Worth (3):</p> +<ul> + <li>cherry-ignore: Ignore a few patches</li> + <li>glsl: Allow explicit binding on atomics again</li> + <li>Update VERSION to 10.1.1</li> +</ul> + +<p>Chia-I Wu (1):</p> +<ul> + <li>i965/vec4: fix record clearing in copy propagation</li> +</ul> + +<p>Christian König (2):</p> +<ul> + <li>st/mesa: recreate sampler view on context change v3</li> + <li>st/mesa: fix sampler view handling with shared textures v4</li> +</ul> + +<p>Courtney Goeltzenleuchter (1):</p> +<ul> + <li>mesa: add bounds checking to eliminate buffer overrun</li> +</ul> + +<p>Emil Velikov (5):</p> +<ul> + <li>nv50: add missing brackets when handling the samplers array</li> + <li>mesa: return v.value_int64 when the requested type is TYPE_INT64</li> + <li>configure: enable dri3 only for linux</li> + <li>glx: drop obsolete _XUnlock_Mutex in __glXInitialize error path</li> + <li>configure: cleanup libudev handling</li> +</ul> + +<p>Eric Anholt (1):</p> +<ul> + <li>i965: Fix buffer overruns in MSAA MCS buffer clearing.</li> +</ul> + +<p>Hans (2):</p> +<ul> + <li>util: don't define isfinite(), isnan() for MSVC >= 1800</li> + <li>mesa: don't define c99 math functions for MSVC >= 1800</li> +</ul> + +<p>Ian Romanick (7):</p> +<ul> + <li>linker: Split set_uniform_binding into separate functions for blocks and samplers</li> + <li>linker: Various trivial clean-ups in set_sampler_binding</li> + <li>linker: Fold set_uniform_binding into call site</li> + <li>linker: Clean up "unused parameter" warnings</li> + <li>linker: Set block bindings based on UniformBlocks rather than UniformStorage</li> + <li>linker: Set binding for all elements of UBO array</li> + <li>glsl: Propagate explicit binding information from the AST all the way to the linker</li> +</ul> + +<p>Ilia Mirkin (8):</p> +<ul> + <li>nouveau: fix fence waiting logic in screen destroy</li> + <li>nv50: adjust blit_3d handling of ms output textures</li> + <li>loader: add special logic to distinguish nouveau from nouveau_vieux</li> + <li>mesa/main: condition GL_DEPTH_STENCIL on ARB_depth_texture</li> + <li>nouveau: add forgotten GL_COMPRESSED_INTENSITY to texture format list</li> + <li>nouveau: there may not have been a texture if the fbo was incomplete</li> + <li>nvc0/ir: move sample id to second source arg to fix sampler2DMS</li> + <li>nouveau: fix firmware check on nvd7/nvd9</li> +</ul> + +<p>Johannes Nixdorf (1):</p> +<ul> + <li>configure.ac: fix the detection of expat with pkg-config</li> +</ul> + +<p>Jonathan Gray (7):</p> +<ul> + <li>gallium: add endian detection for OpenBSD</li> + <li>loader: use 0 instead of FALSE which isn't defined</li> + <li>loader: don't limit the non-udev path to only android</li> + <li>megadriver_stub.c: don't use _GNU_SOURCE to gate the compat code</li> + <li>egl/dri2: don't require libudev to build drm/wayland platforms</li> + <li>egl/dri2: use drm macros to construct device name</li> + <li>configure: don't require libudev for gbm or egl drm/wayland</li> +</ul> + +<p>José Fonseca (4):</p> +<ul> + <li>c11/threads: Fix nano to milisecond conversion.</li> + <li>mapi/u_thread: Use GetCurrentThreadId</li> + <li>c11/threads: Don't implement thrd_current on Windows.</li> + <li>draw: Duplicate TGSI tokens in draw_pipe_pstipple module.</li> +</ul> + +<p>Kenneth Graunke (4):</p> +<ul> + <li>i965/fs: Fix register comparisons in saturate propagation.</li> + <li>glsl: Fix lack of i2u in lower_ubo_reference.</li> + <li>i965: Stop advertising GL_MESA_ycbcr_texture.</li> + <li>glsl: Try vectorizing when seeing a repeated assignment to a channel.</li> +</ul> + +<p>Marek Olšák (13):</p> +<ul> + <li>r600g: fix texelFetchOffset GLSL functions</li> + <li>r600g: fix blitting the last 2 mipmap levels for Evergreen</li> + <li>mesa: fix the format of glEdgeFlagPointer</li> + <li>r600g,radeonsi: fix MAX_TEXTURE_3D_LEVELS and MAX_TEXTURE_ARRAY_LAYERS limits</li> + <li>st/mesa: fix per-vertex edge flags and GLSL support (v2)</li> + <li>mesa: mark GL_RGB9_E5 as not color-renderable</li> + <li>mesa: fix texture border handling for cube arrays</li> + <li>mesa: allow generating mipmaps for cube arrays</li> + <li>mesa: fix software fallback for generating mipmaps for cube arrays</li> + <li>mesa: fix software fallback for generating mipmaps for 3D textures</li> + <li>st/mesa: fix generating mipmaps for cube arrays</li> + <li>st/mesa: drop the lowering of quad strips to triangle strips</li> + <li>r600g: implement edge flags</li> +</ul> + +<p>Matt Turner (4):</p> +<ul> + <li>mesa: Wrap SSE4.1 code in #ifdef __SSE4_1__.</li> + <li>i965/fs: Fix off-by-one in saturate propagation.</li> + <li>i965/fs: Don't propagate saturate modifiers into partial writes.</li> + <li>i965/fs: Don't propagate saturation modifiers if there are source modifiers.</li> +</ul> + +<p>Michel Dänzer (1):</p> +<ul> + <li>r600g: Don't leak bytecode on shader compile failure</li> +</ul> + +<p>Mike Stroyan (1):</p> +<ul> + <li>i965: Avoid dependency hints on math opcodes</li> +</ul> + +<p>Thomas Hellstrom (5):</p> +<ul> + <li>winsys/svga: Replace the query mm buffer pool with a slab pool v3</li> + <li>winsys/svga: Update the vmwgfx_drm.h header to latest version from kernel</li> + <li>winsys/svga: Fix prime surface references also for guest-backed surfaces</li> + <li>st/xa: Bind destination before setting new state</li> + <li>st/xa: Make sure unused samplers are set to NULL</li> +</ul> + +<p>Tom Stellard (1):</p> +<ul> + <li>configure: Use LLVM shared libraries by default</li> +</ul> + +</div> +</body> +</html> diff --git a/mesalib/include/GL/glext.h b/mesalib/include/GL/glext.h index 62bae4c4a..a626580bc 100644 --- a/mesalib/include/GL/glext.h +++ b/mesalib/include/GL/glext.h @@ -6,7 +6,7 @@ extern "C" { #endif /* -** Copyright (c) 2013 The Khronos Group Inc. +** Copyright (c) 2013-2014 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the @@ -33,7 +33,7 @@ extern "C" { ** used to make the header, and the header can be found at ** http://www.opengl.org/registry/ ** -** Khronos $Revision: 24502 $ on $Date: 2013-12-12 13:14:39 -0800 (Thu, 12 Dec 2013) $ +** Khronos $Revision: 25853 $ on $Date: 2014-03-13 03:40:45 -0700 (Thu, 13 Mar 2014) $ */ #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) @@ -53,7 +53,7 @@ extern "C" { #define GLAPI extern #endif -#define GL_GLEXT_VERSION 20131212 +#define GL_GLEXT_VERSION 20140313 /* Generated C header for: * API: gl @@ -1485,7 +1485,7 @@ typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum atta typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); @@ -1505,7 +1505,7 @@ GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLui GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); -GLAPI void APIENTRY glSampleMaski (GLuint index, GLbitfield mask); +GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); #endif #endif /* GL_VERSION_3_2 */ @@ -7080,6 +7080,10 @@ GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *strin #define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA #endif /* GL_EXT_separate_specular_color */ +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 +#endif /* GL_EXT_shader_image_load_formatted */ + #ifndef GL_EXT_shader_image_load_store #define GL_EXT_shader_image_load_store 1 #define GL_MAX_IMAGE_UNITS_EXT 0x8F38 @@ -8126,6 +8130,52 @@ GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const void #endif #endif /* GL_INTEL_parallel_arrays */ +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 +typedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); +typedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); +typedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); +typedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +typedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); +typedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); +GLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); +GLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); +GLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +GLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +GLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); +GLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#endif +#endif /* GL_INTEL_performance_query */ + #ifndef GL_MESAX_texture_stack #define GL_MESAX_texture_stack 1 #define GL_TEXTURE_1D_STACK_MESAX 0x8759 @@ -8220,6 +8270,15 @@ GLAPI void APIENTRY glEndConditionalRenderNVX (void); #endif #endif /* GL_NVX_conditional_render */ +#ifndef GL_NVX_gpu_memory_info +#define GL_NVX_gpu_memory_info 1 +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B +#endif /* GL_NVX_gpu_memory_info */ + #ifndef GL_NV_bindless_multi_draw_indirect #define GL_NV_bindless_multi_draw_indirect 1 typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); @@ -9372,6 +9431,17 @@ GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLs #define GL_NV_shader_storage_buffer_object 1 #endif /* GL_NV_shader_storage_buffer_object */ +#ifndef GL_NV_shader_thread_group +#define GL_NV_shader_thread_group 1 +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B +#endif /* GL_NV_shader_thread_group */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 +#endif /* GL_NV_shader_thread_shuffle */ + #ifndef GL_NV_tessellation_program5 #define GL_NV_tessellation_program5 1 #define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 @@ -9647,7 +9717,7 @@ typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const void *vdpDevice, const void typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef void (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef GLboolean (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); diff --git a/mesalib/scons/gallium.py b/mesalib/scons/gallium.py index e11d4dba3..d13d0e67b 100644 --- a/mesalib/scons/gallium.py +++ b/mesalib/scons/gallium.py @@ -36,6 +36,8 @@ import os.path import re import subprocess import platform as _platform +import sys +import tempfile import SCons.Action import SCons.Builder @@ -104,6 +106,28 @@ def num_jobs(): return 1 +def check_cc(env, cc, expr, cpp_opt = '-E'): + # Invoke C-preprocessor to determine whether the specified expression is + # true or not. + + sys.stdout.write('Checking for %s ... ' % cc) + + source = tempfile.NamedTemporaryFile(suffix='.c', delete=False) + source.write('#if !(%s)\n#error\n#endif\n' % expr) + source.close() + + pipe = SCons.Action._subproc(env, [env['CC'], cpp_opt, source.name], + stdin = 'devnull', + stderr = 'devnull', + stdout = 'devnull') + result = pipe.wait() == 0 + + os.unlink(source.name) + + sys.stdout.write(' %s\n' % ['no', 'yes'][int(bool(result))]) + return result + + def generate(env): """Common environment generation code""" @@ -137,10 +161,18 @@ def generate(env): if os.environ.has_key('LDFLAGS'): env['LINKFLAGS'] += SCons.Util.CLVar(os.environ['LDFLAGS']) - env['gcc'] = 'gcc' in os.path.basename(env['CC']).split('-') - env['msvc'] = env['CC'] == 'cl' + # Detect gcc/clang not by executable name, but through pre-defined macros + # as autoconf does, to avoid drawing wrong conclusions when using tools + # that overrice CC/CXX like scan-build. + env['gcc'] = 0 + env['clang'] = 0 + env['msvc'] = 0 + if _platform.system() == 'Windows': + env['msvc'] = check_cc(env, 'MSVC', 'defined(_MSC_VER)', '/E') + if not env['msvc']: + env['gcc'] = check_cc(env, 'GCC', 'defined(__GNUC__) && !defined(__clang__)') + env['clang'] = check_cc(env, 'Clang', '__clang__') env['suncc'] = env['platform'] == 'sunos' and os.path.basename(env['CC']) == 'cc' - env['clang'] = env['CC'] == 'clang' env['icc'] = 'icc' == os.path.basename(env['CC']) if env['msvc'] and env['toolchain'] == 'default' and env['machine'] == 'x86_64': @@ -452,6 +484,18 @@ def generate(env): env.Append(CCFLAGS = ['/MT']) env.Append(SHCCFLAGS = ['/LD']) + # Static code analysis + if env['analyze']: + if env['msvc']: + # http://msdn.microsoft.com/en-us/library/ms173498.aspx + env.Append(CCFLAGS = [ + '/analyze', + #'/analyze:log', '${TARGET.base}.xml', + ]) + if env['clang']: + # scan-build will produce more comprehensive output + env.Append(CCFLAGS = ['--analyze']) + # Assembler options if gcc_compat: if env['machine'] == 'x86': diff --git a/mesalib/src/gallium/auxiliary/util/u_debug.c b/mesalib/src/gallium/auxiliary/util/u_debug.c index ae248e020..dc840e856 100644 --- a/mesalib/src/gallium/auxiliary/util/u_debug.c +++ b/mesalib/src/gallium/auxiliary/util/u_debug.c @@ -274,10 +274,7 @@ void _debug_assert_fail(const char *expr, const char *function) { _debug_printf("%s:%u:%s: Assertion `%s' failed.\n", file, line, function, expr); - if (debug_get_bool_option("GALLIUM_ABORT_ON_ASSERT", TRUE)) - os_abort(); - else - _debug_printf("continuing...\n"); + os_abort(); } @@ -337,10 +334,10 @@ debug_dump_flags(const struct debug_named_value *names, while(names->name) { if((names->value & value) == names->value) { if (!first) - util_strncat(output, "|", sizeof(output)); + util_strncat(output, "|", sizeof(output) - strlen(output) - 1); else first = 0; - util_strncat(output, names->name, sizeof(output) - 1); + util_strncat(output, names->name, sizeof(output) - strlen(output) - 1); output[sizeof(output) - 1] = '\0'; value &= ~names->value; } @@ -349,12 +346,12 @@ debug_dump_flags(const struct debug_named_value *names, if (value) { if (!first) - util_strncat(output, "|", sizeof(output)); + util_strncat(output, "|", sizeof(output) - strlen(output) - 1); else first = 0; util_snprintf(rest, sizeof(rest), "0x%08lx", value); - util_strncat(output, rest, sizeof(output) - 1); + util_strncat(output, rest, sizeof(output) - strlen(output) - 1); output[sizeof(output) - 1] = '\0'; } diff --git a/mesalib/src/gallium/auxiliary/util/u_debug.h b/mesalib/src/gallium/auxiliary/util/u_debug.h index 9e4eb41dc..9c414211b 100644 --- a/mesalib/src/gallium/auxiliary/util/u_debug.h +++ b/mesalib/src/gallium/auxiliary/util/u_debug.h @@ -151,10 +151,17 @@ void debug_print_format(const char *msg, unsigned fmt ); long debug_get_num_option(const char *name, long dfault); +#ifdef _MSC_VER +__declspec(noreturn) +#endif void _debug_assert_fail(const char *expr, const char *file, unsigned line, - const char *function); + const char *function) +#ifdef __GNUC__ + __attribute__((__noreturn__)) +#endif +; /** diff --git a/mesalib/src/glsl/ast_to_hir.cpp b/mesalib/src/glsl/ast_to_hir.cpp index 717dc68ea..0411befa9 100644 --- a/mesalib/src/glsl/ast_to_hir.cpp +++ b/mesalib/src/glsl/ast_to_hir.cpp @@ -174,7 +174,7 @@ _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state) */ bool apply_implicit_conversion(const glsl_type *to, ir_rvalue * &from, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { void *ctx = state; if (to->base_type == from->type->base_type) @@ -225,8 +225,8 @@ apply_implicit_conversion(const glsl_type *to, ir_rvalue * &from, static const struct glsl_type * arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, - bool multiply, - struct _mesa_glsl_parse_state *state, YYLTYPE *loc) + bool multiply, + struct _mesa_glsl_parse_state *state, YYLTYPE *loc) { const glsl_type *type_a = value_a->type; const glsl_type *type_b = value_b->type; @@ -239,7 +239,7 @@ arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, */ if (!type_a->is_numeric() || !type_b->is_numeric()) { _mesa_glsl_error(loc, state, - "operands to arithmetic operators must be numeric"); + "operands to arithmetic operators must be numeric"); return glsl_type::error_type; } @@ -251,8 +251,8 @@ arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, if (!apply_implicit_conversion(type_a, value_b, state) && !apply_implicit_conversion(type_b, value_a, state)) { _mesa_glsl_error(loc, state, - "could not implicitly convert operands to " - "arithmetic operator"); + "could not implicitly convert operands to " + "arithmetic operator"); return glsl_type::error_type; } type_a = value_a->type; @@ -269,7 +269,7 @@ arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, */ if (type_a->base_type != type_b->base_type) { _mesa_glsl_error(loc, state, - "base type mismatch for arithmetic operator"); + "base type mismatch for arithmetic operator"); return glsl_type::error_type; } @@ -291,7 +291,7 @@ arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, */ if (type_a->is_scalar()) { if (!type_b->is_scalar()) - return type_b; + return type_b; } else if (type_b->is_scalar()) { return type_a; } @@ -309,11 +309,11 @@ arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, */ if (type_a->is_vector() && type_b->is_vector()) { if (type_a == type_b) { - return type_a; + return type_a; } else { - _mesa_glsl_error(loc, state, - "vector size mismatch for arithmetic operator"); - return glsl_type::error_type; + _mesa_glsl_error(loc, state, + "vector size mismatch for arithmetic operator"); + return glsl_type::error_type; } } @@ -344,64 +344,64 @@ arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, */ if (! multiply) { if (type_a == type_b) - return type_a; + return type_a; } else { if (type_a->is_matrix() && type_b->is_matrix()) { - /* Matrix multiply. The columns of A must match the rows of B. Given - * the other previously tested constraints, this means the vector type - * of a row from A must be the same as the vector type of a column from - * B. - */ - if (type_a->row_type() == type_b->column_type()) { - /* The resulting matrix has the number of columns of matrix B and - * the number of rows of matrix A. We get the row count of A by - * looking at the size of a vector that makes up a column. The - * transpose (size of a row) is done for B. - */ - const glsl_type *const type = - glsl_type::get_instance(type_a->base_type, - type_a->column_type()->vector_elements, - type_b->row_type()->vector_elements); - assert(type != glsl_type::error_type); - - return type; - } + /* Matrix multiply. The columns of A must match the rows of B. Given + * the other previously tested constraints, this means the vector type + * of a row from A must be the same as the vector type of a column from + * B. + */ + if (type_a->row_type() == type_b->column_type()) { + /* The resulting matrix has the number of columns of matrix B and + * the number of rows of matrix A. We get the row count of A by + * looking at the size of a vector that makes up a column. The + * transpose (size of a row) is done for B. + */ + const glsl_type *const type = + glsl_type::get_instance(type_a->base_type, + type_a->column_type()->vector_elements, + type_b->row_type()->vector_elements); + assert(type != glsl_type::error_type); + + return type; + } } else if (type_a->is_matrix()) { - /* A is a matrix and B is a column vector. Columns of A must match - * rows of B. Given the other previously tested constraints, this - * means the vector type of a row from A must be the same as the - * vector the type of B. - */ - if (type_a->row_type() == type_b) { - /* The resulting vector has a number of elements equal to - * the number of rows of matrix A. */ - const glsl_type *const type = - glsl_type::get_instance(type_a->base_type, - type_a->column_type()->vector_elements, - 1); - assert(type != glsl_type::error_type); - - return type; - } + /* A is a matrix and B is a column vector. Columns of A must match + * rows of B. Given the other previously tested constraints, this + * means the vector type of a row from A must be the same as the + * vector the type of B. + */ + if (type_a->row_type() == type_b) { + /* The resulting vector has a number of elements equal to + * the number of rows of matrix A. */ + const glsl_type *const type = + glsl_type::get_instance(type_a->base_type, + type_a->column_type()->vector_elements, + 1); + assert(type != glsl_type::error_type); + + return type; + } } else { - assert(type_b->is_matrix()); - - /* A is a row vector and B is a matrix. Columns of A must match rows - * of B. Given the other previously tested constraints, this means - * the type of A must be the same as the vector type of a column from - * B. - */ - if (type_a == type_b->column_type()) { - /* The resulting vector has a number of elements equal to - * the number of columns of matrix B. */ - const glsl_type *const type = - glsl_type::get_instance(type_a->base_type, - type_b->row_type()->vector_elements, - 1); - assert(type != glsl_type::error_type); - - return type; - } + assert(type_b->is_matrix()); + + /* A is a row vector and B is a matrix. Columns of A must match rows + * of B. Given the other previously tested constraints, this means + * the type of A must be the same as the vector type of a column from + * B. + */ + if (type_a == type_b->column_type()) { + /* The resulting vector has a number of elements equal to + * the number of columns of matrix B. */ + const glsl_type *const type = + glsl_type::get_instance(type_a->base_type, + type_b->row_type()->vector_elements, + 1); + assert(type != glsl_type::error_type); + + return type; + } } _mesa_glsl_error(loc, state, "size mismatch for matrix multiplication"); @@ -418,7 +418,7 @@ arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, static const struct glsl_type * unary_arithmetic_result_type(const struct glsl_type *type, - struct _mesa_glsl_parse_state *state, YYLTYPE *loc) + struct _mesa_glsl_parse_state *state, YYLTYPE *loc) { /* From GLSL 1.50 spec, page 57: * @@ -430,7 +430,7 @@ unary_arithmetic_result_type(const struct glsl_type *type, */ if (!type->is_numeric()) { _mesa_glsl_error(loc, state, - "operands to arithmetic operators must be numeric"); + "operands to arithmetic operators must be numeric"); return glsl_type::error_type; } @@ -504,8 +504,8 @@ bit_logic_result_type(const struct glsl_type *type_a, static const struct glsl_type * modulus_result_type(const struct glsl_type *type_a, - const struct glsl_type *type_b, - struct _mesa_glsl_parse_state *state, YYLTYPE *loc) + const struct glsl_type *type_b, + struct _mesa_glsl_parse_state *state, YYLTYPE *loc) { if (!state->check_version(130, 300, loc, "operator '%%' is reserved")) { return glsl_type::error_type; @@ -526,7 +526,7 @@ modulus_result_type(const struct glsl_type *type_a, } if (type_a->base_type != type_b->base_type) { _mesa_glsl_error(loc, state, - "operands of %% must have the same base type"); + "operands of %% must have the same base type"); return glsl_type::error_type; } @@ -537,8 +537,8 @@ modulus_result_type(const struct glsl_type *type_a, */ if (type_a->is_vector()) { if (!type_b->is_vector() - || (type_a->vector_elements == type_b->vector_elements)) - return type_a; + || (type_a->vector_elements == type_b->vector_elements)) + return type_a; } else return type_b; @@ -552,7 +552,7 @@ modulus_result_type(const struct glsl_type *type_a, static const struct glsl_type * relational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, - struct _mesa_glsl_parse_state *state, YYLTYPE *loc) + struct _mesa_glsl_parse_state *state, YYLTYPE *loc) { const glsl_type *type_a = value_a->type; const glsl_type *type_b = value_b->type; @@ -567,8 +567,8 @@ relational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, || !type_a->is_scalar() || !type_b->is_scalar()) { _mesa_glsl_error(loc, state, - "operands to relational operators must be scalar and " - "numeric"); + "operands to relational operators must be scalar and " + "numeric"); return glsl_type::error_type; } @@ -579,8 +579,8 @@ relational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, if (!apply_implicit_conversion(type_a, value_b, state) && !apply_implicit_conversion(type_b, value_a, state)) { _mesa_glsl_error(loc, state, - "could not implicitly convert operands to " - "relational operator"); + "could not implicitly convert operands to " + "relational operator"); return glsl_type::error_type; } type_a = value_a->type; @@ -623,13 +623,13 @@ shift_result_type(const struct glsl_type *type_a, */ if (!type_a->is_integer()) { _mesa_glsl_error(loc, state, "LHS of operator %s must be an integer or " - "integer vector", ast_expression::operator_string(op)); + "integer vector", ast_expression::operator_string(op)); return glsl_type::error_type; } if (!type_b->is_integer()) { _mesa_glsl_error(loc, state, "RHS of operator %s must be an integer or " - "integer vector", ast_expression::operator_string(op)); + "integer vector", ast_expression::operator_string(op)); return glsl_type::error_type; } @@ -638,8 +638,8 @@ shift_result_type(const struct glsl_type *type_a, */ if (type_a->is_scalar() && !type_b->is_scalar()) { _mesa_glsl_error(loc, state, "if the first operand of %s is scalar, the " - "second must be scalar as well", - ast_expression::operator_string(op)); + "second must be scalar as well", + ast_expression::operator_string(op)); return glsl_type::error_type; } @@ -650,8 +650,8 @@ shift_result_type(const struct glsl_type *type_a, type_b->is_vector() && type_a->vector_elements != type_b->vector_elements) { _mesa_glsl_error(loc, state, "vector operands to operator %s must " - "have same number of elements", - ast_expression::operator_string(op)); + "have same number of elements", + ast_expression::operator_string(op)); return glsl_type::error_type; } @@ -738,11 +738,11 @@ mark_whole_array_access(ir_rvalue *access) static bool do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state, - const char *non_lvalue_description, - ir_rvalue *lhs, ir_rvalue *rhs, + const char *non_lvalue_description, + ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue **out_rvalue, bool needs_rvalue, bool is_initializer, - YYLTYPE lhs_loc) + YYLTYPE lhs_loc) { void *ctx = state; bool error_emitted = (lhs->type->is_error() || rhs->type->is_error()); @@ -792,30 +792,29 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state, if (non_lvalue_description != NULL) { _mesa_glsl_error(&lhs_loc, state, "assignment to %s", - non_lvalue_description); - error_emitted = true; + non_lvalue_description); + error_emitted = true; } else if (lhs->variable_referenced() != NULL - && lhs->variable_referenced()->data.read_only) { + && lhs->variable_referenced()->data.read_only) { _mesa_glsl_error(&lhs_loc, state, "assignment to read-only variable '%s'", lhs->variable_referenced()->name); error_emitted = true; - } else if (lhs->type->is_array() && !state->check_version(120, 300, &lhs_loc, "whole array assignment forbidden")) { - /* From page 32 (page 38 of the PDF) of the GLSL 1.10 spec: - * - * "Other binary or unary expressions, non-dereferenced - * arrays, function names, swizzles with repeated fields, - * and constants cannot be l-values." + /* From page 32 (page 38 of the PDF) of the GLSL 1.10 spec: + * + * "Other binary or unary expressions, non-dereferenced + * arrays, function names, swizzles with repeated fields, + * and constants cannot be l-values." * * The restriction on arrays is lifted in GLSL 1.20 and GLSL ES 3.00. - */ - error_emitted = true; + */ + error_emitted = true; } else if (!lhs->is_lvalue()) { - _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment"); - error_emitted = true; + _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment"); + error_emitted = true; } } @@ -830,24 +829,24 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state, * is either not an l-value or not a whole array. */ if (lhs->type->is_unsized_array()) { - ir_dereference *const d = lhs->as_dereference(); + ir_dereference *const d = lhs->as_dereference(); - assert(d != NULL); + assert(d != NULL); - ir_variable *const var = d->variable_referenced(); + ir_variable *const var = d->variable_referenced(); - assert(var != NULL); + assert(var != NULL); - if (var->data.max_array_access >= unsigned(rhs->type->array_size())) { - /* FINISHME: This should actually log the location of the RHS. */ - _mesa_glsl_error(& lhs_loc, state, "array size must be > %u due to " - "previous access", - var->data.max_array_access); - } + if (var->data.max_array_access >= unsigned(rhs->type->array_size())) { + /* FINISHME: This should actually log the location of the RHS. */ + _mesa_glsl_error(& lhs_loc, state, "array size must be > %u due to " + "previous access", + var->data.max_array_access); + } - var->type = glsl_type::get_array_instance(lhs->type->element_type(), - rhs->type->array_size()); - d->type = var->type; + var->type = glsl_type::get_array_instance(lhs->type->element_type(), + rhs->type->array_size()); + d->type = var->type; } if (lhs->type->is_array()) { mark_whole_array_access(rhs); @@ -908,8 +907,7 @@ get_lvalue_copy(exec_list *instructions, ir_rvalue *lvalue) ir_rvalue * -ast_node::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) +ast_node::hir(exec_list *instructions, struct _mesa_glsl_parse_state *state) { (void) instructions; (void) state; @@ -951,19 +949,19 @@ do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1) case GLSL_TYPE_ARRAY: { for (unsigned int i = 0; i < op0->type->length; i++) { - ir_rvalue *e0, *e1, *result; - - e0 = new(mem_ctx) ir_dereference_array(op0->clone(mem_ctx, NULL), - new(mem_ctx) ir_constant(i)); - e1 = new(mem_ctx) ir_dereference_array(op1->clone(mem_ctx, NULL), - new(mem_ctx) ir_constant(i)); - result = do_comparison(mem_ctx, operation, e0, e1); - - if (cmp) { - cmp = new(mem_ctx) ir_expression(join_op, cmp, result); - } else { - cmp = result; - } + ir_rvalue *e0, *e1, *result; + + e0 = new(mem_ctx) ir_dereference_array(op0->clone(mem_ctx, NULL), + new(mem_ctx) ir_constant(i)); + e1 = new(mem_ctx) ir_dereference_array(op1->clone(mem_ctx, NULL), + new(mem_ctx) ir_constant(i)); + result = do_comparison(mem_ctx, operation, e0, e1); + + if (cmp) { + cmp = new(mem_ctx) ir_expression(join_op, cmp, result); + } else { + cmp = result; + } } mark_whole_array_access(op0); @@ -973,20 +971,20 @@ do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1) case GLSL_TYPE_STRUCT: { for (unsigned int i = 0; i < op0->type->length; i++) { - ir_rvalue *e0, *e1, *result; - const char *field_name = op0->type->fields.structure[i].name; - - e0 = new(mem_ctx) ir_dereference_record(op0->clone(mem_ctx, NULL), - field_name); - e1 = new(mem_ctx) ir_dereference_record(op1->clone(mem_ctx, NULL), - field_name); - result = do_comparison(mem_ctx, operation, e0, e1); - - if (cmp) { - cmp = new(mem_ctx) ir_expression(join_op, cmp, result); - } else { - cmp = result; - } + ir_rvalue *e0, *e1, *result; + const char *field_name = op0->type->fields.structure[i].name; + + e0 = new(mem_ctx) ir_dereference_record(op0->clone(mem_ctx, NULL), + field_name); + e1 = new(mem_ctx) ir_dereference_record(op1->clone(mem_ctx, NULL), + field_name); + result = do_comparison(mem_ctx, operation, e0, e1); + + if (cmp) { + cmp = new(mem_ctx) ir_expression(join_op, cmp, result); + } else { + cmp = result; + } } break; } @@ -1031,8 +1029,8 @@ get_scalar_boolean_operand(exec_list *instructions, if (!*error_emitted) { YYLTYPE loc = expr->get_location(); _mesa_glsl_error(&loc, state, "%s of `%s' must be scalar boolean", - operand_name, - parent_expr->operator_string(parent_expr->oper)); + operand_name, + parent_expr->operator_string(parent_expr->oper)); *error_emitted = true; } @@ -1098,7 +1096,7 @@ constant_one_for_inc_dec(void *ctx, const glsl_type *type) ir_rvalue * ast_expression::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { return do_hir(instructions, state, true); } @@ -1181,8 +1179,8 @@ ast_expression::do_hir(exec_list *instructions, switch (this->oper) { case ast_aggregate: - assert(!"ast_aggregate: Should never get here."); - break; + assert(!"ast_aggregate: Should never get here."); + break; case ast_assign: { op[0] = this->subexpressions[0]->hir(instructions, state); @@ -1214,7 +1212,7 @@ ast_expression::do_hir(exec_list *instructions, error_emitted = type->is_error(); result = new(ctx) ir_expression(operations[this->oper], type, - op[0], NULL); + op[0], NULL); break; case ast_add: @@ -1225,12 +1223,12 @@ ast_expression::do_hir(exec_list *instructions, op[1] = this->subexpressions[1]->hir(instructions, state); type = arithmetic_result_type(op[0], op[1], - (this->oper == ast_mul), - state, & loc); + (this->oper == ast_mul), + state, & loc); error_emitted = type->is_error(); result = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); + op[0], op[1]); break; case ast_mod: @@ -1242,7 +1240,7 @@ ast_expression::do_hir(exec_list *instructions, assert(operations[this->oper] == ir_binop_mod); result = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); + op[0], op[1]); error_emitted = type->is_error(); break; @@ -1278,7 +1276,7 @@ ast_expression::do_hir(exec_list *instructions, && type->is_scalar())); result = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); + op[0], op[1]); error_emitted = type->is_error(); break; @@ -1297,15 +1295,15 @@ ast_expression::do_hir(exec_list *instructions, * case this conversion is done." */ if ((!apply_implicit_conversion(op[0]->type, op[1], state) - && !apply_implicit_conversion(op[1]->type, op[0], state)) - || (op[0]->type != op[1]->type)) { - _mesa_glsl_error(& loc, state, "operands of `%s' must have the same " - "type", (this->oper == ast_equal) ? "==" : "!="); - error_emitted = true; + && !apply_implicit_conversion(op[1]->type, op[0], state)) + || (op[0]->type != op[1]->type)) { + _mesa_glsl_error(& loc, state, "operands of `%s' must have the same " + "type", (this->oper == ast_equal) ? "==" : "!="); + error_emitted = true; } else if ((op[0]->type->is_array() || op[1]->type->is_array()) && !state->check_version(120, 300, &loc, "array comparisons forbidden")) { - error_emitted = true; + error_emitted = true; } else if ((op[0]->type->contains_opaque() || op[1]->type->contains_opaque())) { _mesa_glsl_error(&loc, state, "opaque type comparisons forbidden"); @@ -1313,10 +1311,10 @@ ast_expression::do_hir(exec_list *instructions, } if (error_emitted) { - result = new(ctx) ir_constant(false); + result = new(ctx) ir_constant(false); } else { - result = do_comparison(ctx, operations[this->oper], op[0], op[1]); - assert(result->type == glsl_type::bool_type); + result = do_comparison(ctx, operations[this->oper], op[0], op[1]); + assert(result->type == glsl_type::bool_type); } break; @@ -1328,7 +1326,7 @@ ast_expression::do_hir(exec_list *instructions, type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper, state, &loc); result = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); + op[0], op[1]); error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); break; @@ -1336,12 +1334,12 @@ ast_expression::do_hir(exec_list *instructions, op[0] = this->subexpressions[0]->hir(instructions, state); if (!state->check_bitwise_operations_allowed(&loc)) { - error_emitted = true; + error_emitted = true; } if (!op[0]->type->is_integer()) { - _mesa_glsl_error(&loc, state, "operand of `~' must be an integer"); - error_emitted = true; + _mesa_glsl_error(&loc, state, "operand of `~' must be an integer"); + error_emitted = true; } type = error_emitted ? glsl_type::error_type : op[0]->type; @@ -1351,35 +1349,35 @@ ast_expression::do_hir(exec_list *instructions, case ast_logic_and: { exec_list rhs_instructions; op[0] = get_scalar_boolean_operand(instructions, state, this, 0, - "LHS", &error_emitted); + "LHS", &error_emitted); op[1] = get_scalar_boolean_operand(&rhs_instructions, state, this, 1, - "RHS", &error_emitted); + "RHS", &error_emitted); if (rhs_instructions.is_empty()) { - result = new(ctx) ir_expression(ir_binop_logic_and, op[0], op[1]); - type = result->type; + result = new(ctx) ir_expression(ir_binop_logic_and, op[0], op[1]); + type = result->type; } else { - ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type, - "and_tmp", - ir_var_temporary); - instructions->push_tail(tmp); - - ir_if *const stmt = new(ctx) ir_if(op[0]); - instructions->push_tail(stmt); - - stmt->then_instructions.append_list(&rhs_instructions); - ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp); - ir_assignment *const then_assign = - new(ctx) ir_assignment(then_deref, op[1]); - stmt->then_instructions.push_tail(then_assign); - - ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp); - ir_assignment *const else_assign = - new(ctx) ir_assignment(else_deref, new(ctx) ir_constant(false)); - stmt->else_instructions.push_tail(else_assign); - - result = new(ctx) ir_dereference_variable(tmp); - type = tmp->type; + ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type, + "and_tmp", + ir_var_temporary); + instructions->push_tail(tmp); + + ir_if *const stmt = new(ctx) ir_if(op[0]); + instructions->push_tail(stmt); + + stmt->then_instructions.append_list(&rhs_instructions); + ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp); + ir_assignment *const then_assign = + new(ctx) ir_assignment(then_deref, op[1]); + stmt->then_instructions.push_tail(then_assign); + + ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp); + ir_assignment *const else_assign = + new(ctx) ir_assignment(else_deref, new(ctx) ir_constant(false)); + stmt->else_instructions.push_tail(else_assign); + + result = new(ctx) ir_dereference_variable(tmp); + type = tmp->type; } break; } @@ -1387,35 +1385,35 @@ ast_expression::do_hir(exec_list *instructions, case ast_logic_or: { exec_list rhs_instructions; op[0] = get_scalar_boolean_operand(instructions, state, this, 0, - "LHS", &error_emitted); + "LHS", &error_emitted); op[1] = get_scalar_boolean_operand(&rhs_instructions, state, this, 1, - "RHS", &error_emitted); + "RHS", &error_emitted); if (rhs_instructions.is_empty()) { - result = new(ctx) ir_expression(ir_binop_logic_or, op[0], op[1]); - type = result->type; + result = new(ctx) ir_expression(ir_binop_logic_or, op[0], op[1]); + type = result->type; } else { - ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type, - "or_tmp", - ir_var_temporary); - instructions->push_tail(tmp); - - ir_if *const stmt = new(ctx) ir_if(op[0]); - instructions->push_tail(stmt); - - ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp); - ir_assignment *const then_assign = - new(ctx) ir_assignment(then_deref, new(ctx) ir_constant(true)); - stmt->then_instructions.push_tail(then_assign); - - stmt->else_instructions.append_list(&rhs_instructions); - ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp); - ir_assignment *const else_assign = - new(ctx) ir_assignment(else_deref, op[1]); - stmt->else_instructions.push_tail(else_assign); - - result = new(ctx) ir_dereference_variable(tmp); - type = tmp->type; + ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type, + "or_tmp", + ir_var_temporary); + instructions->push_tail(tmp); + + ir_if *const stmt = new(ctx) ir_if(op[0]); + instructions->push_tail(stmt); + + ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp); + ir_assignment *const then_assign = + new(ctx) ir_assignment(then_deref, new(ctx) ir_constant(true)); + stmt->then_instructions.push_tail(then_assign); + + stmt->else_instructions.append_list(&rhs_instructions); + ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp); + ir_assignment *const else_assign = + new(ctx) ir_assignment(else_deref, op[1]); + stmt->else_instructions.push_tail(else_assign); + + result = new(ctx) ir_dereference_variable(tmp); + type = tmp->type; } break; } @@ -1428,20 +1426,20 @@ ast_expression::do_hir(exec_list *instructions, * expressions and result in a Boolean expression." */ op[0] = get_scalar_boolean_operand(instructions, state, this, 0, "LHS", - &error_emitted); + &error_emitted); op[1] = get_scalar_boolean_operand(instructions, state, this, 1, "RHS", - &error_emitted); + &error_emitted); result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type, - op[0], op[1]); + op[0], op[1]); break; case ast_logic_not: op[0] = get_scalar_boolean_operand(instructions, state, this, 0, - "operand", &error_emitted); + "operand", &error_emitted); result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type, - op[0], NULL); + op[0], NULL); break; case ast_mul_assign: @@ -1452,11 +1450,11 @@ ast_expression::do_hir(exec_list *instructions, op[1] = this->subexpressions[1]->hir(instructions, state); type = arithmetic_result_type(op[0], op[1], - (this->oper == ast_mul_assign), - state, & loc); + (this->oper == ast_mul_assign), + state, & loc); ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); + op[0], op[1]); error_emitted = do_assignment(instructions, state, @@ -1483,7 +1481,7 @@ ast_expression::do_hir(exec_list *instructions, ir_rvalue *temp_rhs; temp_rhs = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); + op[0], op[1]); error_emitted = do_assignment(instructions, state, @@ -1537,7 +1535,7 @@ ast_expression::do_hir(exec_list *instructions, * first expression, which must result in a scalar Boolean." */ op[0] = get_scalar_boolean_operand(instructions, state, this, 0, - "condition", &error_emitted); + "condition", &error_emitted); /* The :? operator is implemented by generating an anonymous temporary * followed by an if-statement. The last instruction in each branch of @@ -1560,16 +1558,16 @@ ast_expression::do_hir(exec_list *instructions, * expression." */ if ((!apply_implicit_conversion(op[1]->type, op[2], state) - && !apply_implicit_conversion(op[2]->type, op[1], state)) - || (op[1]->type != op[2]->type)) { - YYLTYPE loc = this->subexpressions[1]->get_location(); - - _mesa_glsl_error(& loc, state, "second and third operands of ?: " - "operator must have matching types"); - error_emitted = true; - type = glsl_type::error_type; + && !apply_implicit_conversion(op[2]->type, op[1], state)) + || (op[1]->type != op[2]->type)) { + YYLTYPE loc = this->subexpressions[1]->get_location(); + + _mesa_glsl_error(& loc, state, "second and third operands of ?: " + "operator must have matching types"); + error_emitted = true; + type = glsl_type::error_type; } else { - type = op[1]->type; + type = op[1]->type; } /* From page 33 (page 39 of the PDF) of the GLSL 1.10 spec: @@ -1581,7 +1579,7 @@ ast_expression::do_hir(exec_list *instructions, !state->check_version(120, 300, &loc, "second and third operands of ?: operator " "cannot be arrays")) { - error_emitted = true; + error_emitted = true; } ir_constant *cond_val = op[0]->constant_expression_value(); @@ -1589,32 +1587,32 @@ ast_expression::do_hir(exec_list *instructions, ir_constant *else_val = op[2]->constant_expression_value(); if (then_instructions.is_empty() - && else_instructions.is_empty() - && (cond_val != NULL) && (then_val != NULL) && (else_val != NULL)) { - result = (cond_val->value.b[0]) ? then_val : else_val; + && else_instructions.is_empty() + && (cond_val != NULL) && (then_val != NULL) && (else_val != NULL)) { + result = (cond_val->value.b[0]) ? then_val : else_val; } else { - ir_variable *const tmp = - new(ctx) ir_variable(type, "conditional_tmp", ir_var_temporary); - instructions->push_tail(tmp); - - ir_if *const stmt = new(ctx) ir_if(op[0]); - instructions->push_tail(stmt); - - then_instructions.move_nodes_to(& stmt->then_instructions); - ir_dereference *const then_deref = - new(ctx) ir_dereference_variable(tmp); - ir_assignment *const then_assign = - new(ctx) ir_assignment(then_deref, op[1]); - stmt->then_instructions.push_tail(then_assign); - - else_instructions.move_nodes_to(& stmt->else_instructions); - ir_dereference *const else_deref = - new(ctx) ir_dereference_variable(tmp); - ir_assignment *const else_assign = - new(ctx) ir_assignment(else_deref, op[2]); - stmt->else_instructions.push_tail(else_assign); - - result = new(ctx) ir_dereference_variable(tmp); + ir_variable *const tmp = + new(ctx) ir_variable(type, "conditional_tmp", ir_var_temporary); + instructions->push_tail(tmp); + + ir_if *const stmt = new(ctx) ir_if(op[0]); + instructions->push_tail(stmt); + + then_instructions.move_nodes_to(& stmt->then_instructions); + ir_dereference *const then_deref = + new(ctx) ir_dereference_variable(tmp); + ir_assignment *const then_assign = + new(ctx) ir_assignment(then_deref, op[1]); + stmt->then_instructions.push_tail(then_assign); + + else_instructions.move_nodes_to(& stmt->else_instructions); + ir_dereference *const else_deref = + new(ctx) ir_dereference_variable(tmp); + ir_assignment *const else_assign = + new(ctx) ir_assignment(else_deref, op[2]); + stmt->else_instructions.push_tail(else_assign); + + result = new(ctx) ir_dereference_variable(tmp); } break; } @@ -1622,7 +1620,7 @@ ast_expression::do_hir(exec_list *instructions, case ast_pre_inc: case ast_pre_dec: { this->non_lvalue_description = (this->oper == ast_pre_inc) - ? "pre-increment operation" : "pre-decrement operation"; + ? "pre-increment operation" : "pre-decrement operation"; op[0] = this->subexpressions[0]->hir(instructions, state); op[1] = constant_one_for_inc_dec(ctx, op[0]->type); @@ -1631,7 +1629,7 @@ ast_expression::do_hir(exec_list *instructions, ir_rvalue *temp_rhs; temp_rhs = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); + op[0], op[1]); error_emitted = do_assignment(instructions, state, @@ -1645,7 +1643,7 @@ ast_expression::do_hir(exec_list *instructions, case ast_post_inc: case ast_post_dec: { this->non_lvalue_description = (this->oper == ast_post_inc) - ? "post-increment operation" : "post-decrement operation"; + ? "post-increment operation" : "post-decrement operation"; op[0] = this->subexpressions[0]->hir(instructions, state); op[1] = constant_one_for_inc_dec(ctx, op[0]->type); @@ -1655,7 +1653,7 @@ ast_expression::do_hir(exec_list *instructions, ir_rvalue *temp_rhs; temp_rhs = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); + op[0], op[1]); /* Get a temporary of a copy of the lvalue before it's modified. * This may get thrown away later. @@ -1684,10 +1682,10 @@ ast_expression::do_hir(exec_list *instructions, op[1] = subexpressions[1]->hir(instructions, state); result = _mesa_ast_array_index_to_hir(ctx, state, op[0], op[1], - loc, index_loc); + loc, index_loc); if (result->type->is_error()) - error_emitted = true; + error_emitted = true; break; } @@ -1705,17 +1703,17 @@ ast_expression::do_hir(exec_list *instructions, * as 'variable_identifier'. */ ir_variable *var = - state->symbols->get_variable(this->primary_expression.identifier); + state->symbols->get_variable(this->primary_expression.identifier); if (var != NULL) { - var->data.used = true; - result = new(ctx) ir_dereference_variable(var); + var->data.used = true; + result = new(ctx) ir_dereference_variable(var); } else { - _mesa_glsl_error(& loc, state, "`%s' undeclared", - this->primary_expression.identifier); + _mesa_glsl_error(& loc, state, "`%s' undeclared", + this->primary_expression.identifier); - result = ir_rvalue::error_value(ctx); - error_emitted = true; + result = ir_rvalue::error_value(ctx); + error_emitted = true; } break; } @@ -1751,37 +1749,37 @@ ast_expression::do_hir(exec_list *instructions, YYLTYPE previous_operand_loc = loc; foreach_list_typed (ast_node, ast, link, &this->expressions) { - /* If one of the operands of comma operator does not generate any - * code, we want to emit a warning. At each pass through the loop - * previous_tail_pred will point to the last instruction in the - * stream *before* processing the previous operand. Naturally, - * instructions->tail_pred will point to the last instruction in the - * stream *after* processing the previous operand. If the two - * pointers match, then the previous operand had no effect. - * - * The warning behavior here differs slightly from GCC. GCC will - * only emit a warning if none of the left-hand operands have an - * effect. However, it will emit a warning for each. I believe that - * there are some cases in C (especially with GCC extensions) where - * it is useful to have an intermediate step in a sequence have no - * effect, but I don't think these cases exist in GLSL. Either way, - * it would be a giant hassle to replicate that behavior. - */ - if (previous_tail_pred == instructions->tail_pred) { - _mesa_glsl_warning(&previous_operand_loc, state, - "left-hand operand of comma expression has " - "no effect"); - } - - /* tail_pred is directly accessed instead of using the get_tail() - * method for performance reasons. get_tail() has extra code to - * return NULL when the list is empty. We don't care about that - * here, so using tail_pred directly is fine. - */ - previous_tail_pred = instructions->tail_pred; - previous_operand_loc = ast->get_location(); - - result = ast->hir(instructions, state); + /* If one of the operands of comma operator does not generate any + * code, we want to emit a warning. At each pass through the loop + * previous_tail_pred will point to the last instruction in the + * stream *before* processing the previous operand. Naturally, + * instructions->tail_pred will point to the last instruction in the + * stream *after* processing the previous operand. If the two + * pointers match, then the previous operand had no effect. + * + * The warning behavior here differs slightly from GCC. GCC will + * only emit a warning if none of the left-hand operands have an + * effect. However, it will emit a warning for each. I believe that + * there are some cases in C (especially with GCC extensions) where + * it is useful to have an intermediate step in a sequence have no + * effect, but I don't think these cases exist in GLSL. Either way, + * it would be a giant hassle to replicate that behavior. + */ + if (previous_tail_pred == instructions->tail_pred) { + _mesa_glsl_warning(&previous_operand_loc, state, + "left-hand operand of comma expression has " + "no effect"); + } + + /* tail_pred is directly accessed instead of using the get_tail() + * method for performance reasons. get_tail() has extra code to + * return NULL when the list is empty. We don't care about that + * here, so using tail_pred directly is fine. + */ + previous_tail_pred = instructions->tail_pred; + previous_operand_loc = ast->get_location(); + + result = ast->hir(instructions, state); } /* Any errors should have already been emitted in the loop above. @@ -1802,7 +1800,7 @@ ast_expression::do_hir(exec_list *instructions, ir_rvalue * ast_expression_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { /* It is possible to have expression statements that don't have an * expression. This is the solitary semicolon: @@ -1824,7 +1822,7 @@ ast_expression_statement::hir(exec_list *instructions, ir_rvalue * ast_compound_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { if (new_scope) state->symbols->push_scope(); @@ -1851,8 +1849,7 @@ process_array_size(exec_node *node, exec_list dummy_instructions; ast_node *array_size = exec_node_data(ast_node, node, link); - ir_rvalue *const ir = array_size->hir(& dummy_instructions, - state); + ir_rvalue *const ir = array_size->hir(& dummy_instructions, state); YYLTYPE loc = array_size->get_location(); if (ir == NULL) { @@ -1933,8 +1930,7 @@ process_array_type(YYLTYPE *loc, const glsl_type *base, for (exec_node *node = array_specifier->array_dimensions.tail_pred; !node->is_head_sentinel(); node = node->prev) { unsigned array_size = process_array_size(node, state); - array_type = glsl_type::get_array_instance(array_type, - array_size); + array_type = glsl_type::get_array_instance(array_type, array_size); } if (array_specifier->is_unsized_array) @@ -1947,7 +1943,7 @@ process_array_type(YYLTYPE *loc, const glsl_type *base, const glsl_type * ast_type_specifier::glsl_type(const char **name, - struct _mesa_glsl_parse_state *state) const + struct _mesa_glsl_parse_state *state) const { const struct glsl_type *type; @@ -2011,7 +2007,7 @@ is_varying_var(ir_variable *var, gl_shader_stage target) */ static void validate_matrix_layout_for_type(struct _mesa_glsl_parse_state *state, - YYLTYPE *loc, + YYLTYPE *loc, const glsl_type *type, ir_variable *var) { @@ -2240,7 +2236,7 @@ validate_explicit_location(const struct ast_type_qualifier *qual, _mesa_glsl_error(loc, state, "%s cannot be given an explicit location in %s shader", mode_string(var), - _mesa_shader_stage_to_string(state->stage)); + _mesa_shader_stage_to_string(state->stage)); } else { var->data.explicit_location = true; @@ -2347,21 +2343,21 @@ apply_image_qualifier_to_variable(const struct ast_type_qualifier *qual, static void apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, - ir_variable *var, - struct _mesa_glsl_parse_state *state, - YYLTYPE *loc, + ir_variable *var, + struct _mesa_glsl_parse_state *state, + YYLTYPE *loc, bool is_parameter) { STATIC_ASSERT(sizeof(qual->flags.q) <= sizeof(qual->flags.i)); if (qual->flags.q.invariant) { if (var->data.used) { - _mesa_glsl_error(loc, state, - "variable `%s' may not be redeclared " - "`invariant' after being used", - var->name); + _mesa_glsl_error(loc, state, + "variable `%s' may not be redeclared " + "`invariant' after being used", + var->name); } else { - var->data.invariant = 1; + var->data.invariant = 1; } } @@ -2379,9 +2375,9 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, if (qual->flags.q.attribute && state->stage != MESA_SHADER_VERTEX) { var->type = glsl_type::error_type; _mesa_glsl_error(loc, state, - "`attribute' variables may not be declared in the " - "%s shader", - _mesa_shader_stage_to_string(state->stage)); + "`attribute' variables may not be declared in the " + "%s shader", + _mesa_shader_stage_to_string(state->stage)); } /* Section 6.1.1 (Function Calling Conventions) of the GLSL 1.10 spec says: @@ -2474,18 +2470,18 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, if (state->all_invariant && (state->current_function == NULL)) { switch (state->stage) { case MESA_SHADER_VERTEX: - if (var->data.mode == ir_var_shader_out) - var->data.invariant = true; - break; + if (var->data.mode == ir_var_shader_out) + var->data.invariant = true; + break; case MESA_SHADER_GEOMETRY: - if ((var->data.mode == ir_var_shader_in) + if ((var->data.mode == ir_var_shader_in) || (var->data.mode == ir_var_shader_out)) - var->data.invariant = true; - break; + var->data.invariant = true; + break; case MESA_SHADER_FRAGMENT: - if (var->data.mode == ir_var_shader_in) - var->data.invariant = true; - break; + if (var->data.mode == ir_var_shader_in) + var->data.invariant = true; + break; case MESA_SHADER_COMPUTE: /* Invariance isn't meaningful in compute shaders. */ break; @@ -2501,7 +2497,7 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, if ((qual->flags.q.origin_upper_left || qual->flags.q.pixel_center_integer) && (strcmp(var->name, "gl_FragCoord") != 0)) { const char *const qual_string = (qual->flags.q.origin_upper_left) - ? "origin_upper_left" : "pixel_center_integer"; + ? "origin_upper_left" : "pixel_center_integer"; _mesa_glsl_error(loc, state, "layout qualifier `%s' can only be applied to " @@ -2512,8 +2508,7 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, if (qual->flags.q.explicit_location) { validate_explicit_location(qual, var, state, loc); } else if (qual->flags.q.explicit_index) { - _mesa_glsl_error(loc, state, - "explicit index requires explicit location"); + _mesa_glsl_error(loc, state, "explicit index requires explicit location"); } if (qual->flags.q.explicit_binding && @@ -2577,13 +2572,13 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, if (qual->has_layout() && uses_deprecated_qualifier) { if (relaxed_layout_qualifier_checking) { - _mesa_glsl_warning(loc, state, - "`layout' qualifier may not be used with " - "`attribute' or `varying'"); + _mesa_glsl_warning(loc, state, + "`layout' qualifier may not be used with " + "`attribute' or `varying'"); } else { - _mesa_glsl_error(loc, state, - "`layout' qualifier may not be used with " - "`attribute' or `varying'"); + _mesa_glsl_error(loc, state, + "`layout' qualifier may not be used with " + "`attribute' or `varying'"); } } @@ -2600,7 +2595,7 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, _mesa_glsl_error(loc, state, "extension GL_AMD_conservative_depth or " "GL_ARB_conservative_depth must be enabled " - "to use depth layout qualifiers"); + "to use depth layout qualifiers"); } else if (depth_layout_count > 0 && strcmp(var->name, "gl_FragDepth") != 0) { _mesa_glsl_error(loc, state, @@ -2628,8 +2623,8 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, qual->flags.q.shared) { _mesa_glsl_error(loc, state, "uniform block layout qualifiers std140, packed, and " - "shared can only be applied to uniform blocks, not " - "members"); + "shared can only be applied to uniform blocks, not " + "members"); } if (qual->flags.q.row_major || qual->flags.q.column_major) { @@ -2665,7 +2660,7 @@ get_variable_being_redeclared(ir_variable *var, YYLTYPE loc, ir_variable *earlier = state->symbols->get_variable(var->name); if (earlier == NULL || (state->current_function != NULL && - !state->symbols->name_declared_this_scope(var->name))) { + !state->symbols->name_declared_this_scope(var->name))) { return NULL; } @@ -2686,19 +2681,19 @@ get_variable_being_redeclared(ir_variable *var, YYLTYPE loc, const unsigned size = unsigned(var->type->array_size()); check_builtin_array_max_size(var->name, size, loc, state); if ((size > 0) && (size <= earlier->data.max_array_access)) { - _mesa_glsl_error(& loc, state, "array size must be > %u due to " - "previous access", - earlier->data.max_array_access); + _mesa_glsl_error(& loc, state, "array size must be > %u due to " + "previous access", + earlier->data.max_array_access); } earlier->type = var->type; delete var; var = NULL; } else if ((state->ARB_fragment_coord_conventions_enable || - state->is_version(150, 0)) - && strcmp(var->name, "gl_FragCoord") == 0 - && earlier->type == var->type - && earlier->data.mode == var->data.mode) { + state->is_version(150, 0)) + && strcmp(var->name, "gl_FragCoord") == 0 + && earlier->type == var->type + && earlier->data.mode == var->data.mode) { /* Allow redeclaration of gl_FragCoord for ARB_fcc layout * qualifiers. */ @@ -2716,42 +2711,42 @@ get_variable_being_redeclared(ir_variable *var, YYLTYPE loc, * * gl_SecondaryColor */ } else if (state->is_version(130, 0) - && (strcmp(var->name, "gl_FrontColor") == 0 - || strcmp(var->name, "gl_BackColor") == 0 - || strcmp(var->name, "gl_FrontSecondaryColor") == 0 - || strcmp(var->name, "gl_BackSecondaryColor") == 0 - || strcmp(var->name, "gl_Color") == 0 - || strcmp(var->name, "gl_SecondaryColor") == 0) - && earlier->type == var->type - && earlier->data.mode == var->data.mode) { + && (strcmp(var->name, "gl_FrontColor") == 0 + || strcmp(var->name, "gl_BackColor") == 0 + || strcmp(var->name, "gl_FrontSecondaryColor") == 0 + || strcmp(var->name, "gl_BackSecondaryColor") == 0 + || strcmp(var->name, "gl_Color") == 0 + || strcmp(var->name, "gl_SecondaryColor") == 0) + && earlier->type == var->type + && earlier->data.mode == var->data.mode) { earlier->data.interpolation = var->data.interpolation; /* Layout qualifiers for gl_FragDepth. */ } else if ((state->AMD_conservative_depth_enable || state->ARB_conservative_depth_enable) - && strcmp(var->name, "gl_FragDepth") == 0 - && earlier->type == var->type - && earlier->data.mode == var->data.mode) { + && strcmp(var->name, "gl_FragDepth") == 0 + && earlier->type == var->type + && earlier->data.mode == var->data.mode) { /** From the AMD_conservative_depth spec: * Within any shader, the first redeclarations of gl_FragDepth * must appear before any use of gl_FragDepth. */ if (earlier->data.used) { - _mesa_glsl_error(&loc, state, - "the first redeclaration of gl_FragDepth " - "must appear before any use of gl_FragDepth"); + _mesa_glsl_error(&loc, state, + "the first redeclaration of gl_FragDepth " + "must appear before any use of gl_FragDepth"); } /* Prevent inconsistent redeclaration of depth layout qualifier. */ if (earlier->data.depth_layout != ir_depth_layout_none - && earlier->data.depth_layout != var->data.depth_layout) { - _mesa_glsl_error(&loc, state, - "gl_FragDepth: depth layout is declared here " - "as '%s, but it was previously declared as " - "'%s'", - depth_layout_string(var->data.depth_layout), - depth_layout_string(earlier->data.depth_layout)); + && earlier->data.depth_layout != var->data.depth_layout) { + _mesa_glsl_error(&loc, state, + "gl_FragDepth: depth layout is declared here " + "as '%s, but it was previously declared as " + "'%s'", + depth_layout_string(var->data.depth_layout), + depth_layout_string(earlier->data.depth_layout)); } earlier->data.depth_layout = var->data.depth_layout; @@ -2805,7 +2800,7 @@ process_initializer(ir_variable *var, ast_declaration *decl, */ if (var->type->contains_opaque()) { _mesa_glsl_error(& initializer_loc, state, - "cannot initialize opaque variable"); + "cannot initialize opaque variable"); } if ((var->data.mode == ir_var_shader_in) && (state->current_function == NULL)) { @@ -2824,8 +2819,7 @@ process_initializer(ir_variable *var, ast_declaration *decl, _mesa_ast_set_aggregate_type(var->type, decl->initializer); ir_dereference *const lhs = new(state) ir_dereference_variable(var); - ir_rvalue *rhs = decl->initializer->hir(initializer_instructions, - state); + ir_rvalue *rhs = decl->initializer->hir(initializer_instructions, state); /* Calculate the constant value if this is a const or uniform * declaration. @@ -2835,10 +2829,10 @@ process_initializer(ir_variable *var, ast_declaration *decl, ir_rvalue *new_rhs = validate_assignment(state, initializer_loc, var->type, rhs, true); if (new_rhs != NULL) { - rhs = new_rhs; + rhs = new_rhs; - ir_constant *constant_value = rhs->constant_expression_value(); - if (!constant_value) { + ir_constant *constant_value = rhs->constant_expression_value(); + if (!constant_value) { /* If ARB_shading_language_420pack is enabled, initializers of * const-qualified local variables do not have to be constant * expressions. Const-qualified global variables must still be @@ -2858,35 +2852,35 @@ process_initializer(ir_variable *var, ast_declaration *decl, } } } else { - rhs = constant_value; - var->constant_value = constant_value; - } + rhs = constant_value; + var->constant_value = constant_value; + } } else { - if (var->type->is_numeric()) { - /* Reduce cascading errors. */ - var->constant_value = ir_constant::zero(state, var->type); - } + if (var->type->is_numeric()) { + /* Reduce cascading errors. */ + var->constant_value = ir_constant::zero(state, var->type); + } } } if (rhs && !rhs->type->is_error()) { bool temp = var->data.read_only; if (type->qualifier.flags.q.constant) - var->data.read_only = false; + var->data.read_only = false; /* Never emit code to initialize a uniform. */ const glsl_type *initializer_type; if (!type->qualifier.flags.q.uniform) { - do_assignment(initializer_instructions, state, + do_assignment(initializer_instructions, state, NULL, lhs, rhs, &result, true, true, type->get_location()); - initializer_type = result->type; + initializer_type = result->type; } else - initializer_type = rhs->type; + initializer_type = rhs->type; var->constant_initializer = rhs->constant_expression_value(); var->data.has_initializer = true; @@ -3033,7 +3027,7 @@ validate_identifier(const char *identifier, YYLTYPE loc, ir_rvalue * ast_declarator_list::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { void *ctx = state; const struct glsl_type *decl_type; @@ -3056,39 +3050,33 @@ ast_declarator_list::hir(exec_list *instructions, assert(this->type == NULL); if (state->current_function != NULL) { - _mesa_glsl_error(& loc, state, - "all uses of `invariant' keyword must be at global " - "scope"); + _mesa_glsl_error(& loc, state, + "all uses of `invariant' keyword must be at global " + "scope"); } foreach_list_typed (ast_declaration, decl, link, &this->declarations) { - assert(decl->array_specifier == NULL); - assert(decl->initializer == NULL); - - ir_variable *const earlier = - state->symbols->get_variable(decl->identifier); - if (earlier == NULL) { - _mesa_glsl_error(& loc, state, - "undeclared variable `%s' cannot be marked " - "invariant", decl->identifier); - } else if ((state->stage == MESA_SHADER_VERTEX) - && (earlier->data.mode != ir_var_shader_out)) { - _mesa_glsl_error(& loc, state, - "`%s' cannot be marked invariant, vertex shader " - "outputs only", decl->identifier); - } else if ((state->stage == MESA_SHADER_FRAGMENT) - && (earlier->data.mode != ir_var_shader_in)) { - _mesa_glsl_error(& loc, state, - "`%s' cannot be marked invariant, fragment shader " - "inputs only", decl->identifier); - } else if (earlier->data.used) { - _mesa_glsl_error(& loc, state, - "variable `%s' may not be redeclared " - "`invariant' after being used", - earlier->name); - } else { - earlier->data.invariant = true; - } + assert(decl->array_specifier == NULL); + assert(decl->initializer == NULL); + + ir_variable *const earlier = + state->symbols->get_variable(decl->identifier); + if (earlier == NULL) { + _mesa_glsl_error(& loc, state, + "undeclared variable `%s' cannot be marked " + "invariant", decl->identifier); + } else if (!is_varying_var(earlier, state->stage)) { + _mesa_glsl_error(&loc, state, + "`%s' cannot be marked invariant; interfaces between " + "shader stages only.", decl->identifier); + } else if (earlier->data.used) { + _mesa_glsl_error(& loc, state, + "variable `%s' may not be redeclared " + "`invariant' after being used", + earlier->name); + } else { + earlier->data.invariant = true; + } } /* Invariant redeclarations do not have r-values. @@ -3185,16 +3173,16 @@ ast_declarator_list::hir(exec_list *instructions, */ if ((decl_type == NULL) || decl_type->is_void()) { - if (type_name != NULL) { - _mesa_glsl_error(& loc, state, - "invalid type `%s' in declaration of `%s'", - type_name, decl->identifier); - } else { - _mesa_glsl_error(& loc, state, - "invalid type in declaration of `%s'", - decl->identifier); - } - continue; + if (type_name != NULL) { + _mesa_glsl_error(& loc, state, + "invalid type `%s' in declaration of `%s'", + type_name, decl->identifier); + } else { + _mesa_glsl_error(& loc, state, + "invalid type in declaration of `%s'", + decl->identifier); + } + continue; } var_type = process_array_type(&loc, decl_type, decl->array_specifier, @@ -3225,7 +3213,7 @@ ast_declarator_list::hir(exec_list *instructions, /* From page 22 (page 28 of the PDF) of the GLSL 1.10 specification; * * "Global variables can only use the qualifiers const, - * attribute, uni form, or varying. Only one may be + * attribute, uniform, or varying. Only one may be * specified. * * Local variables can only use the qualifier const." @@ -3234,95 +3222,86 @@ ast_declarator_list::hir(exec_list *instructions, * any extension that adds the 'layout' keyword. */ if (!state->is_version(130, 300) - && !state->has_explicit_attrib_location() - && !state->has_separate_shader_objects() - && !state->ARB_fragment_coord_conventions_enable) { - if (this->type->qualifier.flags.q.out) { - _mesa_glsl_error(& loc, state, - "`out' qualifier in declaration of `%s' " - "only valid for function parameters in %s", - decl->identifier, state->get_version_string()); - } - if (this->type->qualifier.flags.q.in) { - _mesa_glsl_error(& loc, state, - "`in' qualifier in declaration of `%s' " - "only valid for function parameters in %s", - decl->identifier, state->get_version_string()); - } - /* FINISHME: Test for other invalid qualifiers. */ + && !state->has_explicit_attrib_location() + && !state->has_separate_shader_objects() + && !state->ARB_fragment_coord_conventions_enable) { + if (this->type->qualifier.flags.q.out) { + _mesa_glsl_error(& loc, state, + "`out' qualifier in declaration of `%s' " + "only valid for function parameters in %s", + decl->identifier, state->get_version_string()); + } + if (this->type->qualifier.flags.q.in) { + _mesa_glsl_error(& loc, state, + "`in' qualifier in declaration of `%s' " + "only valid for function parameters in %s", + decl->identifier, state->get_version_string()); + } + /* FINISHME: Test for other invalid qualifiers. */ } apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc, false); if (this->type->qualifier.flags.q.invariant) { - if ((state->stage == MESA_SHADER_VERTEX) && - var->data.mode != ir_var_shader_out) { - _mesa_glsl_error(& loc, state, - "`%s' cannot be marked invariant, vertex shader " - "outputs only", var->name); - } else if ((state->stage == MESA_SHADER_FRAGMENT) && - var->data.mode != ir_var_shader_in) { - /* FINISHME: Note that this doesn't work for invariant on - * a function signature inval - */ - _mesa_glsl_error(& loc, state, - "`%s' cannot be marked invariant, fragment shader " - "inputs only", var->name); - } + if (!is_varying_var(var, state->stage)) { + _mesa_glsl_error(&loc, state, + "`%s' cannot be marked invariant; interfaces between " + "shader stages only", var->name); + } } if (state->current_function != NULL) { - const char *mode = NULL; - const char *extra = ""; - - /* There is no need to check for 'inout' here because the parser will - * only allow that in function parameter lists. - */ - if (this->type->qualifier.flags.q.attribute) { - mode = "attribute"; - } else if (this->type->qualifier.flags.q.uniform) { - mode = "uniform"; - } else if (this->type->qualifier.flags.q.varying) { - mode = "varying"; - } else if (this->type->qualifier.flags.q.in) { - mode = "in"; - extra = " or in function parameter list"; - } else if (this->type->qualifier.flags.q.out) { - mode = "out"; - extra = " or in function parameter list"; - } - - if (mode) { - _mesa_glsl_error(& loc, state, - "%s variable `%s' must be declared at " - "global scope%s", - mode, var->name, extra); - } + const char *mode = NULL; + const char *extra = ""; + + /* There is no need to check for 'inout' here because the parser will + * only allow that in function parameter lists. + */ + if (this->type->qualifier.flags.q.attribute) { + mode = "attribute"; + } else if (this->type->qualifier.flags.q.uniform) { + mode = "uniform"; + } else if (this->type->qualifier.flags.q.varying) { + mode = "varying"; + } else if (this->type->qualifier.flags.q.in) { + mode = "in"; + extra = " or in function parameter list"; + } else if (this->type->qualifier.flags.q.out) { + mode = "out"; + extra = " or in function parameter list"; + } + + if (mode) { + _mesa_glsl_error(& loc, state, + "%s variable `%s' must be declared at " + "global scope%s", + mode, var->name, extra); + } } else if (var->data.mode == ir_var_shader_in) { var->data.read_only = true; - if (state->stage == MESA_SHADER_VERTEX) { - bool error_emitted = false; - - /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec: - * - * "Vertex shader inputs can only be float, floating-point - * vectors, matrices, signed and unsigned integers and integer - * vectors. Vertex shader inputs can also form arrays of these - * types, but not structures." - * - * From page 31 (page 27 of the PDF) of the GLSL 1.30 spec: - * - * "Vertex shader inputs can only be float, floating-point - * vectors, matrices, signed and unsigned integers and integer - * vectors. They cannot be arrays or structures." - * - * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec: - * - * "The attribute qualifier can be used only with float, - * floating-point vectors, and matrices. Attribute variables - * cannot be declared as arrays or structures." + if (state->stage == MESA_SHADER_VERTEX) { + bool error_emitted = false; + + /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec: + * + * "Vertex shader inputs can only be float, floating-point + * vectors, matrices, signed and unsigned integers and integer + * vectors. Vertex shader inputs can also form arrays of these + * types, but not structures." + * + * From page 31 (page 27 of the PDF) of the GLSL 1.30 spec: + * + * "Vertex shader inputs can only be float, floating-point + * vectors, matrices, signed and unsigned integers and integer + * vectors. They cannot be arrays or structures." + * + * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec: + * + * "The attribute qualifier can be used only with float, + * floating-point vectors, and matrices. Attribute variables + * cannot be declared as arrays or structures." * * From page 33 (page 39 of the PDF) of the GLSL ES 3.00 spec: * @@ -3330,35 +3309,35 @@ ast_declarator_list::hir(exec_list *instructions, * vectors, matrices, signed and unsigned integers and integer * vectors. Vertex shader inputs cannot be arrays or * structures." - */ + */ const glsl_type *check_type = var->type; while (check_type->is_array()) check_type = check_type->element_type(); - switch (check_type->base_type) { - case GLSL_TYPE_FLOAT: - break; - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - if (state->is_version(120, 300)) - break; - /* FALLTHROUGH */ - default: - _mesa_glsl_error(& loc, state, - "vertex shader input / attribute cannot have " - "type %s`%s'", - var->type->is_array() ? "array of " : "", - check_type->name); - error_emitted = true; - } - - if (!error_emitted && var->type->is_array() && + switch (check_type->base_type) { + case GLSL_TYPE_FLOAT: + break; + case GLSL_TYPE_UINT: + case GLSL_TYPE_INT: + if (state->is_version(120, 300)) + break; + /* FALLTHROUGH */ + default: + _mesa_glsl_error(& loc, state, + "vertex shader input / attribute cannot have " + "type %s`%s'", + var->type->is_array() ? "array of " : "", + check_type->name); + error_emitted = true; + } + + if (!error_emitted && var->type->is_array() && !state->check_version(150, 0, &loc, "vertex shader input / attribute " "cannot have array type")) { - error_emitted = true; - } - } else if (state->stage == MESA_SHADER_GEOMETRY) { + error_emitted = true; + } + } else if (state->stage == MESA_SHADER_GEOMETRY) { /* From section 4.3.4 (Inputs) of the GLSL 1.50 spec: * * Geometry shader input variables get the per-vertex values @@ -3607,9 +3586,9 @@ ast_declarator_list::hir(exec_list *instructions, } if (decl->initializer != NULL) { - result = process_initializer((earlier == NULL) ? var : earlier, - decl, this->type, - &initializer_instructions, state); + result = process_initializer((earlier == NULL) ? var : earlier, + decl, this->type, + &initializer_instructions, state); } /* From page 23 (page 29 of the PDF) of the GLSL 1.10 spec: @@ -3619,14 +3598,14 @@ ast_declarator_list::hir(exec_list *instructions, * declared." */ if (this->type->qualifier.flags.q.constant && decl->initializer == NULL) { - _mesa_glsl_error(& loc, state, - "const declaration of `%s' must be initialized", - decl->identifier); + _mesa_glsl_error(& loc, state, + "const declaration of `%s' must be initialized", + decl->identifier); } if (state->es_shader) { - const glsl_type *const t = (earlier == NULL) - ? var->type : earlier->type; + const glsl_type *const t = (earlier == NULL) + ? var->type : earlier->type; if (t->is_unsized_array()) /* Section 10.17 of the GLSL ES 1.00 specification states that @@ -3658,32 +3637,32 @@ ast_declarator_list::hir(exec_list *instructions, if (earlier == NULL) { validate_identifier(decl->identifier, loc, state); - /* Add the variable to the symbol table. Note that the initializer's - * IR was already processed earlier (though it hasn't been emitted - * yet), without the variable in scope. - * - * This differs from most C-like languages, but it follows the GLSL - * specification. From page 28 (page 34 of the PDF) of the GLSL 1.50 - * spec: - * - * "Within a declaration, the scope of a name starts immediately - * after the initializer if present or immediately after the name - * being declared if not." - */ - if (!state->symbols->add_variable(var)) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(&loc, state, "name `%s' already taken in the " - "current scope", decl->identifier); - continue; - } - - /* Push the variable declaration to the top. It means that all the - * variable declarations will appear in a funny last-to-first order, - * but otherwise we run into trouble if a function is prototyped, a - * global var is decled, then the function is defined with usage of - * the global var. See glslparsertest's CorrectModule.frag. - */ - instructions->push_head(var); + /* Add the variable to the symbol table. Note that the initializer's + * IR was already processed earlier (though it hasn't been emitted + * yet), without the variable in scope. + * + * This differs from most C-like languages, but it follows the GLSL + * specification. From page 28 (page 34 of the PDF) of the GLSL 1.50 + * spec: + * + * "Within a declaration, the scope of a name starts immediately + * after the initializer if present or immediately after the name + * being declared if not." + */ + if (!state->symbols->add_variable(var)) { + YYLTYPE loc = this->get_location(); + _mesa_glsl_error(&loc, state, "name `%s' already taken in the " + "current scope", decl->identifier); + continue; + } + + /* Push the variable declaration to the top. It means that all the + * variable declarations will appear in a funny last-to-first order, + * but otherwise we run into trouble if a function is prototyped, a + * global var is decled, then the function is defined with usage of + * the global var. See glslparsertest's CorrectModule.frag. + */ + instructions->push_head(var); } instructions->append_list(&initializer_instructions); @@ -3705,7 +3684,7 @@ ast_declarator_list::hir(exec_list *instructions, ir_rvalue * ast_parameter_declarator::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { void *ctx = state; const struct glsl_type *type; @@ -3716,13 +3695,13 @@ ast_parameter_declarator::hir(exec_list *instructions, if (type == NULL) { if (name != NULL) { - _mesa_glsl_error(& loc, state, - "invalid type `%s' in declaration of `%s'", - name, this->identifier); + _mesa_glsl_error(& loc, state, + "invalid type `%s' in declaration of `%s'", + name, this->identifier); } else { - _mesa_glsl_error(& loc, state, - "invalid type in declaration of `%s'", - this->identifier); + _mesa_glsl_error(& loc, state, + "invalid type in declaration of `%s'", + this->identifier); } type = glsl_type::error_type; @@ -3742,8 +3721,8 @@ ast_parameter_declarator::hir(exec_list *instructions, */ if (type->is_void()) { if (this->identifier != NULL) - _mesa_glsl_error(& loc, state, - "named parameter cannot have type `void'"); + _mesa_glsl_error(& loc, state, + "named parameter cannot have type `void'"); is_void = true; return NULL; @@ -3761,7 +3740,7 @@ ast_parameter_declarator::hir(exec_list *instructions, if (!type->is_error() && type->is_unsized_array()) { _mesa_glsl_error(&loc, state, "arrays passed as parameters must have " - "a declared size"); + "a declared size"); type = glsl_type::error_type; } @@ -3773,7 +3752,7 @@ ast_parameter_declarator::hir(exec_list *instructions, * for function parameters the default mode is 'in'. */ apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc, - true); + true); /* From section 4.1.7 of the GLSL 4.40 spec: * @@ -3819,9 +3798,9 @@ ast_parameter_declarator::hir(exec_list *instructions, void ast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters, - bool formal, - exec_list *ir_parameters, - _mesa_glsl_parse_state *state) + bool formal, + exec_list *ir_parameters, + _mesa_glsl_parse_state *state) { ast_parameter_declarator *void_param = NULL; unsigned count = 0; @@ -3831,7 +3810,7 @@ ast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters, param->hir(ir_parameters, state); if (param->is_void) - void_param = param; + void_param = param; count++; } @@ -3840,7 +3819,7 @@ ast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters, YYLTYPE loc = void_param->get_location(); _mesa_glsl_error(& loc, state, - "`void' parameter must be only parameter"); + "`void' parameter must be only parameter"); } } @@ -3861,7 +3840,7 @@ emit_function(_mesa_glsl_parse_state *state, ir_function *f) ir_rvalue * ast_function::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { void *ctx = state; ir_function *f = NULL; @@ -3903,8 +3882,8 @@ ast_function::hir(exec_list *instructions, * signatures for functions with the same name. */ ast_parameter_declarator::parameters_to_hir(& this->parameters, - is_definition, - & hir_parameters, state); + is_definition, + & hir_parameters, state); const char *return_type_name; const glsl_type *return_type = @@ -3913,8 +3892,8 @@ ast_function::hir(exec_list *instructions, if (!return_type) { YYLTYPE loc = this->get_location(); _mesa_glsl_error(&loc, state, - "function `%s' has undeclared return type `%s'", - name, return_type_name); + "function `%s' has undeclared return type `%s'", + name, return_type_name); return_type = glsl_type::error_type; } @@ -3924,7 +3903,7 @@ ast_function::hir(exec_list *instructions, if (this->return_type->has_qualifiers()) { YYLTYPE loc = this->get_location(); _mesa_glsl_error(& loc, state, - "function `%s' return type has qualifiers", name); + "function `%s' return type has qualifiers", name); } /* Section 6.1 (Function Definitions) of the GLSL 1.20 spec says: @@ -3935,8 +3914,8 @@ ast_function::hir(exec_list *instructions, if (return_type->is_unsized_array()) { YYLTYPE loc = this->get_location(); _mesa_glsl_error(& loc, state, - "function `%s' return type array must be explicitly " - "sized", name); + "function `%s' return type array must be explicitly " + "sized", name); } /* From section 4.1.7 of the GLSL 4.40 spec: @@ -3959,20 +3938,20 @@ ast_function::hir(exec_list *instructions, if (f != NULL && (state->es_shader || f->has_user_signature())) { sig = f->exact_matching_signature(state, &hir_parameters); if (sig != NULL) { - const char *badvar = sig->qualifiers_match(&hir_parameters); - if (badvar != NULL) { - YYLTYPE loc = this->get_location(); + const char *badvar = sig->qualifiers_match(&hir_parameters); + if (badvar != NULL) { + YYLTYPE loc = this->get_location(); - _mesa_glsl_error(&loc, state, "function `%s' parameter `%s' " - "qualifiers don't match prototype", name, badvar); - } + _mesa_glsl_error(&loc, state, "function `%s' parameter `%s' " + "qualifiers don't match prototype", name, badvar); + } - if (sig->return_type != return_type) { - YYLTYPE loc = this->get_location(); + if (sig->return_type != return_type) { + YYLTYPE loc = this->get_location(); - _mesa_glsl_error(&loc, state, "function `%s' return type doesn't " - "match prototype", name); - } + _mesa_glsl_error(&loc, state, "function `%s' return type doesn't " + "match prototype", name); + } if (sig->is_defined) { if (is_definition) { @@ -3985,17 +3964,17 @@ ast_function::hir(exec_list *instructions, */ return NULL; } - } + } } } else { f = new(ctx) ir_function(name); if (!state->symbols->add_function(f)) { - /* This function name shadows a non-function use of the same name. */ - YYLTYPE loc = this->get_location(); + /* This function name shadows a non-function use of the same name. */ + YYLTYPE loc = this->get_location(); - _mesa_glsl_error(&loc, state, "function name `%s' conflicts with " - "non-function", name); - return NULL; + _mesa_glsl_error(&loc, state, "function name `%s' conflicts with " + "non-function", name); + return NULL; } emit_function(state, f); @@ -4004,15 +3983,15 @@ ast_function::hir(exec_list *instructions, /* Verify the return type of main() */ if (strcmp(name, "main") == 0) { if (! return_type->is_void()) { - YYLTYPE loc = this->get_location(); + YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, "main() must return void"); + _mesa_glsl_error(& loc, state, "main() must return void"); } if (!hir_parameters.is_empty()) { - YYLTYPE loc = this->get_location(); + YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, "main() must not take any parameters"); + _mesa_glsl_error(& loc, state, "main() must not take any parameters"); } } @@ -4034,7 +4013,7 @@ ast_function::hir(exec_list *instructions, ir_rvalue * ast_function_definition::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { prototype->is_definition = true; prototype->hir(instructions, state); @@ -4060,11 +4039,11 @@ ast_function_definition::hir(exec_list *instructions, * the same name. */ if (state->symbols->name_declared_this_scope(var->name)) { - YYLTYPE loc = this->get_location(); + YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name); + _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name); } else { - state->symbols->add_variable(var); + state->symbols->add_variable(var); } } @@ -4080,9 +4059,9 @@ ast_function_definition::hir(exec_list *instructions, if (!signature->return_type->is_void() && !state->found_return) { YYLTYPE loc = this->get_location(); _mesa_glsl_error(& loc, state, "function `%s' has non-void return type " - "%s, but no return statement", - signature->function_name(), - signature->return_type->name); + "%s, but no return statement", + signature->function_name(), + signature->return_type->name); } /* Function definitions do not have r-values. @@ -4093,7 +4072,7 @@ ast_function_definition::hir(exec_list *instructions, ir_rvalue * ast_jump_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { void *ctx = state; @@ -4103,23 +4082,23 @@ ast_jump_statement::hir(exec_list *instructions, assert(state->current_function); if (opt_return_value) { - ir_rvalue *ret = opt_return_value->hir(instructions, state); - - /* The value of the return type can be NULL if the shader says - * 'return foo();' and foo() is a function that returns void. - * - * NOTE: The GLSL spec doesn't say that this is an error. The type - * of the return value is void. If the return type of the function is - * also void, then this should compile without error. Seriously. - */ - const glsl_type *const ret_type = - (ret == NULL) ? glsl_type::void_type : ret->type; + ir_rvalue *ret = opt_return_value->hir(instructions, state); + + /* The value of the return type can be NULL if the shader says + * 'return foo();' and foo() is a function that returns void. + * + * NOTE: The GLSL spec doesn't say that this is an error. The type + * of the return value is void. If the return type of the function is + * also void, then this should compile without error. Seriously. + */ + const glsl_type *const ret_type = + (ret == NULL) ? glsl_type::void_type : ret->type; /* Implicit conversions are not allowed for return values prior to * ARB_shading_language_420pack. */ if (state->current_function->return_type != ret_type) { - YYLTYPE loc = this->get_location(); + YYLTYPE loc = this->get_location(); if (state->ARB_shading_language_420pack_enable) { if (!apply_implicit_conversion(state->current_function->return_type, @@ -4156,18 +4135,18 @@ ast_jump_statement::hir(exec_list *instructions, "return argument"); } - inst = new(ctx) ir_return(ret); + inst = new(ctx) ir_return(ret); } else { - if (state->current_function->return_type->base_type != - GLSL_TYPE_VOID) { - YYLTYPE loc = this->get_location(); - - _mesa_glsl_error(& loc, state, - "`return' with no value, in function %s returning " - "non-void", - state->current_function->function_name()); - } - inst = new(ctx) ir_return; + if (state->current_function->return_type->base_type != + GLSL_TYPE_VOID) { + YYLTYPE loc = this->get_location(); + + _mesa_glsl_error(& loc, state, + "`return' with no value, in function %s returning " + "non-void", + state->current_function->function_name()); + } + inst = new(ctx) ir_return; } state->found_return = true; @@ -4177,10 +4156,10 @@ ast_jump_statement::hir(exec_list *instructions, case ast_discard: if (state->stage != MESA_SHADER_FRAGMENT) { - YYLTYPE loc = this->get_location(); + YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, - "`discard' may only appear in a fragment shader"); + _mesa_glsl_error(& loc, state, + "`discard' may only appear in a fragment shader"); } instructions->push_tail(new(ctx) ir_discard); break; @@ -4188,26 +4167,25 @@ ast_jump_statement::hir(exec_list *instructions, case ast_break: case ast_continue: if (mode == ast_continue && - state->loop_nesting_ast == NULL) { - YYLTYPE loc = this->get_location(); + state->loop_nesting_ast == NULL) { + YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, - "continue may only appear in a loop"); + _mesa_glsl_error(& loc, state, "continue may only appear in a loop"); } else if (mode == ast_break && - state->loop_nesting_ast == NULL && - state->switch_state.switch_nesting_ast == NULL) { - YYLTYPE loc = this->get_location(); + state->loop_nesting_ast == NULL && + state->switch_state.switch_nesting_ast == NULL) { + YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, - "break may only appear in a loop or a switch"); + _mesa_glsl_error(& loc, state, + "break may only appear in a loop or a switch"); } else { - /* For a loop, inline the for loop expression again, since we don't - * know where near the end of the loop body the normal copy of it is - * going to be placed. Same goes for the condition for a do-while - * loop. - */ - if (state->loop_nesting_ast != NULL && - mode == ast_continue) { + /* For a loop, inline the for loop expression again, since we don't + * know where near the end of the loop body the normal copy of it is + * going to be placed. Same goes for the condition for a do-while + * loop. + */ + if (state->loop_nesting_ast != NULL && + mode == ast_continue) { if (state->loop_nesting_ast->rest_expression) { state->loop_nesting_ast->rest_expression->hir(instructions, state); @@ -4218,26 +4196,26 @@ ast_jump_statement::hir(exec_list *instructions, } } - if (state->switch_state.is_switch_innermost && - mode == ast_break) { - /* Force break out of switch by setting is_break switch state. - */ - ir_variable *const is_break_var = state->switch_state.is_break_var; - ir_dereference_variable *const deref_is_break_var = - new(ctx) ir_dereference_variable(is_break_var); - ir_constant *const true_val = new(ctx) ir_constant(true); - ir_assignment *const set_break_var = - new(ctx) ir_assignment(deref_is_break_var, true_val); + if (state->switch_state.is_switch_innermost && + mode == ast_break) { + /* Force break out of switch by setting is_break switch state. + */ + ir_variable *const is_break_var = state->switch_state.is_break_var; + ir_dereference_variable *const deref_is_break_var = + new(ctx) ir_dereference_variable(is_break_var); + ir_constant *const true_val = new(ctx) ir_constant(true); + ir_assignment *const set_break_var = + new(ctx) ir_assignment(deref_is_break_var, true_val); - instructions->push_tail(set_break_var); - } - else { - ir_loop_jump *const jump = - new(ctx) ir_loop_jump((mode == ast_break) - ? ir_loop_jump::jump_break - : ir_loop_jump::jump_continue); - instructions->push_tail(jump); - } + instructions->push_tail(set_break_var); + } + else { + ir_loop_jump *const jump = + new(ctx) ir_loop_jump((mode == ast_break) + ? ir_loop_jump::jump_break + : ir_loop_jump::jump_continue); + instructions->push_tail(jump); + } } break; @@ -4251,7 +4229,7 @@ ast_jump_statement::hir(exec_list *instructions, ir_rvalue * ast_selection_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { void *ctx = state; @@ -4270,7 +4248,7 @@ ast_selection_statement::hir(exec_list *instructions, YYLTYPE loc = this->condition->get_location(); _mesa_glsl_error(& loc, state, "if-statement condition must be scalar " - "boolean"); + "boolean"); } ir_if *const stmt = new(ctx) ir_if(condition); @@ -4297,7 +4275,7 @@ ast_selection_statement::hir(exec_list *instructions, ir_rvalue * ast_switch_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { void *ctx = state; @@ -4314,9 +4292,9 @@ ast_switch_statement::hir(exec_list *instructions, YYLTYPE loc = this->test_expression->get_location(); _mesa_glsl_error(& loc, - state, - "switch-statement expression must be scalar " - "integer"); + state, + "switch-statement expression must be scalar " + "integer"); } /* Track the switch-statement nesting in a stack-like manner. @@ -4334,27 +4312,28 @@ ast_switch_statement::hir(exec_list *instructions, ir_rvalue *const is_fallthru_val = new (ctx) ir_constant(false); state->switch_state.is_fallthru_var = new(ctx) ir_variable(glsl_type::bool_type, - "switch_is_fallthru_tmp", - ir_var_temporary); + "switch_is_fallthru_tmp", + ir_var_temporary); instructions->push_tail(state->switch_state.is_fallthru_var); ir_dereference_variable *deref_is_fallthru_var = new(ctx) ir_dereference_variable(state->switch_state.is_fallthru_var); instructions->push_tail(new(ctx) ir_assignment(deref_is_fallthru_var, - is_fallthru_val)); + is_fallthru_val)); /* Initalize is_break state to false. */ ir_rvalue *const is_break_val = new (ctx) ir_constant(false); - state->switch_state.is_break_var = new(ctx) ir_variable(glsl_type::bool_type, - "switch_is_break_tmp", - ir_var_temporary); + state->switch_state.is_break_var = + new(ctx) ir_variable(glsl_type::bool_type, + "switch_is_break_tmp", + ir_var_temporary); instructions->push_tail(state->switch_state.is_break_var); ir_dereference_variable *deref_is_break_var = new(ctx) ir_dereference_variable(state->switch_state.is_break_var); instructions->push_tail(new(ctx) ir_assignment(deref_is_break_var, - is_break_val)); + is_break_val)); /* Cache test expression. */ @@ -4375,7 +4354,7 @@ ast_switch_statement::hir(exec_list *instructions, void ast_switch_statement::test_to_hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { void *ctx = state; @@ -4385,8 +4364,8 @@ ast_switch_statement::test_to_hir(exec_list *instructions, state); state->switch_state.test_var = new(ctx) ir_variable(test_val->type, - "switch_test_tmp", - ir_var_temporary); + "switch_test_tmp", + ir_var_temporary); ir_dereference_variable *deref_test_var = new(ctx) ir_dereference_variable(state->switch_state.test_var); @@ -4397,7 +4376,7 @@ ast_switch_statement::test_to_hir(exec_list *instructions, ir_rvalue * ast_switch_body::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { if (stmts != NULL) stmts->hir(instructions, state); @@ -4408,7 +4387,7 @@ ast_switch_body::hir(exec_list *instructions, ir_rvalue * ast_case_statement_list::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { foreach_list_typed (ast_case_statement, case_stmt, link, & this->cases) case_stmt->hir(instructions, state); @@ -4419,7 +4398,7 @@ ast_case_statement_list::hir(exec_list *instructions, ir_rvalue * ast_case_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { labels->hir(instructions, state); @@ -4431,8 +4410,8 @@ ast_case_statement::hir(exec_list *instructions, new(state) ir_dereference_variable(state->switch_state.is_break_var); ir_assignment *const reset_fallthru_on_break = new(state) ir_assignment(deref_is_fallthru_var, - false_val, - deref_is_break_var); + false_val, + deref_is_break_var); instructions->push_tail(reset_fallthru_on_break); /* Guard case statements depending on fallthru state. */ @@ -4452,7 +4431,7 @@ ast_case_statement::hir(exec_list *instructions, ir_rvalue * ast_case_label_list::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { foreach_list_typed (ast_case_label, label, link, & this->labels) label->hir(instructions, state); @@ -4463,7 +4442,7 @@ ast_case_label_list::hir(exec_list *instructions, ir_rvalue * ast_case_label::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { void *ctx = state; @@ -4481,62 +4460,57 @@ ast_case_label::hir(exec_list *instructions, ir_constant *label_const = label_rval->constant_expression_value(); if (!label_const) { - YYLTYPE loc = this->test_value->get_location(); + YYLTYPE loc = this->test_value->get_location(); - _mesa_glsl_error(& loc, state, - "switch statement case label must be a " - "constant expression"); + _mesa_glsl_error(& loc, state, + "switch statement case label must be a " + "constant expression"); - /* Stuff a dummy value in to allow processing to continue. */ - label_const = new(ctx) ir_constant(0); + /* Stuff a dummy value in to allow processing to continue. */ + label_const = new(ctx) ir_constant(0); } else { - ast_expression *previous_label = (ast_expression *) - hash_table_find(state->switch_state.labels_ht, - (void *)(uintptr_t)label_const->value.u[0]); - - if (previous_label) { - YYLTYPE loc = this->test_value->get_location(); - _mesa_glsl_error(& loc, state, - "duplicate case value"); - - loc = previous_label->get_location(); - _mesa_glsl_error(& loc, state, - "this is the previous case label"); - } else { - hash_table_insert(state->switch_state.labels_ht, - this->test_value, - (void *)(uintptr_t)label_const->value.u[0]); - } + ast_expression *previous_label = (ast_expression *) + hash_table_find(state->switch_state.labels_ht, + (void *)(uintptr_t)label_const->value.u[0]); + + if (previous_label) { + YYLTYPE loc = this->test_value->get_location(); + _mesa_glsl_error(& loc, state, "duplicate case value"); + + loc = previous_label->get_location(); + _mesa_glsl_error(& loc, state, "this is the previous case label"); + } else { + hash_table_insert(state->switch_state.labels_ht, + this->test_value, + (void *)(uintptr_t)label_const->value.u[0]); + } } ir_dereference_variable *deref_test_var = - new(ctx) ir_dereference_variable(state->switch_state.test_var); + new(ctx) ir_dereference_variable(state->switch_state.test_var); ir_rvalue *const test_cond = new(ctx) ir_expression(ir_binop_all_equal, - label_const, - deref_test_var); + label_const, + deref_test_var); ir_assignment *set_fallthru_on_test = - new(ctx) ir_assignment(deref_fallthru_var, - true_val, - test_cond); + new(ctx) ir_assignment(deref_fallthru_var, true_val, test_cond); instructions->push_tail(set_fallthru_on_test); } else { /* default case */ if (state->switch_state.previous_default) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, - "multiple default labels in one switch"); + YYLTYPE loc = this->get_location(); + _mesa_glsl_error(& loc, state, + "multiple default labels in one switch"); - loc = state->switch_state.previous_default->get_location(); - _mesa_glsl_error(& loc, state, - "this is the first default label"); + loc = state->switch_state.previous_default->get_location(); + _mesa_glsl_error(& loc, state, "this is the first default label"); } state->switch_state.previous_default = this; /* Set falltrhu state. */ ir_assignment *set_fallthru = - new(ctx) ir_assignment(deref_fallthru_var, true_val); + new(ctx) ir_assignment(deref_fallthru_var, true_val); instructions->push_tail(set_fallthru); } @@ -4547,34 +4521,34 @@ ast_case_label::hir(exec_list *instructions, void ast_iteration_statement::condition_to_hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { void *ctx = state; if (condition != NULL) { ir_rvalue *const cond = - condition->hir(instructions, state); + condition->hir(instructions, state); if ((cond == NULL) - || !cond->type->is_boolean() || !cond->type->is_scalar()) { - YYLTYPE loc = condition->get_location(); + || !cond->type->is_boolean() || !cond->type->is_scalar()) { + YYLTYPE loc = condition->get_location(); - _mesa_glsl_error(& loc, state, - "loop condition must be scalar boolean"); + _mesa_glsl_error(& loc, state, + "loop condition must be scalar boolean"); } else { - /* As the first code in the loop body, generate a block that looks - * like 'if (!condition) break;' as the loop termination condition. - */ - ir_rvalue *const not_cond = - new(ctx) ir_expression(ir_unop_logic_not, cond); + /* As the first code in the loop body, generate a block that looks + * like 'if (!condition) break;' as the loop termination condition. + */ + ir_rvalue *const not_cond = + new(ctx) ir_expression(ir_unop_logic_not, cond); - ir_if *const if_stmt = new(ctx) ir_if(not_cond); + ir_if *const if_stmt = new(ctx) ir_if(not_cond); - ir_jump *const break_stmt = - new(ctx) ir_loop_jump(ir_loop_jump::jump_break); + ir_jump *const break_stmt = + new(ctx) ir_loop_jump(ir_loop_jump::jump_break); - if_stmt->then_instructions.push_tail(break_stmt); - instructions->push_tail(if_stmt); + if_stmt->then_instructions.push_tail(break_stmt); + instructions->push_tail(if_stmt); } } } @@ -4582,7 +4556,7 @@ ast_iteration_statement::condition_to_hir(exec_list *instructions, ir_rvalue * ast_iteration_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { void *ctx = state; @@ -4674,7 +4648,7 @@ is_valid_default_precision_type(const struct glsl_type *const type) ir_rvalue * ast_type_specifier::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { if (this->default_precision == ast_precision_none && this->structure == NULL) return NULL; @@ -4796,10 +4770,10 @@ ast_type_specifier::hir(exec_list *instructions, */ unsigned ast_process_structure_or_interface_block(exec_list *instructions, - struct _mesa_glsl_parse_state *state, - exec_list *declarations, - YYLTYPE &loc, - glsl_struct_field **fields_ret, + struct _mesa_glsl_parse_state *state, + exec_list *declarations, + YYLTYPE &loc, + glsl_struct_field **fields_ret, bool is_interface, bool block_row_major, bool allow_reserved_names, @@ -4814,7 +4788,7 @@ ast_process_structure_or_interface_block(exec_list *instructions, */ foreach_list_typed (ast_declarator_list, decl_list, link, declarations) { foreach_list_const (decl_ptr, & decl_list->declarations) { - decl_count++; + decl_count++; } } @@ -4824,7 +4798,7 @@ ast_process_structure_or_interface_block(exec_list *instructions, * other structure definitions or in interface blocks are processed. */ glsl_struct_field *const fields = ralloc_array(state, glsl_struct_field, - decl_count); + decl_count); unsigned i = 0; foreach_list_typed (ast_declarator_list, decl_list, link, declarations) { @@ -4836,15 +4810,15 @@ ast_process_structure_or_interface_block(exec_list *instructions, * embedded structure definitions have been removed from the language. */ if (state->es_shader && decl_list->type->specifier->structure != NULL) { - _mesa_glsl_error(&loc, state, "embedded structure definitions are " - "not allowed in GLSL ES 1.00"); + _mesa_glsl_error(&loc, state, "embedded structure definitions are " + "not allowed in GLSL ES 1.00"); } const glsl_type *decl_type = decl_list->type->glsl_type(& type_name, state); foreach_list_typed (ast_declaration, decl, link, - &decl_list->declarations) { + &decl_list->declarations) { if (!allow_reserved_names) validate_identifier(decl->identifier, loc, state); @@ -4899,10 +4873,10 @@ ast_process_structure_or_interface_block(exec_list *instructions, "members"); } - field_type = process_array_type(&loc, decl_type, + field_type = process_array_type(&loc, decl_type, decl->array_specifier, state); fields[i].type = field_type; - fields[i].name = decl->identifier; + fields[i].name = decl->identifier; fields[i].location = -1; fields[i].interpolation = interpret_interpolation_qualifier(qual, var_mode, state, &loc); @@ -4933,7 +4907,7 @@ ast_process_structure_or_interface_block(exec_list *instructions, fields[i].row_major = false; } - i++; + i++; } } @@ -4946,7 +4920,7 @@ ast_process_structure_or_interface_block(exec_list *instructions, ir_rvalue * ast_struct_specifier::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { YYLTYPE loc = this->get_location(); @@ -4980,10 +4954,10 @@ ast_struct_specifier::hir(exec_list *instructions, glsl_struct_field *fields; unsigned decl_count = ast_process_structure_or_interface_block(instructions, - state, - &this->declarations, - loc, - &fields, + state, + &this->declarations, + loc, + &fields, false, false, false /* allow_reserved_names */, @@ -4998,12 +4972,12 @@ ast_struct_specifier::hir(exec_list *instructions, _mesa_glsl_error(& loc, state, "struct `%s' previously defined", name); } else { const glsl_type **s = reralloc(state, state->user_structures, - const glsl_type *, - state->num_user_structures + 1); + const glsl_type *, + state->num_user_structures + 1); if (s != NULL) { - s[state->num_user_structures] = t; - state->user_structures = s; - state->num_user_structures++; + s[state->num_user_structures] = t; + state->user_structures = s; + state->num_user_structures++; } } @@ -5049,7 +5023,7 @@ private: ir_rvalue * ast_interface_block::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state) { YYLTYPE loc = this->get_location(); @@ -5560,7 +5534,7 @@ ast_cs_input_layout::hir(exec_list *instructions, static void detect_conflicting_assignments(struct _mesa_glsl_parse_state *state, - exec_list *instructions) + exec_list *instructions) { bool gl_FragColor_assigned = false; bool gl_FragData_assigned = false; @@ -5575,18 +5549,18 @@ detect_conflicting_assignments(struct _mesa_glsl_parse_state *state, ir_variable *var = ((ir_instruction *)node)->as_variable(); if (!var || !var->data.assigned) - continue; + continue; if (strcmp(var->name, "gl_FragColor") == 0) - gl_FragColor_assigned = true; + gl_FragColor_assigned = true; else if (strcmp(var->name, "gl_FragData") == 0) - gl_FragData_assigned = true; + gl_FragData_assigned = true; else if (strncmp(var->name, "gl_", 3) != 0) { - if (state->stage == MESA_SHADER_FRAGMENT && - var->data.mode == ir_var_shader_out) { - user_defined_fs_output_assigned = true; - user_defined_fs_output = var; - } + if (state->stage == MESA_SHADER_FRAGMENT && + var->data.mode == ir_var_shader_out) { + user_defined_fs_output_assigned = true; + user_defined_fs_output = var; + } } } @@ -5607,15 +5581,15 @@ detect_conflicting_assignments(struct _mesa_glsl_parse_state *state, */ if (gl_FragColor_assigned && gl_FragData_assigned) { _mesa_glsl_error(&loc, state, "fragment shader writes to both " - "`gl_FragColor' and `gl_FragData'"); + "`gl_FragColor' and `gl_FragData'"); } else if (gl_FragColor_assigned && user_defined_fs_output_assigned) { _mesa_glsl_error(&loc, state, "fragment shader writes to both " - "`gl_FragColor' and `%s'", - user_defined_fs_output->name); + "`gl_FragColor' and `%s'", + user_defined_fs_output->name); } else if (gl_FragData_assigned && user_defined_fs_output_assigned) { _mesa_glsl_error(&loc, state, "fragment shader writes to both " - "`gl_FragData' and `%s'", - user_defined_fs_output->name); + "`gl_FragData' and `%s'", + user_defined_fs_output->name); } } diff --git a/mesalib/src/glsl/builtin_functions.cpp b/mesalib/src/glsl/builtin_functions.cpp index 26ea9231f..3991f9d8d 100644 --- a/mesalib/src/glsl/builtin_functions.cpp +++ b/mesalib/src/glsl/builtin_functions.cpp @@ -62,6 +62,12 @@ #include "program/prog_instruction.h" #include <limits> +#define f(x) join(x) +#define join(x) x ## f +#define M_PIf f(M_PI) +#define M_PI_2f f(M_PI_2) +#define M_PI_4f f(M_PI_4) + using namespace ir_builder; /** @@ -2538,11 +2544,11 @@ ir_expression * builtin_builder::asin_expr(ir_variable *x) { return mul(sign(x), - sub(imm(1.5707964f), + sub(imm(M_PI_2f), mul(sqrt(sub(imm(1.0f), abs(x))), - add(imm(1.5707964f), + add(imm(M_PI_2f), mul(abs(x), - add(imm(-0.21460183f), + add(imm(M_PI_4f - 1.0f), mul(abs(x), add(imm(0.086566724f), mul(abs(x), imm(-0.03102955f)))))))))); @@ -2586,7 +2592,7 @@ builtin_builder::_acos(const glsl_type *type) ir_variable *x = in_var(type, "x"); MAKE_SIG(type, always_available, 1, x); - body.emit(ret(sub(imm(1.5707964f), asin_expr(x)))); + body.emit(ret(sub(imm(M_PI_2f), asin_expr(x)))); return sig; } @@ -2623,13 +2629,13 @@ builtin_builder::_atan2(const glsl_type *type) ir_if *inner_if = new(mem_ctx) ir_if(less(x, imm(0.0f))); inner_if->then_instructions.push_tail( if_tree(gequal(y, imm(0.0f)), - assign(r, add(r, imm(3.141593f))), - assign(r, sub(r, imm(3.141593f))))); + assign(r, add(r, imm(M_PIf))), + assign(r, sub(r, imm(M_PIf))))); outer_then.emit(inner_if); /* Else... */ outer_if->else_instructions.push_tail( - assign(r, mul(sign(y), imm(1.5707965f)))); + assign(r, mul(sign(y), imm(M_PI_2f)))); body.emit(outer_if); diff --git a/mesalib/src/glsl/link_uniform_initializers.cpp b/mesalib/src/glsl/link_uniform_initializers.cpp index e60bb64bc..2100e0517 100644 --- a/mesalib/src/glsl/link_uniform_initializers.cpp +++ b/mesalib/src/glsl/link_uniform_initializers.cpp @@ -296,8 +296,10 @@ link_set_uniform_initializers(struct gl_shader_program *prog) linker::set_block_binding(prog, iface_type->name, var->data.binding); } + } else if (type->contains_atomic()) { + /* we don't actually need to do anything. */ } else { - assert(!"Explicit binding not on a sampler or UBO."); + assert(!"Explicit binding not on a sampler, UBO or atomic."); } } else if (var->constant_value) { linker::set_uniform_initializer(mem_ctx, prog, var->name, diff --git a/mesalib/src/glsl/linker.cpp b/mesalib/src/glsl/linker.cpp index c8dc0661d..c2f7f4863 100644 --- a/mesalib/src/glsl/linker.cpp +++ b/mesalib/src/glsl/linker.cpp @@ -297,7 +297,7 @@ linker_warning(gl_shader_program *prog, const char *fmt, ...) { va_list ap; - ralloc_strcat(&prog->InfoLog, "error: "); + ralloc_strcat(&prog->InfoLog, "warning: "); va_start(ap, fmt); ralloc_vasprintf_append(&prog->InfoLog, fmt, ap); va_end(ap); diff --git a/mesalib/src/glsl/lower_named_interface_blocks.cpp b/mesalib/src/glsl/lower_named_interface_blocks.cpp index 09d867ea3..04e0d36e6 100644 --- a/mesalib/src/glsl/lower_named_interface_blocks.cpp +++ b/mesalib/src/glsl/lower_named_interface_blocks.cpp @@ -125,8 +125,8 @@ flatten_named_interface_blocks_declarations::run(exec_list *instructions) for (unsigned i = 0; i < iface_t->length; i++) { const char * field_name = iface_t->fields.structure[i].name; char *iface_field_name = - ralloc_asprintf(mem_ctx, "%s.%s", - iface_t->name, field_name); + ralloc_asprintf(mem_ctx, "%s.%s.%s", + iface_t->name, var->name, field_name); ir_variable *found_var = (ir_variable *) hash_table_find(interface_namespace, @@ -217,8 +217,8 @@ flatten_named_interface_blocks_declarations::handle_rvalue(ir_rvalue **rvalue) if (var->get_interface_type() != NULL) { char *iface_field_name = - ralloc_asprintf(mem_ctx, "%s.%s", var->get_interface_type()->name, - ir->field); + ralloc_asprintf(mem_ctx, "%s.%s.%s", var->get_interface_type()->name, + var->name, ir->field); /* Find the variable in the set of flattened interface blocks */ ir_variable *found_var = (ir_variable *) hash_table_find(interface_namespace, diff --git a/mesalib/src/glsl/opt_if_simplification.cpp b/mesalib/src/glsl/opt_if_simplification.cpp index 2bec8252e..e05f03190 100644 --- a/mesalib/src/glsl/opt_if_simplification.cpp +++ b/mesalib/src/glsl/opt_if_simplification.cpp @@ -90,15 +90,9 @@ ir_if_simplification_visitor::visit_leave(ir_if *ir) * that matters out. */ if (condition_constant->value.b[0]) { - foreach_list_safe(n, &ir->then_instructions) { - ir_instruction *then_ir = (ir_instruction *) n; - ir->insert_before(then_ir); - } + ir->insert_before(&ir->then_instructions); } else { - foreach_list_safe(n, &ir->else_instructions) { - ir_instruction *else_ir = (ir_instruction *) n; - ir->insert_before(else_ir); - } + ir->insert_before(&ir->else_instructions); } ir->remove(); this->made_progress = true; diff --git a/mesalib/src/mesa/drivers/common/meta.c b/mesalib/src/mesa/drivers/common/meta.c index acf927b09..ac27abba6 100644 --- a/mesalib/src/mesa/drivers/common/meta.c +++ b/mesalib/src/mesa/drivers/common/meta.c @@ -37,6 +37,7 @@ #include "main/arbprogram.h" #include "main/arrayobj.h" #include "main/blend.h" +#include "main/blit.h" #include "main/bufferobj.h" #include "main/buffers.h" #include "main/colortab.h" @@ -93,6 +94,45 @@ static void meta_glsl_clear_cleanup(struct clear_state *clear); static void meta_decompress_cleanup(struct decompress_state *decompress); static void meta_drawpix_cleanup(struct drawpix_state *drawpix); +void +_mesa_meta_bind_fbo_image(GLenum attachment, + struct gl_texture_image *texImage, GLuint layer) +{ + struct gl_texture_object *texObj = texImage->TexObject; + int level = texImage->Level; + GLenum target = texObj->Target; + + switch (target) { + case GL_TEXTURE_1D: + _mesa_FramebufferTexture1D(GL_FRAMEBUFFER, + attachment, + target, + texObj->Name, + level); + break; + case GL_TEXTURE_1D_ARRAY: + case GL_TEXTURE_2D_ARRAY: + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: + case GL_TEXTURE_CUBE_MAP_ARRAY: + case GL_TEXTURE_3D: + _mesa_FramebufferTextureLayer(GL_FRAMEBUFFER, + attachment, + texObj->Name, + level, + layer); + break; + default: /* 2D / cube */ + if (target == GL_TEXTURE_CUBE_MAP) + target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + texImage->Face; + + _mesa_FramebufferTexture2D(GL_FRAMEBUFFER, + attachment, + target, + texObj->Name, + level); + } +} + GLuint _mesa_meta_compile_shader_with_debug(struct gl_context *ctx, GLenum target, const GLcharARB *source) @@ -2421,6 +2461,9 @@ _mesa_meta_setup_texture_coords(GLenum faceTarget, GLuint i; GLfloat r; + if (faceTarget == GL_TEXTURE_CUBE_MAP_ARRAY) + faceTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + slice % 6; + /* Currently all texture targets want the W component to be 1.0. */ coords0[3] = 1.0F; @@ -2689,6 +2732,84 @@ get_temp_image_type(struct gl_context *ctx, mesa_format format) } /** + * Attempts to wrap the destination texture in an FBO and use + * glBlitFramebuffer() to implement glCopyTexSubImage(). + */ +static bool +copytexsubimage_using_blit_framebuffer(struct gl_context *ctx, GLuint dims, + struct gl_texture_image *texImage, + GLint xoffset, + GLint yoffset, + GLint zoffset, + struct gl_renderbuffer *rb, + GLint x, GLint y, + GLsizei width, GLsizei height) +{ + struct gl_texture_object *texObj = texImage->TexObject; + GLuint fbo; + bool success = false; + GLbitfield mask; + GLenum status; + + if (!ctx->Extensions.ARB_framebuffer_object) + return false; + + _mesa_unlock_texture(ctx, texObj); + + _mesa_meta_begin(ctx, MESA_META_ALL); + + _mesa_GenFramebuffers(1, &fbo); + _mesa_BindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); + + if (rb->_BaseFormat == GL_DEPTH_STENCIL || + rb->_BaseFormat == GL_DEPTH_COMPONENT) { + _mesa_meta_bind_fbo_image(GL_DEPTH_ATTACHMENT, texImage, zoffset); + mask = GL_DEPTH_BUFFER_BIT; + + if (rb->_BaseFormat == GL_DEPTH_STENCIL && + texImage->_BaseFormat == GL_DEPTH_STENCIL) { + _mesa_meta_bind_fbo_image(GL_STENCIL_ATTACHMENT, texImage, zoffset); + mask |= GL_STENCIL_BUFFER_BIT; + } + _mesa_DrawBuffer(GL_NONE); + } else { + _mesa_meta_bind_fbo_image(GL_COLOR_ATTACHMENT0, texImage, zoffset); + mask = GL_COLOR_BUFFER_BIT; + _mesa_DrawBuffer(GL_COLOR_ATTACHMENT0); + } + + status = _mesa_CheckFramebufferStatus(GL_DRAW_FRAMEBUFFER); + if (status != GL_FRAMEBUFFER_COMPLETE) + goto out; + + ctx->Meta->Blit.no_ctsi_fallback = true; + + /* Since we've bound a new draw framebuffer, we need to update + * its derived state -- _Xmin, etc -- for BlitFramebuffer's clipping to + * be correct. + */ + _mesa_update_state(ctx); + + /* We skip the core BlitFramebuffer checks for format consistency, which + * are too strict for CopyTexImage. We know meta will be fine with format + * changes. + */ + _mesa_meta_BlitFramebuffer(ctx, x, y, + x + width, y + height, + xoffset, yoffset, + xoffset + width, yoffset + height, + mask, GL_NEAREST); + ctx->Meta->Blit.no_ctsi_fallback = false; + success = true; + + out: + _mesa_lock_texture(ctx, texObj); + _mesa_DeleteFramebuffers(1, &fbo); + _mesa_meta_end(ctx); + return success; +} + +/** * Helper for _mesa_meta_CopyTexSubImage1/2/3D() functions. * Have to be careful with locking and meta state for pixel transfer. */ @@ -2705,11 +2826,14 @@ _mesa_meta_CopyTexSubImage(struct gl_context *ctx, GLuint dims, GLint bpp; void *buf; - /* The gl_renderbuffer is part of the interface for - * dd_function_table::CopyTexSubImage, but this implementation does not use - * it. - */ - (void) rb; + if (copytexsubimage_using_blit_framebuffer(ctx, dims, + texImage, + xoffset, yoffset, zoffset, + rb, + x, y, + width, height)) { + return; + } /* Choose format/type for temporary image buffer */ format = _mesa_get_format_base_format(texImage->TexFormat); diff --git a/mesalib/src/mesa/drivers/common/meta.h b/mesalib/src/mesa/drivers/common/meta.h index 4faae0b40..fde4f9a7a 100644 --- a/mesalib/src/mesa/drivers/common/meta.h +++ b/mesalib/src/mesa/drivers/common/meta.h @@ -240,6 +240,14 @@ enum blit_msaa_shader { BLIT_MSAA_SHADER_2D_MULTISAMPLE_COPY_UINT, BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_RESOLVE, BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_COPY, + BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE, + BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT, + BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT, + BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_COPY, + BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_COPY_INT, + BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_COPY_UINT, + BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_DEPTH_RESOLVE, + BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_DEPTH_COPY, BLIT_MSAA_SHADER_COUNT, }; @@ -250,10 +258,10 @@ struct blit_state { GLuint VAO; GLuint VBO; - GLuint DepthFP; struct blit_shader_table shaders; GLuint msaa_shaders[BLIT_MSAA_SHADER_COUNT]; struct temp_texture depthTex; + bool no_ctsi_fallback; }; @@ -505,4 +513,8 @@ _mesa_meta_blit_shader_table_cleanup(struct blit_shader_table *table); void _mesa_meta_glsl_generate_mipmap_cleanup(struct gen_mipmap_state *mipmap); +void +_mesa_meta_bind_fbo_image(GLenum attachment, + struct gl_texture_image *texImage, GLuint layer); + #endif /* META_H */ diff --git a/mesalib/src/mesa/drivers/common/meta_blit.c b/mesalib/src/mesa/drivers/common/meta_blit.c index 31e494fb8..5d72dd2ec 100644 --- a/mesalib/src/mesa/drivers/common/meta_blit.c +++ b/mesalib/src/mesa/drivers/common/meta_blit.c @@ -33,11 +33,13 @@ #include "main/enable.h" #include "main/enums.h" #include "main/fbobject.h" +#include "main/image.h" #include "main/macros.h" #include "main/matrix.h" #include "main/multisample.h" #include "main/objectlabel.h" #include "main/readpix.h" +#include "main/scissor.h" #include "main/shaderapi.h" #include "main/texobj.h" #include "main/texenv.h" @@ -52,37 +54,6 @@ /** Return offset in bytes of the field within a vertex struct */ #define OFFSET(FIELD) ((void *) offsetof(struct vertex, FIELD)) -/** - * One-time init for drawing depth pixels. - */ -static void -init_blit_depth_pixels(struct gl_context *ctx) -{ - static const char *program = - "!!ARBfp1.0\n" - "TEX result.depth, fragment.texcoord[0], texture[0], %s; \n" - "END \n"; - char program2[200]; - struct blit_state *blit = &ctx->Meta->Blit; - struct temp_texture *tex = _mesa_meta_get_temp_texture(ctx); - const char *texTarget; - - assert(blit->DepthFP == 0); - - /* replace %s with "RECT" or "2D" */ - assert(strlen(program) + 4 < sizeof(program2)); - if (tex->Target == GL_TEXTURE_RECTANGLE) - texTarget = "RECT"; - else - texTarget = "2D"; - _mesa_snprintf(program2, sizeof(program2), program, texTarget); - - _mesa_GenProgramsARB(1, &blit->DepthFP); - _mesa_BindProgramARB(GL_FRAGMENT_PROGRAM_ARB, blit->DepthFP); - _mesa_ProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, - strlen(program2), (const GLubyte *) program2); -} - static void setup_glsl_msaa_blit_shader(struct gl_context *ctx, struct blit_state *blit, @@ -97,7 +68,9 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx, bool dst_is_msaa = false; GLenum src_datatype; const char *vec4_prefix; + const char *sampler_array_suffix = ""; char *name; + const char *texcoord_type = "vec2"; if (src_rb) { src_datatype = _mesa_get_format_datatype(src_rb->Format); @@ -125,6 +98,7 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx, switch (target) { case GL_TEXTURE_2D_MULTISAMPLE: + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: if (src_rb->_BaseFormat == GL_DEPTH_COMPONENT || src_rb->_BaseFormat == GL_DEPTH_STENCIL) { if (dst_is_msaa) @@ -137,6 +111,13 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx, else shader_index = BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE; } + + if (target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) { + shader_index += (BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE - + BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE); + sampler_array_suffix = "Array"; + texcoord_type = "vec3"; + } break; default: _mesa_problem(ctx, "Unkown texture target %s\n", @@ -167,6 +148,8 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx, mem_ctx = ralloc_context(NULL); if (shader_index == BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_RESOLVE || + shader_index == BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_DEPTH_RESOLVE || + shader_index == BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_DEPTH_COPY || shader_index == BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_COPY) { char *sample_index; const char *arb_sample_shading_extension_string; @@ -197,26 +180,31 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx, vs_source = ralloc_asprintf(mem_ctx, "#version 130\n" "in vec2 position;\n" - "in vec2 textureCoords;\n" - "out vec2 texCoords;\n" + "in %s textureCoords;\n" + "out %s texCoords;\n" "void main()\n" "{\n" " texCoords = textureCoords;\n" " gl_Position = vec4(position, 0.0, 1.0);\n" - "}\n"); + "}\n", + texcoord_type, + texcoord_type); fs_source = ralloc_asprintf(mem_ctx, "#version 130\n" "#extension GL_ARB_texture_multisample : enable\n" "%s\n" - "uniform sampler2DMS texSampler;\n" - "in vec2 texCoords;\n" + "uniform sampler2DMS%s texSampler;\n" + "in %s texCoords;\n" "out vec4 out_color;\n" "\n" "void main()\n" "{\n" - " gl_FragDepth = texelFetch(texSampler, ivec2(texCoords), %s).r;\n" + " gl_FragDepth = texelFetch(texSampler, i%s(texCoords), %s).r;\n" "}\n", arb_sample_shading_extension_string, + sampler_array_suffix, + texcoord_type, + texcoord_type, sample_index); } else { /* You can create 2D_MULTISAMPLE textures with 0 sample count (meaning 1 @@ -234,7 +222,7 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx, if (dst_is_msaa) { arb_sample_shading_extension_string = "#extension GL_ARB_sample_shading : enable"; - sample_resolve = ralloc_asprintf(mem_ctx, " out_color = texelFetch(texSampler, ivec2(texCoords), gl_SampleID);"); + sample_resolve = ralloc_asprintf(mem_ctx, " out_color = texelFetch(texSampler, i%s(texCoords), gl_SampleID);", texcoord_type); merge_function = ""; } else { int i; @@ -263,8 +251,8 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx, sample_resolve = rzalloc_size(mem_ctx, 1); for (i = 0; i < samples; i++) { ralloc_asprintf_append(&sample_resolve, - " gvec4 sample_1_%d = texelFetch(texSampler, ivec2(texCoords), %d);\n", - i, i); + " gvec4 sample_1_%d = texelFetch(texSampler, i%s(texCoords), %d);\n", + i, texcoord_type, i); } /* Now, merge each pair of samples, then merge each pair of those, * etc. @@ -294,20 +282,22 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx, vs_source = ralloc_asprintf(mem_ctx, "#version 130\n" "in vec2 position;\n" - "in vec2 textureCoords;\n" - "out vec2 texCoords;\n" + "in %s textureCoords;\n" + "out %s texCoords;\n" "void main()\n" "{\n" " texCoords = textureCoords;\n" " gl_Position = vec4(position, 0.0, 1.0);\n" - "}\n"); + "}\n", + texcoord_type, + texcoord_type); fs_source = ralloc_asprintf(mem_ctx, "#version 130\n" "#extension GL_ARB_texture_multisample : enable\n" "%s\n" "#define gvec4 %svec4\n" - "uniform %ssampler2DMS texSampler;\n" - "in vec2 texCoords;\n" + "uniform %ssampler2DMS%s texSampler;\n" + "in %s texCoords;\n" "out gvec4 out_color;\n" "\n" "%s" /* merge_function */ @@ -318,6 +308,8 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx, arb_sample_shading_extension_string, vec4_prefix, vec4_prefix, + sampler_array_suffix, + texcoord_type, merge_function, sample_resolve); } @@ -350,7 +342,8 @@ setup_glsl_blit_framebuffer(struct gl_context *ctx, _mesa_meta_setup_vertex_objects(&blit->VAO, &blit->VBO, true, 2, 2, 0); - if (target == GL_TEXTURE_2D_MULTISAMPLE) { + if (target == GL_TEXTURE_2D_MULTISAMPLE || + target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) { setup_glsl_msaa_blit_shader(ctx, blit, src_rb, target); } else { _mesa_meta_setup_blit_shader(ctx, target, &blit->shaders); @@ -389,6 +382,7 @@ blitframebuffer_texture(struct gl_context *ctx, ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler->Name : 0; GLuint tempTex = 0; struct gl_renderbuffer *rb = readAtt->Renderbuffer; + struct temp_texture *meta_temp_texture; if (rb->NumSamples && !ctx->Extensions.ARB_texture_multisample) return false; @@ -398,23 +392,18 @@ blitframebuffer_texture(struct gl_context *ctx, filter = GL_LINEAR; } - if (readAtt->Texture) { + if (readAtt->Texture && + (readAtt->Texture->Target == GL_TEXTURE_2D || + readAtt->Texture->Target == GL_TEXTURE_RECTANGLE || + readAtt->Texture->Target == GL_TEXTURE_2D_MULTISAMPLE || + readAtt->Texture->Target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)) { /* If there's a texture attached of a type we can handle, then just use * it directly. */ srcLevel = readAtt->TextureLevel; texObj = readAtt->Texture; target = texObj->Target; - - switch (target) { - case GL_TEXTURE_2D: - case GL_TEXTURE_RECTANGLE: - case GL_TEXTURE_2D_MULTISAMPLE: - break; - default: - return false; - } - } else if (ctx->Driver.BindRenderbufferTexImage) { + } else if (!readAtt->Texture && ctx->Driver.BindRenderbufferTexImage) { /* Otherwise, we need the driver to be able to bind a renderbuffer as * a texture image. */ @@ -449,7 +438,42 @@ blitframebuffer_texture(struct gl_context *ctx, } } } else { - return false; + GLenum tex_base_format; + int srcW = abs(srcY1 - srcY0); + int srcH = abs(srcY1 - srcY0); + /* Fall back to doing a CopyTexSubImage to get the destination + * renderbuffer into a texture. + */ + if (ctx->Meta->Blit.no_ctsi_fallback) + return false; + + if (rb->NumSamples > 1) + return false; + + if (do_depth) { + meta_temp_texture = _mesa_meta_get_temp_depth_texture(ctx); + tex_base_format = GL_DEPTH_COMPONENT; + } else { + meta_temp_texture = _mesa_meta_get_temp_texture(ctx); + tex_base_format = + _mesa_base_tex_format(ctx, rb->InternalFormat); + } + + srcLevel = 0; + target = meta_temp_texture->Target; + texObj = _mesa_lookup_texture(ctx, meta_temp_texture->TexObj); + + _mesa_meta_setup_copypix_texture(ctx, meta_temp_texture, + srcX0, srcY0, + srcW, srcH, + tex_base_format, + filter); + + + srcX0 = 0; + srcY0 = 0; + srcX1 = srcW; + srcY1 = srcH; } baseLevelSave = texObj->BaseLevel; @@ -533,7 +557,8 @@ blitframebuffer_texture(struct gl_context *ctx, } else { assert(target == GL_TEXTURE_RECTANGLE_ARB || - target == GL_TEXTURE_2D_MULTISAMPLE); + target == GL_TEXTURE_2D_MULTISAMPLE || + target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY); s0 = (float) srcX0; s1 = (float) srcX1; t0 = (float) srcY0; @@ -600,47 +625,53 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { - struct blit_state *blit = &ctx->Meta->Blit; - struct temp_texture *tex = _mesa_meta_get_temp_texture(ctx); - struct temp_texture *depthTex = _mesa_meta_get_temp_depth_texture(ctx); - const GLsizei maxTexSize = tex->MaxSize; - const GLint srcX = MIN2(srcX0, srcX1); - const GLint srcY = MIN2(srcY0, srcY1); - const GLint srcW = abs(srcX1 - srcX0); - const GLint srcH = abs(srcY1 - srcY0); - const GLint dstX = MIN2(dstX0, dstX1); - const GLint dstY = MIN2(dstY0, dstY1); const GLint dstW = abs(dstX1 - dstX0); const GLint dstH = abs(dstY1 - dstY0); - const GLint srcFlipX = (srcX1 - srcX0) / srcW; - const GLint srcFlipY = (srcY1 - srcY0) / srcH; const GLint dstFlipX = (dstX1 - dstX0) / dstW; const GLint dstFlipY = (dstY1 - dstY0) / dstH; - const GLint flipX = srcFlipX * dstFlipX; - const GLint flipY = srcFlipY * dstFlipY; - struct vertex verts[4]; - GLboolean newTex; + struct { + GLint srcX0, srcY0, srcX1, srcY1; + GLint dstX0, dstY0, dstX1, dstY1; + } clip = { + srcX0, srcY0, srcX1, srcY1, + dstX0, dstY0, dstX1, dstY1 + }; + const GLboolean use_glsl_version = ctx->Extensions.ARB_vertex_shader && ctx->Extensions.ARB_fragment_shader; - /* In addition to falling back if the blit size is larger than the maximum - * texture size, fallback if the source is multisampled. This fallback can - * be removed once Mesa gets support ARB_texture_multisample. - */ - if (srcW > maxTexSize || srcH > maxTexSize) { - /* XXX avoid this fallback */ - goto fallback; - } - /* Multisample texture blit support requires texture multisample. */ if (ctx->ReadBuffer->Visual.samples > 0 && !ctx->Extensions.ARB_texture_multisample) { goto fallback; } - /* only scissor effects blit so save/clear all other relevant state */ - _mesa_meta_begin(ctx, ~MESA_META_SCISSOR); + /* Clip a copy of the blit coordinates. If these differ from the input + * coordinates, then we'll set the scissor. + */ + if (!_mesa_clip_blit(ctx, &clip.srcX0, &clip.srcY0, &clip.srcX1, &clip.srcY1, + &clip.dstX0, &clip.dstY0, &clip.dstX1, &clip.dstY1)) { + /* clipped/scissored everything away */ + return; + } + + /* Only scissor affects blit, but we're doing to set a custom scissor if + * necessary anyway, so save/clear state. + */ + _mesa_meta_begin(ctx, MESA_META_ALL); + + /* If the clipping earlier changed the destination rect at all, then + * enable the scissor to clip to it. + */ + if (clip.dstX0 != dstX0 || clip.dstY0 != dstY0 || + clip.dstX1 != dstX1 || clip.dstY1 != dstY1) { + _mesa_set_enable(ctx, GL_SCISSOR_TEST, GL_TRUE); + _mesa_Scissor(MIN2(clip.dstX0, clip.dstX1), + MIN2(clip.dstY0, clip.dstY1), + abs(clip.dstX0 - clip.dstX1), + abs(clip.dstY0 - clip.dstY1)); + } /* Try faster, direct texture approach first */ if (mask & GL_COLOR_BUFFER_BIT) { @@ -669,132 +700,10 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx, } } - /* Choose between glsl version and fixed function version of - * BlitFramebuffer function. - */ - if (use_glsl_version) { - setup_glsl_blit_framebuffer(ctx, blit, NULL, tex->Target); - } - else { - _mesa_meta_setup_ff_tnl_for_blit(&blit->VAO, &blit->VBO, 2); - } - - /* Silence valgrind warnings about reading uninitialized stack. */ - memset(verts, 0, sizeof(verts)); - - /* Continue with "normal" approach which involves copying the src rect - * into a temporary texture and is "blitted" by drawing a textured quad. - */ - { - /* setup vertex positions */ - verts[0].x = -1.0F * flipX; - verts[0].y = -1.0F * flipY; - verts[1].x = 1.0F * flipX; - verts[1].y = -1.0F * flipY; - verts[2].x = 1.0F * flipX; - verts[2].y = 1.0F * flipY; - verts[3].x = -1.0F * flipX; - verts[3].y = 1.0F * flipY; - - } - - if (!use_glsl_version) - _mesa_set_enable(ctx, tex->Target, GL_TRUE); - - if (mask & GL_COLOR_BUFFER_BIT) { - const struct gl_framebuffer *readFb = ctx->ReadBuffer; - const struct gl_renderbuffer *colorReadRb = readFb->_ColorReadBuffer; - const GLenum rb_base_format = - _mesa_base_tex_format(ctx, colorReadRb->InternalFormat); - - /* Using the exact source rectangle to create the texture does incorrect - * linear filtering along the edges. So, allocate the texture extended along - * edges by one pixel in x, y directions. - */ - _mesa_meta_setup_copypix_texture(ctx, tex, - srcX - 1, srcY - 1, srcW + 2, srcH + 2, - rb_base_format, filter); - /* texcoords (after texture allocation!) */ - { - verts[0].tex[0] = 1.0F; - verts[0].tex[1] = 1.0F; - verts[1].tex[0] = tex->Sright - 1.0F; - verts[1].tex[1] = 1.0F; - verts[2].tex[0] = tex->Sright - 1.0F; - verts[2].tex[1] = tex->Ttop - 1.0F; - verts[3].tex[0] = 1.0F; - verts[3].tex[1] = tex->Ttop - 1.0F; - - /* upload new vertex data */ - _mesa_BufferSubData(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts); - } - - _mesa_set_viewport(ctx, 0, dstX, dstY, dstW, dstH); - _mesa_ColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - _mesa_set_enable(ctx, GL_DEPTH_TEST, GL_FALSE); - _mesa_DepthMask(GL_FALSE); - _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4); - mask &= ~GL_COLOR_BUFFER_BIT; - } - - if ((mask & GL_DEPTH_BUFFER_BIT) && - _mesa_is_desktop_gl(ctx) && - ctx->Extensions.ARB_depth_texture && - ctx->Extensions.ARB_fragment_program) { - - GLuint *tmp = malloc(srcW * srcH * sizeof(GLuint)); - - if (tmp) { - - newTex = _mesa_meta_alloc_texture(depthTex, srcW, srcH, - GL_DEPTH_COMPONENT); - _mesa_ReadPixels(srcX, srcY, srcW, srcH, GL_DEPTH_COMPONENT, - GL_UNSIGNED_INT, tmp); - _mesa_meta_setup_drawpix_texture(ctx, depthTex, newTex, - srcW, srcH, GL_DEPTH_COMPONENT, - GL_UNSIGNED_INT, tmp); - - /* texcoords (after texture allocation!) */ - { - verts[0].tex[0] = 0.0F; - verts[0].tex[1] = 0.0F; - verts[1].tex[0] = depthTex->Sright; - verts[1].tex[1] = 0.0F; - verts[2].tex[0] = depthTex->Sright; - verts[2].tex[1] = depthTex->Ttop; - verts[3].tex[0] = 0.0F; - verts[3].tex[1] = depthTex->Ttop; - - /* upload new vertex data */ - _mesa_BufferSubData(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts); - } - - if (!blit->DepthFP) - init_blit_depth_pixels(ctx); - - _mesa_BindProgramARB(GL_FRAGMENT_PROGRAM_ARB, blit->DepthFP); - _mesa_set_enable(ctx, GL_FRAGMENT_PROGRAM_ARB, GL_TRUE); - _mesa_ColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - _mesa_set_enable(ctx, GL_DEPTH_TEST, GL_TRUE); - _mesa_DepthFunc(GL_ALWAYS); - _mesa_DepthMask(GL_TRUE); - - _mesa_set_viewport(ctx, 0, dstX, dstY, dstW, dstH); - _mesa_BufferSubData(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts); - _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4); - mask &= ~GL_DEPTH_BUFFER_BIT; - - free(tmp); - } - } - if (mask & GL_STENCIL_BUFFER_BIT) { /* XXX can't easily do stencil */ } - if (!use_glsl_version) - _mesa_set_enable(ctx, tex->Target, GL_FALSE); - _mesa_meta_end(ctx); fallback: @@ -813,10 +722,6 @@ _mesa_meta_glsl_blit_cleanup(struct blit_state *blit) _mesa_DeleteBuffers(1, &blit->VBO); blit->VBO = 0; } - if (blit->DepthFP) { - _mesa_DeleteProgramsARB(1, &blit->DepthFP); - blit->DepthFP = 0; - } _mesa_meta_blit_shader_table_cleanup(&blit->shaders); diff --git a/mesalib/src/mesa/drivers/common/meta_generate_mipmap.c b/mesalib/src/mesa/drivers/common/meta_generate_mipmap.c index d62819c4c..3c9ac89af 100644 --- a/mesalib/src/mesa/drivers/common/meta_generate_mipmap.c +++ b/mesalib/src/mesa/drivers/common/meta_generate_mipmap.c @@ -44,38 +44,6 @@ #include "main/viewport.h" #include "drivers/common/meta.h" -/** - * Bind a particular texture level/layer to mipmap->FBO's GL_COLOR_ATTACHMENT0. - */ -static void -bind_fbo_image(struct gl_texture_object *texObj, GLenum target, - GLuint level, GLuint layer) -{ - switch (target) { - case GL_TEXTURE_1D: - _mesa_FramebufferTexture1D(GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - target, - texObj->Name, - level); - break; - case GL_TEXTURE_1D_ARRAY: - case GL_TEXTURE_2D_ARRAY: - case GL_TEXTURE_3D: - _mesa_FramebufferTextureLayer(GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - texObj->Name, - level, - layer); - break; - default: /* 2D / cube */ - _mesa_FramebufferTexture2D(GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - target, - texObj->Name, - level); - } -} /** * Check if the call to _mesa_meta_GenerateMipmap() will require a @@ -135,7 +103,7 @@ fallback_required(struct gl_context *ctx, GLenum target, _mesa_GenFramebuffers(1, &mipmap->FBO); _mesa_BindFramebuffer(GL_FRAMEBUFFER_EXT, mipmap->FBO); - bind_fbo_image(texObj, target, srcLevel, 0); + _mesa_meta_bind_fbo_image(GL_COLOR_ATTACHMENT0, baseImage, 0); status = _mesa_CheckFramebufferStatus(GL_FRAMEBUFFER_EXT); @@ -221,7 +189,7 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target, */ if (use_glsl_version) { _mesa_meta_setup_vertex_objects(&mipmap->VAO, &mipmap->VBO, true, - 2, 3, 0); + 2, 4, 0); _mesa_meta_setup_blit_shader(ctx, target, &mipmap->shaders); } else { _mesa_meta_setup_ff_tnl_for_blit(&mipmap->VAO, &mipmap->VBO, 3); @@ -281,6 +249,7 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target, for (dstLevel = baseLevel + 1; dstLevel <= maxLevel; dstLevel++) { const struct gl_texture_image *srcImage; + struct gl_texture_image *dstImage; const GLuint srcLevel = dstLevel - 1; GLuint layer; GLsizei srcWidth, srcHeight, srcDepth; @@ -325,6 +294,7 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target, */ break; } + dstImage = _mesa_select_tex_image(ctx, texObj, faceTarget, dstLevel); /* limit minification to src level */ _mesa_TexParameteri(target, GL_TEXTURE_MAX_LEVEL, srcLevel); @@ -347,7 +317,7 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target, _mesa_BufferData(GL_ARRAY_BUFFER_ARB, sizeof(verts), verts, GL_DYNAMIC_DRAW_ARB); - bind_fbo_image(texObj, faceTarget, dstLevel, layer); + _mesa_meta_bind_fbo_image(GL_COLOR_ATTACHMENT0, dstImage, layer); /* sanity check */ if (_mesa_CheckFramebufferStatus(GL_FRAMEBUFFER) != diff --git a/mesalib/src/mesa/drivers/dri/common/utils.c b/mesalib/src/mesa/drivers/dri/common/utils.c index 1f29e0b08..eee77ec69 100644 --- a/mesalib/src/mesa/drivers/dri/common/utils.c +++ b/mesalib/src/mesa/drivers/dri/common/utils.c @@ -32,6 +32,7 @@ #include <string.h> #include <stdlib.h> #include <stdbool.h> +#include <stdint.h> #include "main/macros.h" #include "main/mtypes.h" #include "main/cpuinfo.h" @@ -40,14 +41,12 @@ #include "dri_util.h" -unsigned +uint64_t driParseDebugString( const char * debug, const struct dri_debug_control * control ) { - unsigned flag; - + uint64_t flag = 0; - flag = 0; if ( debug != NULL ) { while( control->string != NULL ) { if ( !strcmp( debug, "all" ) || diff --git a/mesalib/src/mesa/drivers/dri/common/utils.h b/mesalib/src/mesa/drivers/dri/common/utils.h index 094143446..3760c38fc 100644 --- a/mesalib/src/mesa/drivers/dri/common/utils.h +++ b/mesalib/src/mesa/drivers/dri/common/utils.h @@ -34,10 +34,10 @@ struct dri_debug_control { const char * string; - unsigned flag; + uint64_t flag; }; -extern unsigned driParseDebugString( const char * debug, +extern uint64_t driParseDebugString( const char * debug, const struct dri_debug_control * control ); extern unsigned driGetRendererString( char * buffer, diff --git a/mesalib/src/mesa/main/fbobject.c b/mesalib/src/mesa/main/fbobject.c index 6c4f1b548..ca16ae1ec 100644 --- a/mesalib/src/mesa/main/fbobject.c +++ b/mesalib/src/mesa/main/fbobject.c @@ -2676,8 +2676,7 @@ _mesa_FramebufferRenderbuffer(GLenum target, GLenum attachment, return; } else if (rb == &DummyRenderbuffer) { - /* This is what NVIDIA does */ - _mesa_error(ctx, GL_INVALID_VALUE, + _mesa_error(ctx, GL_INVALID_OPERATION, "glFramebufferRenderbufferEXT(renderbuffer %u)", renderbuffer); return; @@ -2771,8 +2770,21 @@ _mesa_GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, } if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { - /* the depth and stencil attachments must point to the same buffer */ const struct gl_renderbuffer_attachment *depthAtt, *stencilAtt; + if (pname == GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE) { + /* This behavior is first specified in OpenGL 4.4 specification. + * + * From the OpenGL 4.4 spec page 275: + * "This query cannot be performed for a combined depth+stencil + * attachment, since it does not have a single format." + */ + _mesa_error(ctx, GL_INVALID_OPERATION, + "glGetFramebufferAttachmentParameteriv(" + "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE" + " is invalid for depth+stencil attachment)"); + return; + } + /* the depth and stencil attachments must point to the same buffer */ depthAtt = get_attachment(ctx, buffer, GL_DEPTH_ATTACHMENT); stencilAtt = get_attachment(ctx, buffer, GL_STENCIL_ATTACHMENT); if (depthAtt->Renderbuffer != stencilAtt->Renderbuffer) { diff --git a/mesalib/src/mesa/main/formats.c b/mesalib/src/mesa/main/formats.c index fb2501c69..5c670115e 100644 --- a/mesalib/src/mesa/main/formats.c +++ b/mesalib/src/mesa/main/formats.c @@ -2035,6 +2035,15 @@ _mesa_is_format_signed(mesa_format format) } } +/** + * Is the given format an integer format? + */ +GLboolean +_mesa_is_format_integer(mesa_format format) +{ + const struct gl_format_info *info = _mesa_get_format_info(format); + return (info->DataType == GL_INT || info->DataType == GL_UNSIGNED_INT); +} /** * Return color encoding for given format. diff --git a/mesalib/src/mesa/main/formats.h b/mesalib/src/mesa/main/formats.h index 89bd0219e..185010e02 100644 --- a/mesalib/src/mesa/main/formats.h +++ b/mesalib/src/mesa/main/formats.h @@ -445,6 +445,9 @@ _mesa_is_format_unsigned(mesa_format format); extern GLboolean _mesa_is_format_signed(mesa_format format); +extern GLboolean +_mesa_is_format_integer(mesa_format format); + extern GLenum _mesa_get_format_color_encoding(mesa_format format); diff --git a/mesalib/src/mesa/main/getstring.c b/mesalib/src/mesa/main/getstring.c index 3ac62d402..b0bd3190b 100644 --- a/mesalib/src/mesa/main/getstring.c +++ b/mesalib/src/mesa/main/getstring.c @@ -166,7 +166,7 @@ _mesa_GetStringi(GLenum name, GLuint index) } return _mesa_get_enabled_extension(ctx, index); default: - _mesa_error( ctx, GL_INVALID_ENUM, "glGetString" ); + _mesa_error(ctx, GL_INVALID_ENUM, "glGetStringi"); return (const GLubyte *) 0; } } diff --git a/mesalib/src/mesa/main/glformats.c b/mesalib/src/mesa/main/glformats.c index 77cf26337..9bb341cc0 100644 --- a/mesalib/src/mesa/main/glformats.c +++ b/mesalib/src/mesa/main/glformats.c @@ -1238,6 +1238,22 @@ GLenum _mesa_error_check_format_and_type(const struct gl_context *ctx, GLenum format, GLenum type) { + /* From OpenGL 3.3 spec, page 220: + * "If the format is DEPTH_STENCIL, then values are taken from + * both the depth buffer and the stencil buffer. If there is no + * depth buffer or if there is no stencil buffer, then the error + * INVALID_OPERATION occurs. If the type parameter is not + * UNSIGNED_INT_24_8 or FLOAT_32_UNSIGNED_INT_24_8_REV, then the + * error INVALID_ENUM occurs." + * + * OpenGL ES still generates GL_INVALID_OPERATION because glReadPixels + * cannot be used to read depth or stencil in that API. + */ + if (_mesa_is_desktop_gl(ctx) && format == GL_DEPTH_STENCIL + && type != GL_UNSIGNED_INT_24_8 + && type != GL_FLOAT_32_UNSIGNED_INT_24_8_REV) + return GL_INVALID_ENUM; + /* special type-based checks (see glReadPixels, glDrawPixels error lists) */ switch (type) { case GL_BITMAP: diff --git a/mesalib/src/mesa/main/mtypes.h b/mesalib/src/mesa/main/mtypes.h index 4d014d1ee..66943836c 100644 --- a/mesalib/src/mesa/main/mtypes.h +++ b/mesalib/src/mesa/main/mtypes.h @@ -1402,6 +1402,9 @@ struct gl_texture_attrib /** Bitwise-OR of all Texture.Unit[i]._GenFlags */ GLbitfield _GenFlags; + + /** Upper bound on _ReallyEnabled texunits. */ + GLint _MaxEnabledTexImageUnit; }; diff --git a/mesalib/src/mesa/main/texgetimage.c b/mesalib/src/mesa/main/texgetimage.c index daabf2e81..2beb0abe6 100644 --- a/mesalib/src/mesa/main/texgetimage.c +++ b/mesalib/src/mesa/main/texgetimage.c @@ -853,6 +853,11 @@ getteximage_error_check(struct gl_context *ctx, GLenum target, GLint level, _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)"); return GL_TRUE; } + else if (_mesa_is_enum_format_integer(format) != + _mesa_is_format_integer(texImage->TexFormat)) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)"); + return GL_TRUE; + } if (!_mesa_validate_pbo_access(dimensions, &ctx->Pack, texImage->Width, texImage->Height, texImage->Depth, diff --git a/mesalib/src/mesa/main/teximage.c b/mesalib/src/mesa/main/teximage.c index 57a766f99..c7f301cbd 100644 --- a/mesalib/src/mesa/main/teximage.c +++ b/mesalib/src/mesa/main/teximage.c @@ -4374,7 +4374,7 @@ teximagemultisample(GLuint dims, GLenum target, GLsizei samples, { struct gl_texture_object *texObj; struct gl_texture_image *texImage; - GLboolean sizeOK, dimensionsOK; + GLboolean sizeOK, dimensionsOK, samplesOK; mesa_format texFormat; GLenum sample_count_error; @@ -4411,7 +4411,17 @@ teximagemultisample(GLuint dims, GLenum target, GLsizei samples, sample_count_error = _mesa_check_sample_count(ctx, target, internalformat, samples); - if (sample_count_error != GL_NO_ERROR) { + samplesOK = sample_count_error == GL_NO_ERROR; + + /* Page 254 of OpenGL 4.4 spec says: + * "Proxy arrays for two-dimensional multisample and two-dimensional + * multisample array textures are operated on in the same way when + * TexImage2DMultisample is called with target specified as + * PROXY_TEXTURE_2D_MULTISAMPLE, or TexImage3DMultisample is called + * with target specified as PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY. + * However, if samples is not supported, then no error is generated. + */ + if (!samplesOK && !_mesa_is_proxy_texture(target)) { _mesa_error(ctx, sample_count_error, "%s(samples)", func); return; } @@ -4443,7 +4453,7 @@ teximagemultisample(GLuint dims, GLenum target, GLsizei samples, width, height, depth, 0); if (_mesa_is_proxy_texture(target)) { - if (dimensionsOK && sizeOK) { + if (samplesOK && dimensionsOK && sizeOK) { init_teximage_fields_ms(ctx, texImage, width, height, depth, 0, internalformat, texFormat, samples, fixedsamplelocations); diff --git a/mesalib/src/mesa/main/texstate.c b/mesalib/src/mesa/main/texstate.c index fcae878cf..b68920ce1 100644 --- a/mesalib/src/mesa/main/texstate.c +++ b/mesalib/src/mesa/main/texstate.c @@ -550,6 +550,7 @@ update_texture_state( struct gl_context *ctx ) ctx->Texture._GenFlags = 0x0; ctx->Texture._TexMatEnabled = 0x0; ctx->Texture._TexGenEnabled = 0x0; + ctx->Texture._MaxEnabledTexImageUnit = -1; /* * Update texture unit state. @@ -636,6 +637,7 @@ update_texture_state( struct gl_context *ctx ) /* if we get here, we know this texture unit is enabled */ ctx->Texture._EnabledUnits |= (1 << unit); + ctx->Texture._MaxEnabledTexImageUnit = unit; if (enabledTargetsByStage[MESA_SHADER_FRAGMENT]) enabledFragUnits |= (1 << unit); diff --git a/mesalib/src/mesa/main/varray.c b/mesalib/src/mesa/main/varray.c index b88d70018..66a3ef119 100644 --- a/mesalib/src/mesa/main/varray.c +++ b/mesalib/src/mesa/main/varray.c @@ -738,7 +738,7 @@ get_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname, case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB: return array->Enabled; case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB: - return array->Size; + return (array->Format == GL_BGRA) ? GL_BGRA : array->Size; case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB: return array->Stride; case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB: diff --git a/mesalib/src/mesa/state_tracker/st_atom_framebuffer.c b/mesalib/src/mesa/state_tracker/st_atom_framebuffer.c index 4c4f839d1..a17417c35 100644 --- a/mesalib/src/mesa/state_tracker/st_atom_framebuffer.c +++ b/mesalib/src/mesa/state_tracker/st_atom_framebuffer.c @@ -31,6 +31,8 @@ * Brian Paul */ +#include <limits.h> + #include "st_context.h" #include "st_atom.h" #include "st_cb_bitmap.h" @@ -44,6 +46,26 @@ /** + * Update framebuffer size. + * + * We need to derive pipe_framebuffer size from the bound pipe_surfaces here + * instead of copying gl_framebuffer size because for certain target types + * (like PIPE_TEXTURE_1D_ARRAY) gl_framebuffer::Height has the number of layers + * instead of 1. + */ +static void +update_framebuffer_size(struct pipe_framebuffer_state *framebuffer, + struct pipe_surface *surface) +{ + assert(surface); + assert(surface->width < UINT_MAX); + assert(surface->height < UINT_MAX); + framebuffer->width = MIN2(framebuffer->width, surface->width); + framebuffer->height = MIN2(framebuffer->height, surface->height); +} + + +/** * Update framebuffer state (color, depth, stencil, etc. buffers) */ static void @@ -57,8 +79,8 @@ update_framebuffer_state( struct st_context *st ) st_flush_bitmap_cache(st); st->state.fb_orientation = st_fb_orientation(fb); - framebuffer->width = fb->Width; - framebuffer->height = fb->Height; + framebuffer->width = UINT_MAX; + framebuffer->height = UINT_MAX; /*printf("------ fb size %d x %d\n", fb->Width, fb->Height);*/ @@ -81,6 +103,7 @@ update_framebuffer_state( struct st_context *st ) if (strb->surface) { pipe_surface_reference(&framebuffer->cbufs[i], strb->surface); + update_framebuffer_size(framebuffer, strb->surface); } strb->defined = GL_TRUE; /* we'll be drawing something */ } @@ -100,12 +123,14 @@ update_framebuffer_state( struct st_context *st ) st_update_renderbuffer_surface(st, strb); } pipe_surface_reference(&framebuffer->zsbuf, strb->surface); + update_framebuffer_size(framebuffer, strb->surface); } else { strb = st_renderbuffer(fb->Attachment[BUFFER_STENCIL].Renderbuffer); if (strb) { assert(strb->surface); pipe_surface_reference(&framebuffer->zsbuf, strb->surface); + update_framebuffer_size(framebuffer, strb->surface); } else pipe_surface_reference(&framebuffer->zsbuf, NULL); @@ -122,6 +147,12 @@ update_framebuffer_state( struct st_context *st ) } #endif + /* _mesa_test_framebuffer_completeness refuses framebuffers with no + * attachments, so this should never happen. + */ + assert(framebuffer->width != UINT_MAX); + assert(framebuffer->height != UINT_MAX); + cso_set_framebuffer(st->cso_context, framebuffer); } diff --git a/mesalib/src/mesa/state_tracker/st_extensions.c b/mesalib/src/mesa/state_tracker/st_extensions.c index 059989342..70726886e 100644 --- a/mesalib/src/mesa/state_tracker/st_extensions.c +++ b/mesalib/src/mesa/state_tracker/st_extensions.c @@ -635,6 +635,8 @@ void st_init_extensions(struct st_context *st) if (!st->options.disable_shader_bit_encoding) { ctx->Extensions.ARB_shader_bit_encoding = GL_TRUE; } + + ctx->Extensions.EXT_shader_integer_mix = GL_TRUE; } else { /* Optional integer support for GLSL 1.2. */ if (screen->get_shader_param(screen, PIPE_SHADER_VERTEX, @@ -642,6 +644,8 @@ void st_init_extensions(struct st_context *st) screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, PIPE_SHADER_CAP_INTEGERS)) { ctx->Const.NativeIntegers = GL_TRUE; + + ctx->Extensions.EXT_shader_integer_mix = GL_TRUE; } } diff --git a/mesalib/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/mesalib/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index edd0aa765..15b5279b8 100644 --- a/mesalib/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/mesalib/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -632,7 +632,10 @@ glsl_to_tgsi_visitor::get_opcode(ir_instruction *ir, unsigned op, st_src_reg src0, st_src_reg src1) { int type = GLSL_TYPE_FLOAT; - + + if (op == TGSI_OPCODE_MOV) + return op; + assert(src0.type != GLSL_TYPE_ARRAY); assert(src0.type != GLSL_TYPE_STRUCT); assert(src1.type != GLSL_TYPE_ARRAY); diff --git a/mesalib/src/mesa/state_tracker/st_texture.c b/mesalib/src/mesa/state_tracker/st_texture.c index f664ef5f1..92035e801 100644 --- a/mesalib/src/mesa/state_tracker/st_texture.c +++ b/mesalib/src/mesa/state_tracker/st_texture.c @@ -443,7 +443,7 @@ struct pipe_sampler_view ** st_texture_get_sampler_view(struct st_context *st, struct st_texture_object *stObj) { - struct pipe_sampler_view **used = NULL, **free = NULL; + struct pipe_sampler_view *used = NULL, **free = NULL; GLuint i; for (i = 0; i < stObj->num_sampler_views; ++i) { @@ -455,7 +455,7 @@ st_texture_get_sampler_view(struct st_context *st, return sv; /* Wasn't the right one, but remember it as template */ - used = sv; + used = *sv; } else { /* Found a free slot, remember that */ free = sv; @@ -475,7 +475,7 @@ st_texture_get_sampler_view(struct st_context *st, /* Add just any sampler view to be used as a template */ if (used) - pipe_sampler_view_reference(free, *used); + pipe_sampler_view_reference(free, used); return free; } diff --git a/mesalib/src/mesa/swrast/s_blit.c b/mesalib/src/mesa/swrast/s_blit.c index 1ba188c5f..e3b45f146 100644 --- a/mesalib/src/mesa/swrast/s_blit.c +++ b/mesalib/src/mesa/swrast/s_blit.c @@ -29,6 +29,7 @@ #include "main/macros.h" #include "main/format_unpack.h" #include "main/format_pack.h" +#include "main/condrender.h" #include "s_context.h" @@ -748,6 +749,13 @@ _swrast_BlitFramebuffer(struct gl_context *ctx, }; GLint i; + /* Page 679 of OpenGL 4.4 spec says: + * "Added BlitFramebuffer to commands affected by conditional rendering in + * section 10.10 (Bug 9562)." + */ + if (!_mesa_check_conditional_render(ctx)) + return; /* Do not blit */ + if (!_mesa_clip_blit(ctx, &srcX0, &srcY0, &srcX1, &srcY1, &dstX0, &dstY0, &dstX1, &dstY1)) { return; diff --git a/pixman/pixman/pixman-arm-neon-asm.h b/pixman/pixman/pixman-arm-neon-asm.h index d0d92d74c..bdcf6a9d4 100644 --- a/pixman/pixman/pixman-arm-neon-asm.h +++ b/pixman/pixman/pixman-arm-neon-asm.h @@ -631,14 +631,8 @@ local skip1 src_basereg_ = 0, \ mask_basereg_ = 24 - .func fname - .global fname - /* For ELF format also set function visibility to hidden */ -#ifdef __ELF__ - .hidden fname - .type fname, %function -#endif -fname: + pixman_asm_function fname + push {r4-r12, lr} /* save all registers */ /* @@ -945,14 +939,8 @@ fname: src_basereg_ = 0, \ mask_basereg_ = 24 - .func fname - .global fname - /* For ELF format also set function visibility to hidden */ -#ifdef __ELF__ - .hidden fname - .type fname, %function -#endif -fname: + pixman_asm_function fname + .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE /* * Make some macro arguments globally visible and accessible diff --git a/pixman/pixman/pixman-arm-simd-asm.S b/pixman/pixman/pixman-arm-simd-asm.S index dd6f78817..bc02ebb57 100644 --- a/pixman/pixman/pixman-arm-simd-asm.S +++ b/pixman/pixman/pixman-arm-simd-asm.S @@ -37,6 +37,7 @@ .altmacro .p2align 2 +#include "pixman-arm-asm.h" #include "pixman-arm-simd-asm.h" /* A head macro should do all processing which results in an output of up to @@ -689,3 +690,372 @@ generate_composite_function \ /******************************************************************************/ +.macro over_white_8888_8888_ca_init + HALF .req SRC + TMP0 .req STRIDE_D + TMP1 .req STRIDE_S + TMP2 .req STRIDE_M + TMP3 .req ORIG_W + WK4 .req SCRATCH + line_saved_regs STRIDE_D, STRIDE_M, ORIG_W + ldr SCRATCH, =0x800080 + mov HALF, #0x80 + /* Set GE[3:0] to 0101 so SEL instructions do what we want */ + uadd8 SCRATCH, SCRATCH, SCRATCH + .set DST_PRELOAD_BIAS, 8 +.endm + +.macro over_white_8888_8888_ca_cleanup + .set DST_PRELOAD_BIAS, 0 + .unreq HALF + .unreq TMP0 + .unreq TMP1 + .unreq TMP2 + .unreq TMP3 + .unreq WK4 +.endm + +.macro over_white_8888_8888_ca_combine m, d + uxtb16 TMP1, TMP0 /* rb_notmask */ + uxtb16 TMP2, d /* rb_dest; 1 stall follows */ + smlatt TMP3, TMP2, TMP1, HALF /* red */ + smlabb TMP2, TMP2, TMP1, HALF /* blue */ + uxtb16 TMP0, TMP0, ror #8 /* ag_notmask */ + uxtb16 TMP1, d, ror #8 /* ag_dest; 1 stall follows */ + smlatt d, TMP1, TMP0, HALF /* alpha */ + smlabb TMP1, TMP1, TMP0, HALF /* green */ + pkhbt TMP0, TMP2, TMP3, lsl #16 /* rb; 1 stall follows */ + pkhbt TMP1, TMP1, d, lsl #16 /* ag */ + uxtab16 TMP0, TMP0, TMP0, ror #8 + uxtab16 TMP1, TMP1, TMP1, ror #8 + mov TMP0, TMP0, ror #8 + sel d, TMP0, TMP1 + uqadd8 d, d, m /* d is a late result */ +.endm + +.macro over_white_8888_8888_ca_1pixel_head + pixld , 4, 1, MASK, 0 + pixld , 4, 3, DST, 0 +.endm + +.macro over_white_8888_8888_ca_1pixel_tail + mvn TMP0, WK1 + teq WK1, WK1, asr #32 + bne 01f + bcc 03f + mov WK3, WK1 + b 02f +01: over_white_8888_8888_ca_combine WK1, WK3 +02: pixst , 4, 3, DST +03: +.endm + +.macro over_white_8888_8888_ca_2pixels_head + pixld , 8, 1, MASK, 0 +.endm + +.macro over_white_8888_8888_ca_2pixels_tail + pixld , 8, 3, DST + mvn TMP0, WK1 + teq WK1, WK1, asr #32 + bne 01f + movcs WK3, WK1 + bcs 02f + teq WK2, #0 + beq 05f + b 02f +01: over_white_8888_8888_ca_combine WK1, WK3 +02: mvn TMP0, WK2 + teq WK2, WK2, asr #32 + bne 03f + movcs WK4, WK2 + b 04f +03: over_white_8888_8888_ca_combine WK2, WK4 +04: pixst , 8, 3, DST +05: +.endm + +.macro over_white_8888_8888_ca_process_head cond, numbytes, firstreg, unaligned_src, unaligned_mask, preload + .if numbytes == 4 + over_white_8888_8888_ca_1pixel_head + .else + .if numbytes == 16 + over_white_8888_8888_ca_2pixels_head + over_white_8888_8888_ca_2pixels_tail + .endif + over_white_8888_8888_ca_2pixels_head + .endif +.endm + +.macro over_white_8888_8888_ca_process_tail cond, numbytes, firstreg + .if numbytes == 4 + over_white_8888_8888_ca_1pixel_tail + .else + over_white_8888_8888_ca_2pixels_tail + .endif +.endm + +generate_composite_function \ + pixman_composite_over_white_8888_8888_ca_asm_armv6, 0, 32, 32 \ + FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR | FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH \ + 2, /* prefetch distance */ \ + over_white_8888_8888_ca_init, \ + nop_macro, /* newline */ \ + over_white_8888_8888_ca_cleanup, \ + over_white_8888_8888_ca_process_head, \ + over_white_8888_8888_ca_process_tail + + +.macro over_n_8888_8888_ca_init + /* Set up constants. RB_SRC and AG_SRC are in registers; + * RB_FLDS, A_SRC, and the two HALF values need to go on the + * stack (and the ful SRC value is already there) */ + ldr SCRATCH, [sp, #ARGS_STACK_OFFSET] + mov WK0, #0x00FF0000 + orr WK0, WK0, #0xFF /* RB_FLDS (0x00FF00FF) */ + mov WK1, #0x80 /* HALF default value */ + mov WK2, SCRATCH, lsr #24 /* A_SRC */ + orr WK3, WK1, WK1, lsl #16 /* HALF alternate value (0x00800080) */ + push {WK0-WK3} + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET+16 + uxtb16 SRC, SCRATCH + uxtb16 STRIDE_S, SCRATCH, ror #8 + + /* Set GE[3:0] to 0101 so SEL instructions do what we want */ + uadd8 SCRATCH, WK3, WK3 + + .unreq WK0 + .unreq WK1 + .unreq WK2 + .unreq WK3 + WK0 .req Y + WK1 .req STRIDE_D + RB_SRC .req SRC + AG_SRC .req STRIDE_S + WK2 .req STRIDE_M + RB_FLDS .req r8 /* the reloaded constants have to be at consecutive registers starting at an even one */ + A_SRC .req r8 + HALF .req r9 + WK3 .req r10 + WK4 .req r11 + WK5 .req SCRATCH + WK6 .req ORIG_W + + line_saved_regs Y, STRIDE_D, STRIDE_M, ORIG_W +.endm + +.macro over_n_8888_8888_ca_cleanup + add sp, sp, #16 + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET-16 + + .unreq WK0 + .unreq WK1 + .unreq RB_SRC + .unreq AG_SRC + .unreq WK2 + .unreq RB_FLDS + .unreq A_SRC + .unreq HALF + .unreq WK3 + .unreq WK4 + .unreq WK5 + .unreq WK6 + WK0 .req r8 + WK1 .req r9 + WK2 .req r10 + WK3 .req r11 +.endm + +.macro over_n_8888_8888_ca_1pixel_head + pixld , 4, 6, MASK, 0 + pixld , 4, 0, DST, 0 +.endm + +.macro over_n_8888_8888_ca_1pixel_tail + ldrd A_SRC, HALF, [sp, #LOCALS_STACK_OFFSET+8] + uxtb16 WK1, WK6 /* rb_mask (first step of hard case placed in what would otherwise be a stall) */ + teq WK6, WK6, asr #32 /* Zc if transparent, ZC if opaque */ + bne 20f + bcc 40f + /* Mask is fully opaque (all channels) */ + ldr WK6, [sp, #ARGS_STACK_OFFSET] /* get SRC back */ + eors A_SRC, A_SRC, #0xFF + bne 10f + /* Source is also opaque - same as src_8888_8888 */ + mov WK0, WK6 + b 30f +10: /* Same as over_8888_8888 */ + mul_8888_8 WK0, A_SRC, WK5, HALF + uqadd8 WK0, WK0, WK6 + b 30f +20: /* No simplifications possible - do it the hard way */ + uxtb16 WK2, WK6, ror #8 /* ag_mask */ + mla WK3, WK1, A_SRC, HALF /* rb_mul; 2 cycles */ + mla WK4, WK2, A_SRC, HALF /* ag_mul; 2 cycles */ + ldrd RB_FLDS, HALF, [sp, #LOCALS_STACK_OFFSET] + uxtb16 WK5, WK0 /* rb_dest */ + uxtab16 WK3, WK3, WK3, ror #8 + uxtb16 WK6, WK0, ror #8 /* ag_dest */ + uxtab16 WK4, WK4, WK4, ror #8 + smlatt WK0, RB_SRC, WK1, HALF /* red1 */ + smlabb WK1, RB_SRC, WK1, HALF /* blue1 */ + bic WK3, RB_FLDS, WK3, lsr #8 + bic WK4, RB_FLDS, WK4, lsr #8 + pkhbt WK1, WK1, WK0, lsl #16 /* rb1 */ + smlatt WK0, WK5, WK3, HALF /* red2 */ + smlabb WK3, WK5, WK3, HALF /* blue2 */ + uxtab16 WK1, WK1, WK1, ror #8 + smlatt WK5, AG_SRC, WK2, HALF /* alpha1 */ + pkhbt WK3, WK3, WK0, lsl #16 /* rb2 */ + smlabb WK0, AG_SRC, WK2, HALF /* green1 */ + smlatt WK2, WK6, WK4, HALF /* alpha2 */ + smlabb WK4, WK6, WK4, HALF /* green2 */ + pkhbt WK0, WK0, WK5, lsl #16 /* ag1 */ + uxtab16 WK3, WK3, WK3, ror #8 + pkhbt WK4, WK4, WK2, lsl #16 /* ag2 */ + uxtab16 WK0, WK0, WK0, ror #8 + uxtab16 WK4, WK4, WK4, ror #8 + mov WK1, WK1, ror #8 + mov WK3, WK3, ror #8 + sel WK2, WK1, WK0 /* recombine source*mask */ + sel WK1, WK3, WK4 /* recombine dest*(1-source_alpha*mask) */ + uqadd8 WK0, WK1, WK2 /* followed by 1 stall */ +30: /* The destination buffer is already in the L1 cache, so + * there's little point in amalgamating writes */ + pixst , 4, 0, DST +40: +.endm + +.macro over_n_8888_8888_ca_process_head cond, numbytes, firstreg, unaligned_src, unaligned_mask, preload + .rept (numbytes / 4) - 1 + over_n_8888_8888_ca_1pixel_head + over_n_8888_8888_ca_1pixel_tail + .endr + over_n_8888_8888_ca_1pixel_head +.endm + +.macro over_n_8888_8888_ca_process_tail cond, numbytes, firstreg + over_n_8888_8888_ca_1pixel_tail +.endm + +pixman_asm_function pixman_composite_over_n_8888_8888_ca_asm_armv6 + ldr ip, [sp] + cmp ip, #-1 + beq pixman_composite_over_white_8888_8888_ca_asm_armv6 + /* else drop through... */ + .endfunc +generate_composite_function \ + pixman_composite_over_n_8888_8888_ca_asm_armv6_helper, 0, 32, 32 \ + FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR | FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH | FLAG_PROCESS_CORRUPTS_WK0 \ + 2, /* prefetch distance */ \ + over_n_8888_8888_ca_init, \ + nop_macro, /* newline */ \ + over_n_8888_8888_ca_cleanup, \ + over_n_8888_8888_ca_process_head, \ + over_n_8888_8888_ca_process_tail + +/******************************************************************************/ + +.macro in_reverse_8888_8888_init + /* Hold loop invariant in MASK */ + ldr MASK, =0x00800080 + /* Set GE[3:0] to 0101 so SEL instructions do what we want */ + uadd8 SCRATCH, MASK, MASK + /* Offset the source pointer: we only need the alpha bytes */ + add SRC, SRC, #3 + line_saved_regs ORIG_W +.endm + +.macro in_reverse_8888_8888_head numbytes, reg1, reg2, reg3 + ldrb ORIG_W, [SRC], #4 + .if numbytes >= 8 + ldrb WK®1, [SRC], #4 + .if numbytes == 16 + ldrb WK®2, [SRC], #4 + ldrb WK®3, [SRC], #4 + .endif + .endif + add DST, DST, #numbytes +.endm + +.macro in_reverse_8888_8888_process_head cond, numbytes, firstreg, unaligned_src, unaligned_mask, preload + in_reverse_8888_8888_head numbytes, firstreg, %(firstreg+1), %(firstreg+2) +.endm + +.macro in_reverse_8888_8888_1pixel s, d, offset, is_only + .if is_only != 1 + movs s, ORIG_W + .if offset != 0 + ldrb ORIG_W, [SRC, #offset] + .endif + beq 01f + teq STRIDE_M, #0xFF + beq 02f + .endif + uxtb16 SCRATCH, d /* rb_dest */ + uxtb16 d, d, ror #8 /* ag_dest */ + mla SCRATCH, SCRATCH, s, MASK + mla d, d, s, MASK + uxtab16 SCRATCH, SCRATCH, SCRATCH, ror #8 + uxtab16 d, d, d, ror #8 + mov SCRATCH, SCRATCH, ror #8 + sel d, SCRATCH, d + b 02f + .if offset == 0 +48: /* Last mov d,#0 of the set - used as part of shortcut for + * source values all 0 */ + .endif +01: mov d, #0 +02: +.endm + +.macro in_reverse_8888_8888_tail numbytes, reg1, reg2, reg3, reg4 + .if numbytes == 4 + teq ORIG_W, ORIG_W, asr #32 + ldrne WK®1, [DST, #-4] + .elseif numbytes == 8 + teq ORIG_W, WK®1 + teqeq ORIG_W, ORIG_W, asr #32 /* all 0 or all -1? */ + ldmnedb DST, {WK®1-WK®2} + .else + teq ORIG_W, WK®1 + teqeq ORIG_W, WK®2 + teqeq ORIG_W, WK®3 + teqeq ORIG_W, ORIG_W, asr #32 /* all 0 or all -1? */ + ldmnedb DST, {WK®1-WK®4} + .endif + cmnne DST, #0 /* clear C if NE */ + bcs 49f /* no writes to dest if source all -1 */ + beq 48f /* set dest to all 0 if source all 0 */ + .if numbytes == 4 + in_reverse_8888_8888_1pixel ORIG_W, WK®1, 0, 1 + str WK®1, [DST, #-4] + .elseif numbytes == 8 + in_reverse_8888_8888_1pixel STRIDE_M, WK®1, -4, 0 + in_reverse_8888_8888_1pixel STRIDE_M, WK®2, 0, 0 + stmdb DST, {WK®1-WK®2} + .else + in_reverse_8888_8888_1pixel STRIDE_M, WK®1, -12, 0 + in_reverse_8888_8888_1pixel STRIDE_M, WK®2, -8, 0 + in_reverse_8888_8888_1pixel STRIDE_M, WK®3, -4, 0 + in_reverse_8888_8888_1pixel STRIDE_M, WK®4, 0, 0 + stmdb DST, {WK®1-WK®4} + .endif +49: +.endm + +.macro in_reverse_8888_8888_process_tail cond, numbytes, firstreg + in_reverse_8888_8888_tail numbytes, firstreg, %(firstreg+1), %(firstreg+2), %(firstreg+3) +.endm + +generate_composite_function \ + pixman_composite_in_reverse_8888_8888_asm_armv6, 32, 0, 32 \ + FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR | FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH | FLAG_NO_PRELOAD_DST \ + 2, /* prefetch distance */ \ + in_reverse_8888_8888_init, \ + nop_macro, /* newline */ \ + nop_macro, /* cleanup */ \ + in_reverse_8888_8888_process_head, \ + in_reverse_8888_8888_process_tail + +/******************************************************************************/ diff --git a/pixman/pixman/pixman-arm-simd-asm.h b/pixman/pixman/pixman-arm-simd-asm.h index 24b1ad2f9..8de060a6b 100644 --- a/pixman/pixman/pixman-arm-simd-asm.h +++ b/pixman/pixman/pixman-arm-simd-asm.h @@ -76,6 +76,16 @@ .set FLAG_SPILL_LINE_VARS, 48 .set FLAG_PROCESS_CORRUPTS_SCRATCH, 0 .set FLAG_PROCESS_PRESERVES_SCRATCH, 64 +.set FLAG_PROCESS_PRESERVES_WK0, 0 +.set FLAG_PROCESS_CORRUPTS_WK0, 128 /* if possible, use the specified register(s) instead so WK0 can hold number of leading pixels */ +.set FLAG_PRELOAD_DST, 0 +.set FLAG_NO_PRELOAD_DST, 256 + +/* + * Number of bytes by which to adjust preload offset of destination + * buffer (allows preload instruction to be moved before the load(s)) + */ +.set DST_PRELOAD_BIAS, 0 /* * Offset into stack where mask and source pointer/stride can be accessed. @@ -87,6 +97,11 @@ #endif /* + * Offset into stack where space allocated during init macro can be accessed. + */ +.set LOCALS_STACK_OFFSET, 0 + +/* * Constants for selecting preferable prefetch type. */ .set PREFETCH_TYPE_NONE, 0 @@ -359,23 +374,41 @@ .macro test_bits_1_0_ptr + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + movs SCRATCH, X, lsl #32-1 /* C,N = bits 1,0 of DST */ + .else movs SCRATCH, WK0, lsl #32-1 /* C,N = bits 1,0 of DST */ + .endif .endm .macro test_bits_3_2_ptr + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + movs SCRATCH, X, lsl #32-3 /* C,N = bits 3, 2 of DST */ + .else movs SCRATCH, WK0, lsl #32-3 /* C,N = bits 3, 2 of DST */ + .endif .endm .macro leading_15bytes process_head, process_tail /* On entry, WK0 bits 0-3 = number of bytes until destination is 16-byte aligned */ + .set DECREMENT_X, 1 + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + .set DECREMENT_X, 0 + sub X, X, WK0, lsr #dst_bpp_shift + str X, [sp, #LINE_SAVED_REG_COUNT*4] + mov X, WK0 + .endif /* Use unaligned loads in all cases for simplicity */ .if dst_w_bpp == 8 - conditional_process2 test_bits_1_0_ptr, mi, cs, process_head, process_tail, 1, 2, 1, 2, 1, 1, 1 + conditional_process2 test_bits_1_0_ptr, mi, cs, process_head, process_tail, 1, 2, 1, 2, 1, 1, DECREMENT_X .elseif dst_w_bpp == 16 test_bits_1_0_ptr - conditional_process1 cs, process_head, process_tail, 2, 2, 1, 1, 1 + conditional_process1 cs, process_head, process_tail, 2, 2, 1, 1, DECREMENT_X + .endif + conditional_process2 test_bits_3_2_ptr, mi, cs, process_head, process_tail, 4, 8, 1, 2, 1, 1, DECREMENT_X + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + ldr X, [sp, #LINE_SAVED_REG_COUNT*4] .endif - conditional_process2 test_bits_3_2_ptr, mi, cs, process_head, process_tail, 4, 8, 1, 2, 1, 1, 1 .endm .macro test_bits_3_2_pix @@ -414,7 +447,7 @@ preload_middle src_bpp, SRC, 0 preload_middle mask_bpp, MASK, 0 .endif - .if (dst_r_bpp > 0) && ((SUBBLOCK % 2) == 0) + .if (dst_r_bpp > 0) && ((SUBBLOCK % 2) == 0) && (((flags) & FLAG_NO_PRELOAD_DST) == 0) /* Because we know that writes are 16-byte aligned, it's relatively easy to ensure that * destination prefetches are 32-byte aligned. It's also the easiest channel to offset * preloads for, to achieve staggered prefetches for multiple channels, because there are @@ -437,11 +470,11 @@ .if dst_r_bpp > 0 tst DST, #16 bne 111f - process_inner_loop process_head, process_tail, unaligned_src, unaligned_mask, 16 + process_inner_loop process_head, process_tail, unaligned_src, unaligned_mask, 16 + DST_PRELOAD_BIAS b 112f 111: .endif - process_inner_loop process_head, process_tail, unaligned_src, unaligned_mask, 0 + process_inner_loop process_head, process_tail, unaligned_src, unaligned_mask, 0 + DST_PRELOAD_BIAS 112: /* Just before the final (prefetch_distance+1) 32-byte blocks, deal with final preloads */ .if (src_bpp*pix_per_block > 256) || (mask_bpp*pix_per_block > 256) || (dst_r_bpp*pix_per_block > 256) @@ -449,7 +482,9 @@ .endif preload_trailing src_bpp, src_bpp_shift, SRC preload_trailing mask_bpp, mask_bpp_shift, MASK + .if ((flags) & FLAG_NO_PRELOAD_DST) == 0 preload_trailing dst_r_bpp, dst_bpp_shift, DST + .endif add X, X, #(prefetch_distance+2)*pix_per_block - 128/dst_w_bpp /* The remainder of the line is handled identically to the medium case */ medium_case_inner_loop_and_trailing_pixels process_head, process_tail,, exit_label, unaligned_src, unaligned_mask @@ -561,13 +596,7 @@ process_tail, \ process_inner_loop - .func fname - .global fname - /* For ELF format also set function visibility to hidden */ -#ifdef __ELF__ - .hidden fname - .type fname, %function -#endif + pixman_asm_function fname /* * Make some macro arguments globally visible and accessible @@ -679,7 +708,6 @@ SCRATCH .req r12 ORIG_W .req r14 /* width (pixels) */ -fname: push {r4-r11, lr} /* save all registers */ subs Y, Y, #1 @@ -705,6 +733,13 @@ fname: #endif init + + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + /* Reserve a word in which to store X during leading pixels */ + sub sp, sp, #4 + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET+4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET+4 + .endif lsl STRIDE_D, #dst_bpp_shift /* stride in bytes */ sub STRIDE_D, STRIDE_D, X, lsl #dst_bpp_shift @@ -734,12 +769,16 @@ fname: .if (flags) & FLAG_SPILL_LINE_VARS_WIDE /* This is stmdb sp!,{} */ .word 0xE92D0000 | LINE_SAVED_REGS + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4 .endif 151: /* New line */ newline preload_leading_step1 src_bpp, WK1, SRC preload_leading_step1 mask_bpp, WK2, MASK + .if ((flags) & FLAG_NO_PRELOAD_DST) == 0 preload_leading_step1 dst_r_bpp, WK3, DST + .endif ands WK0, DST, #15 beq 154f @@ -747,7 +786,9 @@ fname: preload_leading_step2 src_bpp, src_bpp_shift, WK1, SRC preload_leading_step2 mask_bpp, mask_bpp_shift, WK2, MASK + .if ((flags) & FLAG_NO_PRELOAD_DST) == 0 preload_leading_step2 dst_r_bpp, dst_bpp_shift, WK3, DST + .endif leading_15bytes process_head, process_tail @@ -767,6 +808,10 @@ fname: 157: /* Check for another line */ end_of_line 1, %((flags) & FLAG_SPILL_LINE_VARS_WIDE), 151b + .if (flags) & FLAG_SPILL_LINE_VARS_WIDE + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4 + .endif .endif .ltorg @@ -776,12 +821,16 @@ fname: .if (flags) & FLAG_SPILL_LINE_VARS_NON_WIDE /* This is stmdb sp!,{} */ .word 0xE92D0000 | LINE_SAVED_REGS + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4 .endif 161: /* New line */ newline preload_line 0, src_bpp, src_bpp_shift, SRC /* in: X, corrupts: WK0-WK1 */ preload_line 0, mask_bpp, mask_bpp_shift, MASK + .if ((flags) & FLAG_NO_PRELOAD_DST) == 0 preload_line 0, dst_r_bpp, dst_bpp_shift, DST + .endif sub X, X, #128/dst_w_bpp /* simplifies inner loop termination */ ands WK0, DST, #15 @@ -810,7 +859,9 @@ fname: newline preload_line 1, src_bpp, src_bpp_shift, SRC /* in: X, corrupts: WK0-WK1 */ preload_line 1, mask_bpp, mask_bpp_shift, MASK + .if ((flags) & FLAG_NO_PRELOAD_DST) == 0 preload_line 1, dst_r_bpp, dst_bpp_shift, DST + .endif .if dst_w_bpp == 8 tst DST, #3 @@ -841,12 +892,22 @@ fname: 177: /* Check for another line */ end_of_line %(dst_w_bpp < 32), %((flags) & FLAG_SPILL_LINE_VARS_NON_WIDE), 171b, last_one + .if (flags) & FLAG_SPILL_LINE_VARS_NON_WIDE + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4 + .endif 197: .if (flags) & FLAG_SPILL_LINE_VARS add sp, sp, #LINE_SAVED_REG_COUNT*4 .endif 198: + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET-4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET-4 + add sp, sp, #4 + .endif + cleanup #ifdef DEBUG_PARAMS diff --git a/pixman/pixman/pixman-arm-simd.c b/pixman/pixman/pixman-arm-simd.c index 8fbc4397d..c17ce5a37 100644 --- a/pixman/pixman/pixman-arm-simd.c +++ b/pixman/pixman/pixman-arm-simd.c @@ -46,6 +46,8 @@ PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, add_8_8, uint8_t, 1, uint8_t, 1) PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, over_8888_8888, uint32_t, 1, uint32_t, 1) +PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, in_reverse_8888_8888, + uint32_t, 1, uint32_t, 1) PIXMAN_ARM_BIND_FAST_PATH_N_DST (0, armv6, over_reverse_n_8888, uint32_t, 1) @@ -56,6 +58,9 @@ PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, armv6, over_8888_n_8888, PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, armv6, over_n_8_8888, uint8_t, 1, uint32_t, 1) +PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, armv6, over_n_8888_8888_ca, + uint32_t, 1, uint32_t, 1) + PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6, 0565_0565, SRC, uint16_t, uint16_t) PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6, 8888_8888, SRC, @@ -238,6 +243,16 @@ static const pixman_fast_path_t arm_simd_fast_paths[] = PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, armv6_composite_over_n_8_8888), PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, armv6_composite_over_n_8_8888), + PIXMAN_STD_FAST_PATH (IN_REVERSE, a8r8g8b8, null, a8r8g8b8, armv6_composite_in_reverse_8888_8888), + PIXMAN_STD_FAST_PATH (IN_REVERSE, a8r8g8b8, null, x8r8g8b8, armv6_composite_in_reverse_8888_8888), + PIXMAN_STD_FAST_PATH (IN_REVERSE, a8b8g8r8, null, a8b8g8r8, armv6_composite_in_reverse_8888_8888), + PIXMAN_STD_FAST_PATH (IN_REVERSE, a8b8g8r8, null, x8b8g8r8, armv6_composite_in_reverse_8888_8888), + + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, armv6_composite_over_n_8888_8888_ca), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, armv6_composite_over_n_8888_8888_ca), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, armv6_composite_over_n_8888_8888_ca), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, armv6_composite_over_n_8888_8888_ca), + PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, r5g6b5, armv6_0565_0565), PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, b5g6r5, b5g6r5, armv6_0565_0565), diff --git a/pixman/pixman/pixman-bits-image.c b/pixman/pixman/pixman-bits-image.c index f9121a365..dcdcc6994 100644 --- a/pixman/pixman/pixman-bits-image.c +++ b/pixman/pixman/pixman-bits-image.c @@ -926,7 +926,7 @@ create_bits (pixman_format_code_t format, if (_pixman_multiply_overflows_size (height, stride)) return NULL; - buf_size = height * stride; + buf_size = (size_t)height * stride; if (rowstride_bytes) *rowstride_bytes = stride; diff --git a/xorg-server/.gitignore b/xorg-server/.gitignore index 94a12fdc2..dc56b4651 100644 --- a/xorg-server/.gitignore +++ b/xorg-server/.gitignore @@ -41,6 +41,7 @@ mkinstalldirs py-compile stamp-h? symlink-tree +test-driver texinfo.tex ylwrap diff --git a/xorg-server/Xext/xres.c b/xorg-server/Xext/xres.c index b26cbb5c5..546b942a1 100644 --- a/xorg-server/Xext/xres.c +++ b/xorg-server/Xext/xres.c @@ -353,9 +353,9 @@ static unsigned long ResGetApproxPixmapBytes(PixmapPtr pix) { unsigned long nPixels; - int bytesPerPixel; + float bytesPerPixel; - bytesPerPixel = pix->drawable.bitsPerPixel >> 3; + bytesPerPixel = (float)pix->drawable.bitsPerPixel / 8.0; nPixels = pix->drawable.width * pix->drawable.height; /* Divide by refcnt as pixmap could be shared between clients, diff --git a/xorg-server/composite/compwindow.c b/xorg-server/composite/compwindow.c index 882429414..9a6b2dae8 100644 --- a/xorg-server/composite/compwindow.c +++ b/xorg-server/composite/compwindow.c @@ -525,6 +525,7 @@ compCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) } FreeScratchGC(pGC); } + RegionUninit(&rgnDst); return; } dx = pPixmap->screen_x - cw->oldx; diff --git a/xorg-server/configure.ac b/xorg-server/configure.ac index 695a4819a..0c8b5162d 100644 --- a/xorg-server/configure.ac +++ b/xorg-server/configure.ac @@ -629,7 +629,7 @@ AC_ARG_ENABLE(suid-wrapper, AS_HELP_STRING([--enable-suid-wrapper], [Build suid- dnl DDXes. AC_ARG_ENABLE(xorg, AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto]) -AC_ARG_ENABLE(dmx, AS_HELP_STRING([--enable-dmx], [Build DMX server (default: auto)]), [DMX=$enableval], [DMX=no]) +AC_ARG_ENABLE(dmx, AS_HELP_STRING([--enable-dmx], [Build DMX server (default: no)]), [DMX=$enableval], [DMX=no]) AC_ARG_ENABLE(xvfb, AS_HELP_STRING([--enable-xvfb], [Build Xvfb server (default: yes)]), [XVFB=$enableval], [XVFB=yes]) AC_ARG_ENABLE(xnest, AS_HELP_STRING([--enable-xnest], [Build Xnest server (default: auto)]), [XNEST=$enableval], [XNEST=auto]) AC_ARG_ENABLE(xquartz, AS_HELP_STRING([--enable-xquartz], [Build Xquartz server for OS-X (default: auto)]), [XQUARTZ=$enableval], [XQUARTZ=auto]) @@ -789,13 +789,13 @@ APPLEWMPROTO="applewmproto >= 1.4" XSHMFENCE="xshmfence >= 1.1" dnl Required modules -XPROTO="xproto >= 7.0.22" +XPROTO="xproto >= 7.0.26" RANDRPROTO="randrproto >= 1.4.0" RENDERPROTO="renderproto >= 0.11" XEXTPROTO="xextproto >= 7.2.99.901" INPUTPROTO="inputproto >= 2.3" KBPROTO="kbproto >= 1.0.3" -FONTSPROTO="fontsproto" +FONTSPROTO="fontsproto >= 2.1.3" FIXESPROTO="fixesproto >= 5.0" DAMAGEPROTO="damageproto >= 1.1" XCMISCPROTO="xcmiscproto >= 1.2.0" @@ -2458,7 +2458,6 @@ if test "x$XWAYLAND" = xyes; then XWAYLAND_SYS_LIBS="$XWAYLANDMODULES_LIBS $GLX_SYS_LIBS" AC_SUBST([XWAYLAND_LIBS]) AC_SUBST([XWAYLAND_SYS_LIBS]) - WAYLAND_SCANNER_RULES(['$(top_srcdir)/hw/xwayland']) fi diff --git a/xorg-server/dix/dixfonts.c b/xorg-server/dix/dixfonts.c index 83d2539c7..1c6442c8f 100644 --- a/xorg-server/dix/dixfonts.c +++ b/xorg-server/dix/dixfonts.c @@ -1658,7 +1658,7 @@ SetFontPathElements(int npaths, unsigned char *paths, int *bad, Bool persist) err = (*fpe_functions[fpe->type].init_fpe) (fpe); if (err != Successful) { if (persist) { - ErrorF + DebugF ("[dix] Could not init font path element %s, removing from list!\n", fpe->name); } diff --git a/xorg-server/dix/dixutils.c b/xorg-server/dix/dixutils.c index 5de74c8b4..cdd370bd6 100644 --- a/xorg-server/dix/dixutils.c +++ b/xorg-server/dix/dixutils.c @@ -866,3 +866,28 @@ InitCallbackManager(void) { DeleteCallbackManager(); } + +/** + * Coordinates the global GL context used by modules in the X Server + * doing rendering with OpenGL. + * + * When setting a GL context (glXMakeCurrent() or eglMakeCurrent()), + * there is an expensive implied glFlush() required by the GLX and EGL + * APIs, so modules don't want to have to do it on every request. But + * the individual modules using GL also don't know about each other, + * so they have to coordinate who owns the current context. + * + * When you're about to do a MakeCurrent, you should set this variable + * to your context's address, and you can skip MakeCurrent if it's + * already set to yours. + * + * When you're about to do a DestroyContext, you should set this to + * NULL if it's set to your context. + * + * When you're about to do an unbindContext on a DRI driver, you + * should set this to NULL. Despite the unbindContext interface + * sounding like it only unbinds the passed in context, it actually + * unconditionally clears the dispatch table even if the given + * context wasn't current. + */ +void *lastGLContext = NULL; diff --git a/xorg-server/fb/fbpict.c b/xorg-server/fb/fbpict.c index c2ee8a552..21baf8950 100644 --- a/xorg-server/fb/fbpict.c +++ b/xorg-server/fb/fbpict.c @@ -191,7 +191,7 @@ fbGlyphs(CARD8 op, pixman_glyph_get_extents(glyphCache, n_glyphs, pglyphs, &extents); pixman_composite_glyphs(op, srcImage, dstImage, format, - xSrc + srcXoff + xDst, ySrc + srcYoff + yDst, + xSrc + srcXoff + extents.x1 - xDst, ySrc + srcYoff + extents.y1 - yDst, extents.x1, extents.y1, extents.x1 + dstXoff, extents.y1 + dstYoff, extents.x2 - extents.x1, diff --git a/xorg-server/glamor/Makefile.am b/xorg-server/glamor/Makefile.am index 4d0cc8138..bde58b632 100644 --- a/xorg-server/glamor/Makefile.am +++ b/xorg-server/glamor/Makefile.am @@ -13,25 +13,27 @@ libglamor_la_SOURCES = \ glamor_debug.h \ glamor_fill.c \ glamor_font.c \ + glamor_font.h \ glamor_glx.c \ glamor_glyphs.c \ glamor_polylines.c \ - glamor_putimage.c \ glamor_segment.c \ + glamor_image.c \ glamor_render.c \ glamor_gradient.c \ glamor_program.c \ + glamor_program.h \ glamor_rects.c \ glamor_spans.c \ glamor_text.c \ glamor_transfer.c \ glamor_transfer.h \ glamor_transform.c \ + glamor_transform.h \ glamor_trapezoid.c \ glamor_tile.c \ glamor_triangles.c\ glamor_addtraps.c\ - glamor_getimage.c\ glamor_copyplane.c\ glamor_glyphblt.c\ glamor_points.c\ diff --git a/xorg-server/glamor/glamor.c b/xorg-server/glamor/glamor.c index 2c2d9760c..08f6ba174 100644 --- a/xorg-server/glamor/glamor.c +++ b/xorg-server/glamor/glamor.c @@ -146,7 +146,7 @@ glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth, glamor_pixmap_type_t type = GLAMOR_TEXTURE_ONLY; glamor_pixmap_private *pixmap_priv; glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_pixmap_fbo *fbo; + glamor_pixmap_fbo *fbo = NULL; int pitch; GLenum format; @@ -199,13 +199,12 @@ glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth, pixmap_priv->base.box.x2 = w; pixmap_priv->base.box.y2 = h; fbo = glamor_create_fbo(glamor_priv, w, h, format, usage); - } - else { - DEBUGF("Create LARGE pixmap %p width %d height %d\n", pixmap, w, h); + } else { + int tile_size = glamor_priv->max_fbo_size; + DEBUGF("Create LARGE pixmap %p width %d height %d, tile size %d\n", pixmap, w, h, tile_size); pixmap_priv->type = GLAMOR_TEXTURE_LARGE; fbo = glamor_create_fbo_array(glamor_priv, w, h, format, usage, - glamor_priv->max_fbo_size, - glamor_priv->max_fbo_size, pixmap_priv); + tile_size, tile_size, pixmap_priv); } if (fbo == NULL) { @@ -248,11 +247,10 @@ glamor_block_handler(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glamor_priv->tick++; glFlush(); glamor_fbo_expire(glamor_priv); - glamor_put_context(glamor_priv); if (glamor_priv->state == RENDER_STATE && glamor_priv->render_idle_cnt++ > RENDER_IDEL_MAX) { glamor_priv->state = IDLE_STATE; @@ -265,9 +263,8 @@ _glamor_block_handler(void *data, OSTimePtr timeout, void *last_select_mask) { glamor_screen_private *glamor_priv = data; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glFlush(); - glamor_put_context(glamor_priv); } static void @@ -509,7 +506,6 @@ glamor_init(ScreenPtr screen, unsigned int flags) #ifdef GLAMOR_TRAPEZOID_SHADER glamor_init_trapezoid_shader(screen); #endif - glamor_init_putimage_shaders(screen); glamor_init_finish_access_shaders(screen); #ifdef GLAMOR_GRADIENT_SHADER glamor_init_gradient_shader(screen); @@ -543,7 +539,6 @@ glamor_release_screen_priv(ScreenPtr screen) #ifdef GLAMOR_TRAPEZOID_SHADER glamor_fini_trapezoid_shader(screen); #endif - glamor_fini_putimage_shaders(screen); glamor_fini_finish_access_shaders(screen); #ifdef GLAMOR_GRADIENT_SHADER glamor_fini_gradient_shader(screen); @@ -662,7 +657,8 @@ glamor_fd_from_pixmap(ScreenPtr screen, switch (pixmap_priv->type) { case GLAMOR_TEXTURE_DRM: case GLAMOR_TEXTURE_ONLY: - glamor_pixmap_ensure_fbo(pixmap, GL_RGBA, 0); + if (!glamor_pixmap_ensure_fbo(pixmap, GL_RGBA, 0)) + return -1; return glamor_egl_dri3_fd_name_from_tex(screen, pixmap, pixmap_priv->base.fbo->tex, @@ -686,7 +682,8 @@ glamor_name_from_pixmap(PixmapPtr pixmap, CARD16 *stride, CARD32 *size) switch (pixmap_priv->type) { case GLAMOR_TEXTURE_DRM: case GLAMOR_TEXTURE_ONLY: - glamor_pixmap_ensure_fbo(pixmap, GL_RGBA, 0); + if (!glamor_pixmap_ensure_fbo(pixmap, GL_RGBA, 0)) + return -1; return glamor_egl_dri3_fd_name_from_tex(pixmap->drawable.pScreen, pixmap, pixmap_priv->base.fbo->tex, diff --git a/xorg-server/glamor/glamor_context.h b/xorg-server/glamor/glamor_context.h index 8781afc48..47b87e620 100644 --- a/xorg-server/glamor/glamor_context.h +++ b/xorg-server/glamor/glamor_context.h @@ -43,14 +43,7 @@ struct glamor_context { /** The GLXDrawable we should MakeCurrent to */ uint32_t drawable_xid; - /** - * Count of how deep in glamor_get_context() we are, to reduce - * MakeCurrent calls. - */ - int get_count; - - void (*get_context)(struct glamor_context *glamor_ctx); - void (*put_context)(struct glamor_context *glamor_ctx); + void (*make_current)(struct glamor_context *glamor_ctx); }; Bool glamor_glx_screen_init(struct glamor_context *glamor_ctx); diff --git a/xorg-server/glamor/glamor_copyarea.c b/xorg-server/glamor/glamor_copyarea.c index 996611c6c..e1988225f 100644 --- a/xorg-server/glamor/glamor_copyarea.c +++ b/xorg-server/glamor/glamor_copyarea.c @@ -70,7 +70,7 @@ glamor_copy_n_to_n_fbo_blit(DrawablePtr src, pixmap_priv_get_fbo_off(dst_pixmap_priv, &fbo_x_off, &fbo_y_off); pixmap_priv_get_fbo_off(src_pixmap_priv, &src_fbo_x_off, &src_fbo_y_off); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glBindFramebuffer(GL_READ_FRAMEBUFFER_EXT, src_pixmap_priv->base.fbo->fb); glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off, &dst_y_off); glamor_get_drawable_deltas(src, src_pixmap, &src_x_off, &src_y_off); @@ -112,7 +112,6 @@ glamor_copy_n_to_n_fbo_blit(DrawablePtr src, GL_COLOR_BUFFER_BIT, GL_NEAREST); } } - glamor_put_context(glamor_priv); glamor_priv->state = BLIT_STATE; return TRUE; } @@ -155,7 +154,7 @@ glamor_copy_n_to_n_textured(DrawablePtr src, glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off, &dst_y_off); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glamor_set_destination_pixmap_priv_nc(dst_pixmap_priv); glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, @@ -206,7 +205,6 @@ glamor_copy_n_to_n_textured(DrawablePtr src, glDisableVertexAttribArray(GLAMOR_VERTEX_POS); glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); /* The source texture is bound to a fbo, we have to flush it here. */ - glamor_put_context(glamor_priv); glamor_priv->state = RENDER_STATE; glamor_priv->render_idle_cnt = 0; return TRUE; @@ -367,12 +365,10 @@ _glamor_copy_n_to_n(DrawablePtr src, if (gc) { if (!glamor_set_planemask(dst_pixmap, gc->planemask)) goto fall_back; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (!glamor_set_alu(screen, gc->alu)) { - glamor_put_context(glamor_priv); - goto fail; + goto fail_noregion; } - glamor_put_context(glamor_priv); } if (!src_pixmap_priv) { @@ -537,7 +533,6 @@ _glamor_copy_n_to_n(DrawablePtr src, if (n_dst_region == 0) ok = TRUE; free(clipped_dst_regions); - RegionUninit(®ion); } else { ok = __glamor_copy_n_to_n(src, dst, gc, box, nbox, dx, dy, @@ -545,9 +540,10 @@ _glamor_copy_n_to_n(DrawablePtr src, } fail: - glamor_get_context(glamor_priv); + RegionUninit(®ion); + fail_noregion: + glamor_make_current(glamor_priv); glamor_set_alu(screen, GXcopy); - glamor_put_context(glamor_priv); if (ok) return TRUE; diff --git a/xorg-server/glamor/glamor_core.c b/xorg-server/glamor/glamor_core.c index 7b1615d2d..b34943761 100644 --- a/xorg-server/glamor/glamor_core.c +++ b/xorg-server/glamor/glamor_core.c @@ -127,7 +127,7 @@ glamor_prepare_access(DrawablePtr drawable, glamor_access_t access) */ assert(!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv) || access == GLAMOR_ACCESS_RO || - pixmap_priv->base.mapped_for_write); + pixmap_priv->base.map_access == GLAMOR_ACCESS_RW); return TRUE; } pixmap_priv->base.map_access = access; @@ -241,7 +241,7 @@ glamor_init_finish_access_shaders(ScreenPtr screen) char *source; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glamor_priv->finish_access_prog[0] = glCreateProgram(); glamor_priv->finish_access_prog[1] = glCreateProgram(); @@ -300,7 +300,6 @@ glamor_init_finish_access_shaders(ScreenPtr screen) glUniform1i(glamor_priv->finish_access_revert[1], 0); glUniform1i(sampler_uniform_location, 0); glUniform1i(glamor_priv->finish_access_swap_rb[1], 0); - glamor_put_context(glamor_priv); } void @@ -309,10 +308,9 @@ glamor_fini_finish_access_shaders(ScreenPtr screen) glamor_screen_private *glamor_priv; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glDeleteProgram(glamor_priv->finish_access_prog[0]); glDeleteProgram(glamor_priv->finish_access_prog[1]); - glamor_put_context(glamor_priv); } void @@ -341,11 +339,10 @@ glamor_finish_access(DrawablePtr drawable) if (pixmap_priv->base.fbo->pbo != 0 && pixmap_priv->base.fbo->pbo_valid) { assert(glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); glDeleteBuffers(1, &pixmap_priv->base.fbo->pbo); - glamor_put_context(glamor_priv); pixmap_priv->base.fbo->pbo_valid = FALSE; pixmap_priv->base.fbo->pbo = 0; diff --git a/xorg-server/glamor/glamor_egl.c b/xorg-server/glamor/glamor_egl.c index d37de9b95..54af2753e 100644 --- a/xorg-server/glamor/glamor_egl.c +++ b/xorg-server/glamor/glamor_egl.c @@ -95,30 +95,22 @@ glamor_egl_get_screen_private(ScrnInfoPtr scrn) } static void -glamor_egl_get_context(struct glamor_context *glamor_ctx) +glamor_egl_make_current(struct glamor_context *glamor_ctx) { - if (glamor_ctx->get_count++) - return; - - if (glamor_ctx->ctx != eglGetCurrentContext()) { - eglMakeCurrent(glamor_ctx->display, EGL_NO_SURFACE, - EGL_NO_SURFACE, EGL_NO_CONTEXT); - if (!eglMakeCurrent(glamor_ctx->display, - EGL_NO_SURFACE, EGL_NO_SURFACE, - glamor_ctx->ctx)) { - FatalError("Failed to make EGL context current\n"); - } - } -} - -static void -glamor_egl_put_context(struct glamor_context *glamor_ctx) -{ - if (--glamor_ctx->get_count) - return; - + /* There's only a single global dispatch table in Mesa. EGL, GLX, + * and AIGLX's direct dispatch table manipulation don't talk to + * each other. We need to set the context to NULL first to avoid + * EGL's no-op context change fast path when switching back to + * EGL. + */ eglMakeCurrent(glamor_ctx->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + + if (!eglMakeCurrent(glamor_ctx->display, + EGL_NO_SURFACE, EGL_NO_SURFACE, + glamor_ctx->ctx)) { + FatalError("Failed to make EGL context current\n"); + } } static EGLImageKHR @@ -166,10 +158,14 @@ glamor_get_flink_name(int fd, int handle, int *name) } static Bool -glamor_create_texture_from_image(struct glamor_egl_screen_private - *glamor_egl, +glamor_create_texture_from_image(ScreenPtr screen, EGLImageKHR image, GLuint * texture) { + struct glamor_screen_private *glamor_priv = + glamor_get_screen_private(screen); + + glamor_make_current(glamor_priv); + glGenTextures(1, texture); glBindTexture(GL_TEXTURE_2D, *texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -177,6 +173,7 @@ glamor_create_texture_from_image(struct glamor_egl_screen_private glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image); glBindTexture(GL_TEXTURE_2D, 0); + return TRUE; } @@ -211,7 +208,7 @@ glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h) gbm_bo_destroy(bo); if (image == EGL_NO_IMAGE_KHR) return 0; - glamor_create_texture_from_image(glamor_egl, image, &texture); + glamor_create_texture_from_image(screen, image, &texture); eglDestroyImageKHR(glamor_egl->display, image); return texture; @@ -289,7 +286,7 @@ glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride) glamor_egl = glamor_egl_get_screen_private(scrn); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (glamor_egl->has_gem) { if (!glamor_get_flink_name(glamor_egl->fd, handle, &name)) { xf86DrvMsg(scrn->scrnIndex, X_ERROR, @@ -312,14 +309,13 @@ glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride) glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY); goto done; } - glamor_create_texture_from_image(glamor_egl, image, &texture); + glamor_create_texture_from_image(screen, image, &texture); glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM); glamor_set_pixmap_texture(pixmap, texture); pixmap_priv->base.image = image; ret = TRUE; done: - glamor_put_context(glamor_priv); return ret; } @@ -339,7 +335,7 @@ glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap, void *bo) glamor_egl = glamor_egl_get_screen_private(scrn); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); image = eglCreateImageKHR(glamor_egl->display, glamor_egl->context, @@ -348,14 +344,13 @@ glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap, void *bo) glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY); goto done; } - glamor_create_texture_from_image(glamor_egl, image, &texture); + glamor_create_texture_from_image(screen, image, &texture); glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM); glamor_set_pixmap_texture(pixmap, texture); pixmap_priv->base.image = image; ret = TRUE; done: - glamor_put_context(glamor_priv); return ret; } @@ -413,7 +408,7 @@ glamor_egl_dri3_fd_name_from_tex(ScreenPtr screen, glamor_egl = glamor_egl_get_screen_private(scrn); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); image = pixmap_priv->base.image; if (!image) { @@ -448,7 +443,6 @@ glamor_egl_dri3_fd_name_from_tex(ScreenPtr screen, gbm_bo_destroy(bo); failure: - glamor_put_context(glamor_priv); return fd; #else return -1; @@ -678,8 +672,7 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx) glamor_ctx->ctx = glamor_egl->context; glamor_ctx->display = glamor_egl->display; - glamor_ctx->get_context = glamor_egl_get_context; - glamor_ctx->put_context = glamor_egl_put_context; + glamor_ctx->make_current = glamor_egl_make_current; if (glamor_egl->dri3_capable) { /* Tell the core that we have the interfaces for import/export diff --git a/xorg-server/glamor/glamor_fbo.c b/xorg-server/glamor/glamor_fbo.c index 4f6da67fb..552168381 100644 --- a/xorg-server/glamor/glamor_fbo.c +++ b/xorg-server/glamor/glamor_fbo.c @@ -129,7 +129,7 @@ glamor_pixmap_fbo_cache_get(glamor_screen_private *glamor_priv, void glamor_purge_fbo(glamor_pixmap_fbo *fbo) { - glamor_get_context(fbo->glamor_priv); + glamor_make_current(fbo->glamor_priv); if (fbo->fb) glDeleteFramebuffers(1, &fbo->fb); @@ -137,7 +137,6 @@ glamor_purge_fbo(glamor_pixmap_fbo *fbo) glDeleteTextures(1, &fbo->tex); if (fbo->pbo) glDeleteBuffers(1, &fbo->pbo); - glamor_put_context(fbo->glamor_priv); free(fbo); } @@ -175,12 +174,12 @@ glamor_pixmap_fbo_cache_put(glamor_pixmap_fbo *fbo) #endif } -static void +static int glamor_pixmap_ensure_fb(glamor_pixmap_fbo *fbo) { - int status; + int status, err = 0; - glamor_get_context(fbo->glamor_priv); + glamor_make_current(fbo->glamor_priv); if (fbo->fb == 0) glGenFramebuffers(1, &fbo->fb); @@ -216,10 +215,11 @@ glamor_pixmap_ensure_fb(glamor_pixmap_fbo *fbo) break; } - FatalError("destination is framebuffer incomplete: %s [%x]\n", - str, status); + glamor_fallback("glamor: Failed to create fbo, %s\n", str); + err = -1; } - glamor_put_context(fbo->glamor_priv); + + return err; } glamor_pixmap_fbo * @@ -241,14 +241,17 @@ glamor_create_fbo_from_tex(glamor_screen_private *glamor_priv, fbo->glamor_priv = glamor_priv; if (flag == GLAMOR_CREATE_PIXMAP_MAP) { - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glGenBuffers(1, &fbo->pbo); - glamor_put_context(glamor_priv); goto done; } - if (flag != GLAMOR_CREATE_FBO_NO_FBO) - glamor_pixmap_ensure_fb(fbo); + if (flag != GLAMOR_CREATE_FBO_NO_FBO) { + if (glamor_pixmap_ensure_fb(fbo) != 0) { + glamor_purge_fbo(fbo); + fbo = NULL; + } + } done: return fbo; @@ -341,14 +344,13 @@ _glamor_create_tex(glamor_screen_private *glamor_priv, w, h); } if (!tex) { - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0, format, GL_UNSIGNED_BYTE, NULL); - glamor_put_context(glamor_priv); } return tex; } @@ -367,10 +369,11 @@ glamor_create_fbo(glamor_screen_private *glamor_priv, if (flag == GLAMOR_CREATE_PIXMAP_MAP) goto no_tex; - if (flag == GLAMOR_CREATE_PIXMAP_FIXUP) - cache_flag = GLAMOR_CACHE_EXACT_SIZE; - else - cache_flag = 0; + /* Tiling from textures requires exact pixmap sizes. As we don't + * know which pixmaps will be used as tiles, just allocate + * everything at the requested size + */ + cache_flag = GLAMOR_CACHE_EXACT_SIZE; fbo = glamor_pixmap_fbo_cache_get(glamor_priv, w, h, format, cache_flag); if (fbo) @@ -565,7 +568,8 @@ glamor_pixmap_ensure_fbo(PixmapPtr pixmap, GLenum format, int flag) pixmap->drawable.height, format); if (flag != GLAMOR_CREATE_FBO_NO_FBO && pixmap_priv->base.fbo->fb == 0) - glamor_pixmap_ensure_fb(pixmap_priv->base.fbo); + if (glamor_pixmap_ensure_fb(pixmap_priv->base.fbo) != 0) + return FALSE; } return TRUE; diff --git a/xorg-server/glamor/glamor_fill.c b/xorg-server/glamor/glamor_fill.c index 2fa726e72..073904d2a 100644 --- a/xorg-server/glamor/glamor_fill.c +++ b/xorg-server/glamor/glamor_fill.c @@ -156,7 +156,7 @@ glamor_init_solid_shader(ScreenPtr screen) GLint fs_prog, vs_prog; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glamor_priv->solid_prog = glCreateProgram(); vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, solid_vs); fs_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, solid_fs); @@ -169,7 +169,6 @@ glamor_init_solid_shader(ScreenPtr screen) glamor_priv->solid_color_uniform_location = glGetUniformLocation(glamor_priv->solid_prog, "color"); - glamor_put_context(glamor_priv); } void @@ -178,9 +177,8 @@ glamor_fini_solid_shader(ScreenPtr screen) glamor_screen_private *glamor_priv; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glDeleteProgram(glamor_priv->solid_prog); - glamor_put_context(glamor_priv); } static void @@ -196,7 +194,7 @@ _glamor_solid_boxes(PixmapPtr pixmap, BoxPtr box, int nbox, float *color) glamor_set_destination_pixmap_priv_nc(pixmap_priv); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glUseProgram(glamor_priv->solid_prog); glUniform4fv(glamor_priv->solid_color_uniform_location, 1, color); @@ -255,7 +253,6 @@ _glamor_solid_boxes(PixmapPtr pixmap, BoxPtr box, int nbox, float *color) free(vertices); glDisableVertexAttribArray(GLAMOR_VERTEX_POS); - glamor_put_context(glamor_priv); glamor_priv->state = RENDER_STATE; glamor_priv->render_idle_cnt = 0; } @@ -338,13 +335,12 @@ glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, return FALSE; } - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (!glamor_set_alu(screen, alu)) { if (alu == GXclear) fg_pixel = 0; else { glamor_fallback("unsupported alu %x\n", alu); - glamor_put_context(glamor_priv); return FALSE; } } @@ -355,7 +351,6 @@ glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, glamor_solid_boxes(pixmap, &box, 1, fg_pixel); glamor_set_alu(screen, GXcopy); - glamor_put_context(glamor_priv); return TRUE; } diff --git a/xorg-server/glamor/glamor_font.c b/xorg-server/glamor/glamor_font.c index 47dfe2a69..f747d59a1 100644 --- a/xorg-server/glamor/glamor_font.c +++ b/xorg-server/glamor/glamor_font.c @@ -89,7 +89,7 @@ glamor_font_get(ScreenPtr screen, FontPtr font) glamor_font->default_col = font->info.defaultCh; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glGenTextures(1, &glamor_font->texture_id); glActiveTexture(GL_TEXTURE0); @@ -119,8 +119,6 @@ glamor_font_get(ScreenPtr screen, FontPtr font) } } - glamor_put_context(glamor_priv); - return glamor_font; } @@ -150,9 +148,8 @@ glamor_unrealize_font(ScreenPtr screen, FontPtr font) glamor_font->realized = FALSE; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glDeleteTextures(1, &glamor_font->texture_id); - glamor_put_context(glamor_priv); /* Check to see if all of the screens are done with this font * and free the private when that happens diff --git a/xorg-server/glamor/glamor_getimage.c b/xorg-server/glamor/glamor_getimage.c deleted file mode 100644 index a932473e8..000000000 --- a/xorg-server/glamor/glamor_getimage.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright © 2009 Intel Corporation - * Copyright © 1998 Keith Packard - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - * - * Authors: - * Zhigang Gong <zhigang.gong@gmail.com> - * - */ - -#include "glamor_priv.h" - -static Bool -_glamor_get_image(DrawablePtr drawable, int x, int y, int w, int h, - unsigned int format, unsigned long planeMask, char *d, - Bool fallback) -{ - PixmapPtr pixmap, sub_pixmap; - struct glamor_pixmap_private *pixmap_priv; - int x_off, y_off; - int stride; - void *data; - - pixmap = glamor_get_drawable_pixmap(drawable); - glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off); - - if (format != ZPixmap) - goto fall_back; - - if (!glamor_set_planemask(pixmap, planeMask)) { - glamor_fallback("Failedto set planemask in glamor_solid.\n"); - goto fall_back; - } - pixmap_priv = glamor_get_pixmap_private(pixmap); - - if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) - goto fall_back; - stride = PixmapBytePad(w, drawable->depth); - - x += drawable->x + x_off; - y += drawable->y + y_off; - - data = glamor_download_sub_pixmap_to_cpu(pixmap, x, y, w, h, stride, - d, 0, GLAMOR_ACCESS_RO); - if (data != NULL) { - assert(data == d); - return TRUE; - } - fall_back: - sub_pixmap = glamor_get_sub_pixmap(pixmap, x + x_off + drawable->x, - y + y_off + drawable->y, w, h, - GLAMOR_ACCESS_RO); - if (sub_pixmap) { - fbGetImage(&sub_pixmap->drawable, 0, 0, w, h, format, planeMask, d); - glamor_put_sub_pixmap(sub_pixmap, pixmap, - x + x_off + drawable->x, - y + y_off + drawable->y, w, h, GLAMOR_ACCESS_RO); - } - else - miGetImage(drawable, x, y, w, h, format, planeMask, d); - - return TRUE; -} - -void -glamor_get_image(DrawablePtr pDrawable, int x, int y, int w, int h, - unsigned int format, unsigned long planeMask, char *d) -{ - _glamor_get_image(pDrawable, x, y, w, h, format, planeMask, d, TRUE); -} - -Bool -glamor_get_image_nf(DrawablePtr pDrawable, int x, int y, int w, int h, - unsigned int format, unsigned long planeMask, char *d) -{ - return _glamor_get_image(pDrawable, x, y, w, - h, format, planeMask, d, FALSE); -} diff --git a/xorg-server/glamor/glamor_glx.c b/xorg-server/glamor/glamor_glx.c index 8f47c3d2c..7107c7c17 100644 --- a/xorg-server/glamor/glamor_glx.c +++ b/xorg-server/glamor/glamor_glx.c @@ -34,28 +34,21 @@ */ static void -glamor_glx_get_context(struct glamor_context *glamor_ctx) +glamor_glx_make_current(struct glamor_context *glamor_ctx) { - GLXContext old_ctx; - - if (glamor_ctx->get_count++) - return; - - old_ctx = glXGetCurrentContext(); - if (old_ctx == glamor_ctx->ctx) - return; + /* There's only a single global dispatch table in Mesa. EGL, GLX, + * and AIGLX's direct dispatch table manipulation don't talk to + * each other. We need to set the context to NULL first to avoid + * GLX's no-op context change fast path when switching back to + * GLX. + */ + glXMakeCurrent(glamor_ctx->display, None, None); glXMakeCurrent(glamor_ctx->display, glamor_ctx->drawable_xid, glamor_ctx->ctx); } -static void -glamor_glx_put_context(struct glamor_context *glamor_ctx) -{ - --glamor_ctx->get_count; -} - Bool glamor_glx_screen_init(struct glamor_context *glamor_ctx) { @@ -69,8 +62,7 @@ glamor_glx_screen_init(struct glamor_context *glamor_ctx) glamor_ctx->drawable_xid = glXGetCurrentDrawable(); - glamor_ctx->get_context = glamor_glx_get_context; - glamor_ctx->put_context = glamor_glx_put_context; + glamor_ctx->make_current = glamor_glx_make_current; return True; } diff --git a/xorg-server/glamor/glamor_glyphblt.c b/xorg-server/glamor/glamor_glyphblt.c index c031747f7..1c511ff2b 100644 --- a/xorg-server/glamor/glamor_glyphblt.c +++ b/xorg-server/glamor/glamor_glyphblt.c @@ -54,7 +54,7 @@ glamor_poly_glyph_blt_gl(DrawablePtr drawable, GCPtr gc, if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) goto bail; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); prog = glamor_use_program_fill(pixmap, gc, &glamor_priv->poly_glyph_blt_progs, &glamor_facet_poly_glyph_blt); @@ -137,11 +137,9 @@ glamor_poly_glyph_blt_gl(DrawablePtr drawable, GCPtr gc, glDisable(GL_COLOR_LOGIC_OP); glDisableVertexAttribArray(GLAMOR_VERTEX_POS); - glamor_put_context(glamor_priv); return TRUE; bail_ctx: glDisable(GL_COLOR_LOGIC_OP); - glamor_put_context(glamor_priv); bail: return FALSE; } @@ -212,20 +210,18 @@ glamor_push_pixels_points(GCPtr gc, PixmapPtr bitmap, if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) return FALSE; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (!glamor_set_alu(screen, gc->alu)) { if (gc->alu == GXclear) fg_pixel = 0; else { glamor_fallback("unsupported alu %x\n", gc->alu); - glamor_put_context(glamor_priv); return FALSE; } } if (!glamor_set_planemask(pixmap, gc->planemask)) { glamor_fallback("Failed to set planemask in %s.\n", __FUNCTION__); - glamor_put_context(glamor_priv); return FALSE; } @@ -281,8 +277,6 @@ glamor_push_pixels_points(GCPtr gc, PixmapPtr bitmap, glDisableVertexAttribArray(GLAMOR_VERTEX_POS); - glamor_put_context(glamor_priv); - return TRUE; } diff --git a/xorg-server/glamor/glamor_glyphs.c b/xorg-server/glamor/glamor_glyphs.c index a04ae8261..42f5f65f6 100644 --- a/xorg-server/glamor/glamor_glyphs.c +++ b/xorg-server/glamor/glamor_glyphs.c @@ -1285,9 +1285,8 @@ glamor_buffer_glyph(glamor_screen_private *glamor_priv, * thus we have to composite from the cache picture * to the cache picture, we need a flush here to make * sure latter we get the corret glyphs data.*/ - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glFlush(); - glamor_put_context(glamor_priv); } } else { diff --git a/xorg-server/glamor/glamor_gradient.c b/xorg-server/glamor/glamor_gradient.c index c24f3427f..28d66917f 100644 --- a/xorg-server/glamor/glamor_gradient.c +++ b/xorg-server/glamor/glamor_gradient.c @@ -324,7 +324,7 @@ _glamor_create_radial_gradient_program(ScreenPtr screen, int stops_count, return; } - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (dyn_gen && glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][2]) { glDeleteProgram(glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][2]); @@ -371,8 +371,6 @@ _glamor_create_radial_gradient_program(ScreenPtr screen, int stops_count, } glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][index] = gradient_prog; - - glamor_put_context(glamor_priv); } static void @@ -519,7 +517,7 @@ _glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count, return; } - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (dyn_gen && glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][2]) { glDeleteProgram(glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][2]); glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][2] = 0; @@ -562,8 +560,6 @@ _glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count, } glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][index] = gradient_prog; - - glamor_put_context(glamor_priv); } void @@ -595,7 +591,7 @@ glamor_fini_gradient_shader(ScreenPtr screen) int i = 0; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); for (i = 0; i < 3; i++) { /* Linear Gradient */ @@ -607,8 +603,6 @@ glamor_fini_gradient_shader(ScreenPtr screen) glDeleteProgram(glamor_priv->gradient_prog [SHADER_GRADIENT_RADIAL][i]); } - - glamor_put_context(glamor_priv); } static void @@ -739,7 +733,7 @@ _glamor_gradient_set_pixmap_destination(ScreenPtr screen, tex_vertices[0], tex_vertices[1], tex_vertices[2], tex_vertices[3], tex_vertices[4], tex_vertices[5], tex_vertices[6], tex_vertices[7]); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, GL_FALSE, 0, vertices); @@ -749,8 +743,6 @@ _glamor_gradient_set_pixmap_destination(ScreenPtr screen, glEnableVertexAttribArray(GLAMOR_VERTEX_POS); glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE); - glamor_put_context(glamor_priv); - return 1; } @@ -892,7 +884,7 @@ glamor_generate_radial_gradient_picture(ScreenPtr screen, GLint r2_uniform_location = 0; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); /* Create a pixmap with VBO. */ pixmap = glamor_create_pixmap(screen, @@ -1123,7 +1115,6 @@ glamor_generate_radial_gradient_picture(ScreenPtr screen, glDisableVertexAttribArray(GLAMOR_VERTEX_POS); glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); - glamor_put_context(glamor_priv); return dst_picture; GRADIENT_FAIL: @@ -1140,7 +1131,6 @@ glamor_generate_radial_gradient_picture(ScreenPtr screen, glDisableVertexAttribArray(GLAMOR_VERTEX_POS); glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); - glamor_put_context(glamor_priv); return NULL; } @@ -1204,7 +1194,7 @@ glamor_generate_linear_gradient_picture(ScreenPtr screen, GLint pt_distance_uniform_location = 0; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); /* Create a pixmap with VBO. */ pixmap = glamor_create_pixmap(screen, @@ -1468,7 +1458,6 @@ glamor_generate_linear_gradient_picture(ScreenPtr screen, glDisableVertexAttribArray(GLAMOR_VERTEX_POS); glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); - glamor_put_context(glamor_priv); return dst_picture; GRADIENT_FAIL: @@ -1485,7 +1474,6 @@ glamor_generate_linear_gradient_picture(ScreenPtr screen, glDisableVertexAttribArray(GLAMOR_VERTEX_POS); glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); - glamor_put_context(glamor_priv); return NULL; } diff --git a/xorg-server/glamor/glamor_image.c b/xorg-server/glamor/glamor_image.c new file mode 100644 index 000000000..4791d089f --- /dev/null +++ b/xorg-server/glamor/glamor_image.c @@ -0,0 +1,180 @@ +/* + * Copyright © 2014 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "glamor_priv.h" +#include "glamor_transfer.h" +#include "glamor_transform.h" + +/* + * PutImage. Only does ZPixmap right now as other formats are quite a bit harder + */ + +static Bool +glamor_put_image_gl(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, + int w, int h, int leftPad, int format, char *bits) +{ + ScreenPtr screen = drawable->pScreen; + glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); + PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable); + glamor_pixmap_private *pixmap_priv; + uint32_t byte_stride = PixmapBytePad(w, drawable->depth); + RegionRec region; + BoxRec box; + int off_x, off_y; + + pixmap_priv = glamor_get_pixmap_private(pixmap); + + if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) + return FALSE; + + if (gc->alu != GXcopy) + goto bail; + + if (!glamor_pm_is_solid(&pixmap->drawable, gc->planemask)) + goto bail; + + if (format == XYPixmap && drawable->depth == 1 && leftPad == 0) + format = ZPixmap; + + if (format != ZPixmap) + goto bail; + + x += drawable->x; + y += drawable->y; + box.x1 = x; + box.y1 = y; + box.x2 = box.x1 + w; + box.y2 = box.y1 + h; + RegionInit(®ion, &box, 1); + RegionIntersect(®ion, ®ion, gc->pCompositeClip); + + glamor_get_drawable_deltas(drawable, pixmap, &off_x, &off_y); + if (off_x || off_y) { + x += off_x; + y += off_y; + RegionTranslate(®ion, off_x, off_y); + } + + glamor_make_current(glamor_priv); + + glamor_upload_region(pixmap, ®ion, x, y, (uint8_t *) bits, byte_stride); + + RegionUninit(®ion); + return TRUE; +bail: + return FALSE; +} + +static void +glamor_put_image_bail(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, + int w, int h, int leftPad, int format, char *bits) +{ + if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW) && + glamor_prepare_access_gc(gc)) + fbPutImage(drawable, gc, depth, x, y, w, h, leftPad, format, bits); + glamor_finish_access(drawable); +} + +void +glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, + int w, int h, int leftPad, int format, char *bits) +{ + if (glamor_put_image_gl(drawable, gc, depth, x, y, w, h, leftPad, format, bits)) + return; + glamor_put_image_bail(drawable, gc, depth, x, y, w, h, leftPad, format, bits); +} + +Bool +glamor_put_image_nf(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, + int w, int h, int leftPad, int format, char *bits) +{ + if (glamor_put_image_gl(drawable, gc, depth, x, y, w, h, leftPad, format, bits)) + return TRUE; + if (glamor_ddx_fallback_check_pixmap(drawable) && + glamor_ddx_fallback_check_gc(gc)) + return FALSE; + glamor_put_image_bail(drawable, gc, depth, x, y, w, h, leftPad, format, bits); + return TRUE; +} + +static Bool +glamor_get_image_gl(DrawablePtr drawable, int x, int y, int w, int h, + unsigned int format, unsigned long plane_mask, char *d) +{ + PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable); + glamor_pixmap_private *pixmap_priv; + uint32_t byte_stride = PixmapBytePad(w, drawable->depth); + BoxRec box; + int off_x, off_y; + + pixmap_priv = glamor_get_pixmap_private(pixmap); + if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) + goto bail; + + if (format != ZPixmap || !glamor_pm_is_solid(drawable, plane_mask)) + goto bail; + + glamor_get_drawable_deltas(drawable, pixmap, &off_x, &off_y); + box.x1 = x; + box.x2 = x + w; + box.y1 = y; + box.y2 = y + h; + glamor_download_boxes(pixmap, &box, 1, + drawable->x + off_x, drawable->y + off_y, + -x, -y, + (uint8_t *) d, byte_stride); + return TRUE; +bail: + return FALSE; +} + +static void +glamor_get_image_bail(DrawablePtr drawable, int x, int y, int w, int h, + unsigned int format, unsigned long plane_mask, char *d) +{ + if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RO)) + fbGetImage(drawable, x, y, w, h, format, plane_mask, d); + glamor_finish_access(drawable); +} + +void +glamor_get_image(DrawablePtr drawable, int x, int y, int w, int h, + unsigned int format, unsigned long plane_mask, char *d) +{ + if (glamor_get_image_gl(drawable, x, y, w, h, format, plane_mask, d)) + return; + glamor_get_image_bail(drawable, x, y, w, h, format, plane_mask, d); +} + +Bool +glamor_get_image_nf(DrawablePtr drawable, int x, int y, int w, int h, + unsigned int format, unsigned long plane_mask, char *d) +{ + if (glamor_get_image_gl(drawable, x, y, w, h, format, plane_mask, d)) + return TRUE; + + if (glamor_ddx_fallback_check_pixmap(drawable)) + return FALSE; + + glamor_get_image_bail(drawable, x, y, w, h, format, plane_mask, d); + return TRUE; +} diff --git a/xorg-server/glamor/glamor_pixmap.c b/xorg-server/glamor/glamor_pixmap.c index a811f6015..54b414bc2 100644 --- a/xorg-server/glamor/glamor_pixmap.c +++ b/xorg-server/glamor/glamor_pixmap.c @@ -66,12 +66,10 @@ void glamor_set_destination_pixmap_fbo(glamor_pixmap_fbo *fbo, int x0, int y0, int width, int height) { - glamor_get_context(fbo->glamor_priv); + glamor_make_current(fbo->glamor_priv); glBindFramebuffer(GL_FRAMEBUFFER, fbo->fb); glViewport(x0, y0, width, height); - - glamor_put_context(fbo->glamor_priv); } void @@ -707,7 +705,7 @@ __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, unsigned int *tex, int non_sub = 0; unsigned int iformat = 0; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (*tex == 0) { glGenTextures(1, tex); if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) @@ -735,7 +733,6 @@ __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, unsigned int *tex, if (bits == NULL) glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); - glamor_put_context(glamor_priv); } static Bool @@ -832,7 +829,7 @@ _glamor_upload_bits_to_pixmap_texture(PixmapPtr pixmap, GLenum format, x + w, y + h, glamor_priv->yInverted, vertices); /* Slow path, we need to flip y or wire alpha to 1. */ - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), vertices); glEnableVertexAttribArray(GLAMOR_VERTEX_POS); @@ -859,8 +856,6 @@ _glamor_upload_bits_to_pixmap_texture(PixmapPtr pixmap, GLenum format, glDeleteTextures(1, &tex); glBindFramebuffer(GL_FRAMEBUFFER, 0); - glamor_put_context(glamor_priv); - if (need_free_bits) free(bits); return TRUE; @@ -1140,7 +1135,7 @@ glamor_es2_pixmap_read_prepare(PixmapPtr source, int x, int y, int w, int h, if (temp_fbo == NULL) return NULL; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); temp_xscale = 1.0 / w; temp_yscale = 1.0 / h; @@ -1177,7 +1172,6 @@ glamor_es2_pixmap_read_prepare(PixmapPtr source, int x, int y, int w, int h, glDisableVertexAttribArray(GLAMOR_VERTEX_POS); glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); - glamor_put_context(glamor_priv); return temp_fbo; } @@ -1223,6 +1217,7 @@ _glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, GLenum format, assert(0); } + glamor_make_current(glamor_priv); glamor_set_destination_pixmap_priv_nc(pixmap_priv); need_post_conversion = (revert > REVERT_NORMAL); @@ -1255,7 +1250,6 @@ _glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, GLenum format, fbo_y_off = 0; } - glamor_get_context(glamor_priv); glPixelStorei(GL_PACK_ALIGNMENT, 4); if (glamor_priv->has_pack_invert || glamor_priv->yInverted) { @@ -1286,7 +1280,7 @@ _glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, GLenum format, unsigned int temp_pbo; int yy; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glGenBuffers(1, &temp_pbo); glBindBuffer(GL_PIXEL_PACK_BUFFER, temp_pbo); glBufferData(GL_PIXEL_PACK_BUFFER, stride * h, NULL, GL_STREAM_READ); @@ -1301,7 +1295,6 @@ _glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, GLenum format, } glBindFramebuffer(GL_FRAMEBUFFER, 0); - glamor_put_context(glamor_priv); if (need_post_conversion) { /* As OpenGL desktop version never enters here. @@ -1473,10 +1466,9 @@ glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access) data = malloc(stride * pixmap->drawable.height); } else { - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (pixmap_priv->base.fbo->pbo == 0) glGenBuffers(1, &pixmap_priv->base.fbo->pbo); - glamor_put_context(glamor_priv); pbo = pixmap_priv->base.fbo->pbo; } diff --git a/xorg-server/glamor/glamor_points.c b/xorg-server/glamor/glamor_points.c index 0d58e555f..d4525e294 100644 --- a/xorg-server/glamor/glamor_points.c +++ b/xorg-server/glamor/glamor_points.c @@ -52,7 +52,7 @@ glamor_poly_point_gl(DrawablePtr drawable, GCPtr gc, int mode, int npt, DDXPoint if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) goto bail; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (prog->failed) goto bail_ctx; @@ -105,8 +105,6 @@ glamor_poly_point_gl(DrawablePtr drawable, GCPtr gc, int mode, int npt, DDXPoint glDisable(GL_COLOR_LOGIC_OP); glDisableVertexAttribArray(GLAMOR_VERTEX_POS); - glamor_put_context(glamor_priv); - glamor_priv->state = RENDER_STATE; glamor_priv->render_idle_cnt = 0; @@ -114,7 +112,6 @@ glamor_poly_point_gl(DrawablePtr drawable, GCPtr gc, int mode, int npt, DDXPoint bail_ctx: glDisable(GL_COLOR_LOGIC_OP); - glamor_put_context(glamor_priv); bail: return FALSE; } diff --git a/xorg-server/glamor/glamor_priv.h b/xorg-server/glamor/glamor_priv.h index 0cafac4b5..a2a21fca0 100644 --- a/xorg-server/glamor/glamor_priv.h +++ b/xorg-server/glamor/glamor_priv.h @@ -277,11 +277,6 @@ typedef struct glamor_screen_private { /* glamor trapezoid shader. */ GLint trapezoid_prog; - /* glamor_putimage */ - GLint put_image_xybitmap_prog; - GLint put_image_xybitmap_fg_uniform_location; - GLint put_image_xybitmap_bg_uniform_location; - PixmapPtr *back_pixmap; int screen_fbo; struct glamor_saved_procs saved_procs; @@ -704,12 +699,6 @@ void glamor_glyphs(CARD8 op, void glamor_poly_lines(DrawablePtr drawable, GCPtr gc, int mode, int n, DDXPointPtr points); -/* glamor_putimage.c */ -void glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, - int w, int h, int leftPad, int format, char *bits); -void glamor_init_putimage_shaders(ScreenPtr screen); -void glamor_fini_putimage_shaders(ScreenPtr screen); - /* glamor_render.c */ Bool glamor_composite_clipped_region(CARD8 op, PicturePtr source, @@ -951,9 +940,6 @@ Bool glamor_fixup_pixmap_priv(ScreenPtr screen, void glamor_picture_format_fixup(PicturePtr picture, glamor_pixmap_private *pixmap_priv); -void glamor_get_image(DrawablePtr pDrawable, int x, int y, int w, int h, - unsigned int format, unsigned long planeMask, char *d); - void glamor_add_traps(PicturePtr pPicture, INT16 x_off, INT16 y_off, int ntrap, xTrap *traps); @@ -994,6 +980,15 @@ void glamor_poly_fill_rect(DrawablePtr drawable, GCPtr gc, int nrect, xRectangle *prect); +/* glamor_image.c */ +void +glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, + int w, int h, int leftPad, int format, char *bits); + +void +glamor_get_image(DrawablePtr pDrawable, int x, int y, int w, int h, + unsigned int format, unsigned long planeMask, char *d); + /* glamor_glyphblt.c */ void glamor_image_glyph_blt(DrawablePtr pDrawable, GCPtr pGC, int x, int y, unsigned int nglyph, diff --git a/xorg-server/glamor/glamor_putimage.c b/xorg-server/glamor/glamor_putimage.c deleted file mode 100644 index cf7197bfc..000000000 --- a/xorg-server/glamor/glamor_putimage.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright © 2009 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - * - * Authors: - * Eric Anholt <eric@anholt.net> - * Zhigang Gong <zhigang.gong@linux.intel.com> - * - */ - -/** @file glamor_putaimge.c - * - * XPutImage implementation - */ -#include "glamor_priv.h" - -void -glamor_init_putimage_shaders(ScreenPtr screen) -{ -} - -void -glamor_fini_putimage_shaders(ScreenPtr screen) -{ -} - -static Bool -_glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, - int w, int h, int left_pad, int image_format, char *bits, - Bool fallback) -{ - PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable); - glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); - RegionPtr clip; - int x_off, y_off; - Bool ret = FALSE; - PixmapPtr temp_pixmap, sub_pixmap; - glamor_pixmap_private *temp_pixmap_priv; - BoxRec box; - - glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off); - clip = fbGetCompositeClip(gc); - if (image_format == XYBitmap) { - assert(depth == 1); - goto fail; - } - - if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) { - glamor_fallback("has no fbo.\n"); - goto fail; - } - - if (image_format != ZPixmap) { - glamor_fallback("non-ZPixmap\n"); - goto fail; - } - - if (!glamor_set_planemask(pixmap, gc->planemask)) { - goto fail; - } - /* create a temporary pixmap and upload the bits to that - * pixmap, then apply clip copy it to the destination pixmap.*/ - box.x1 = x + drawable->x; - box.y1 = y + drawable->y; - box.x2 = x + w + drawable->x; - box.y2 = y + h + drawable->y; - - if ((clip != NULL && RegionContainsRect(clip, &box) != rgnIN) - || gc->alu != GXcopy) { - temp_pixmap = glamor_create_pixmap(drawable->pScreen, w, h, depth, 0); - if (temp_pixmap == NULL) - goto fail; - - temp_pixmap_priv = glamor_get_pixmap_private(temp_pixmap); - - if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv)) { - temp_pixmap_priv->base.picture = pixmap_priv->base.picture; - temp_pixmap_priv->base.is_picture = pixmap_priv->base.is_picture; - } - - glamor_upload_sub_pixmap_to_texture(temp_pixmap, 0, 0, w, h, - pixmap->devKind, bits, 0); - - glamor_copy_area(&temp_pixmap->drawable, drawable, gc, 0, 0, w, h, x, - y); - glamor_destroy_pixmap(temp_pixmap); - } - else - glamor_upload_sub_pixmap_to_texture(pixmap, x + drawable->x + x_off, - y + drawable->y + y_off, w, h, - PixmapBytePad(w, depth), bits, 0); - ret = TRUE; - goto done; - - fail: - glamor_set_planemask(pixmap, ~0); - - if (!fallback && glamor_ddx_fallback_check_pixmap(&pixmap->drawable)) - goto done; - - glamor_fallback("to %p (%c)\n", - drawable, glamor_get_drawable_location(drawable)); - - sub_pixmap = glamor_get_sub_pixmap(pixmap, x + x_off + drawable->x, - y + y_off + drawable->y, w, h, - GLAMOR_ACCESS_RW); - if (sub_pixmap) { - if (clip != NULL) - pixman_region_translate(clip, -x - drawable->x, -y - drawable->y); - - fbPutImage(&sub_pixmap->drawable, gc, depth, 0, 0, w, h, - left_pad, image_format, bits); - - glamor_put_sub_pixmap(sub_pixmap, pixmap, - x + x_off + drawable->x, - y + y_off + drawable->y, w, h, GLAMOR_ACCESS_RW); - if (clip != NULL) - pixman_region_translate(clip, x + drawable->x, y + drawable->y); - } - else - fbPutImage(drawable, gc, depth, x, y, w, h, - left_pad, image_format, bits); - ret = TRUE; - - done: - return ret; -} - -void -glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, - int w, int h, int left_pad, int image_format, char *bits) -{ - _glamor_put_image(drawable, gc, depth, x, y, w, h, - left_pad, image_format, bits, TRUE); -} - -Bool -glamor_put_image_nf(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, - int w, int h, int left_pad, int image_format, char *bits) -{ - return _glamor_put_image(drawable, gc, depth, x, y, w, h, - left_pad, image_format, bits, FALSE); -} diff --git a/xorg-server/glamor/glamor_rects.c b/xorg-server/glamor/glamor_rects.c index 7731edec4..3a5c3f3f9 100644 --- a/xorg-server/glamor/glamor_rects.c +++ b/xorg-server/glamor/glamor_rects.c @@ -57,7 +57,7 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable, if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) goto bail; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (glamor_priv->glsl_version >= 130) { prog = glamor_use_program_fill(pixmap, gc, @@ -144,11 +144,9 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable, glVertexAttribDivisor(GLAMOR_VERTEX_POS, 0); glDisableVertexAttribArray(GLAMOR_VERTEX_POS); - glamor_put_context(glamor_priv); return TRUE; bail_ctx: glDisable(GL_COLOR_LOGIC_OP); - glamor_put_context(glamor_priv); bail: return FALSE; } diff --git a/xorg-server/glamor/glamor_render.c b/xorg-server/glamor/glamor_render.c index cdf8effdc..5a7a23880 100644 --- a/xorg-server/glamor/glamor_render.c +++ b/xorg-server/glamor/glamor_render.c @@ -316,13 +316,13 @@ glamor_create_composite_shader(ScreenPtr screen, struct shader_key *key, GLint source_sampler_uniform_location, mask_sampler_uniform_location; glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); vs = glamor_create_composite_vs(key); if (vs == 0) - goto out; + return; fs = glamor_create_composite_fs(key); if (fs == 0) - goto out; + return; prog = glCreateProgram(); glAttachShader(prog, vs); @@ -363,9 +363,6 @@ glamor_create_composite_shader(ScreenPtr screen, struct shader_key *key, glGetUniformLocation(prog, "mask_repeat_mode"); } } - - out: - glamor_put_context(glamor_priv); } static glamor_composite_shader * @@ -406,7 +403,7 @@ glamor_init_composite_shaders(ScreenPtr screen) int eb_size; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glGenBuffers(1, &glamor_priv->ebo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo); @@ -416,8 +413,6 @@ glamor_init_composite_shaders(ScreenPtr screen) glamor_init_eb(eb, GLAMOR_COMPOSITE_VBO_VERT_CNT); glBufferData(GL_ELEMENT_ARRAY_BUFFER, eb_size, eb, GL_STATIC_DRAW); free(eb); - - glamor_put_context(glamor_priv); } void @@ -428,7 +423,7 @@ glamor_fini_composite_shaders(ScreenPtr screen) int i, j, k; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glDeleteBuffers(1, &glamor_priv->ebo); @@ -439,8 +434,6 @@ glamor_fini_composite_shaders(ScreenPtr screen) if (shader->prog) glDeleteProgram(shader->prog); } - - glamor_put_context(glamor_priv); } static Bool @@ -496,7 +489,7 @@ glamor_set_composite_texture(glamor_screen_private *glamor_priv, int unit, float wh[4]; int repeat_type; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glActiveTexture(GL_TEXTURE0 + unit); glBindTexture(GL_TEXTURE_2D, pixmap_priv->base.fbo->tex); repeat_type = picture->repeatType; @@ -564,7 +557,6 @@ glamor_set_composite_texture(glamor_screen_private *glamor_priv, int unit, repeat_type -= RepeatFix; } glUniform1i(repeat_location, repeat_type); - glamor_put_context(glamor_priv); } static void @@ -685,7 +677,7 @@ glamor_setup_composite_vbo(ScreenPtr screen, int n_verts) vert_size = n_verts * glamor_priv->vb_stride; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); vb = glamor_get_vbo_space(screen, vert_size, &vbo_offset); glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, GL_FALSE, @@ -707,7 +699,6 @@ glamor_setup_composite_vbo(ScreenPtr screen, int n_verts) 4 : 2) * sizeof(float)); glEnableVertexAttribArray(GLAMOR_VERTEX_MASK); } - glamor_put_context(glamor_priv); return vb; } @@ -717,7 +708,7 @@ glamor_flush_composite_rects(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (!glamor_priv->render_nr_verts) return; @@ -730,7 +721,6 @@ glamor_flush_composite_rects(ScreenPtr screen) glDrawElements(GL_TRIANGLES, (glamor_priv->render_nr_verts * 3) / 2, GL_UNSIGNED_SHORT, NULL); } - glamor_put_context(glamor_priv); } int pict_format_combine_tab[][3] = { @@ -880,7 +870,10 @@ glamor_composite_choose_shader(CARD8 op, goto fail; } else { - key.source = SHADER_SOURCE_TEXTURE_ALPHA; + if (PICT_FORMAT_A(source->format)) + key.source = SHADER_SOURCE_TEXTURE_ALPHA; + else + key.source = SHADER_SOURCE_TEXTURE; } if (mask) { @@ -1038,6 +1031,16 @@ glamor_composite_choose_shader(CARD8 op, } #endif + /* If the source and mask are two differently-formatted views of + * the same pixmap bits, and the pixmap was already uploaded (so + * the dynamic code above doesn't apply), then fall back to + * software. We should use texture views to fix this properly. + */ + if (source_pixmap && source_pixmap == mask_pixmap && + source->format != mask->format) { + goto fail; + } + /*Before enter the rendering stage, we need to fixup * transformed source and mask, if the transform is not int translate. */ if (key.source != SHADER_SOURCE_SOLID @@ -1102,7 +1105,7 @@ glamor_composite_set_shader_blend(glamor_pixmap_private *dest_priv, glamor_priv = dest_priv->base.glamor_priv; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glUseProgram(shader->prog); if (key->source == SHADER_SOURCE_SOLID) { @@ -1136,8 +1139,6 @@ glamor_composite_set_shader_blend(glamor_pixmap_private *dest_priv, glEnable(GL_BLEND); glBlendFunc(op_info->source_blend, op_info->dest_blend); } - - glamor_put_context(glamor_priv); } static Bool @@ -1192,7 +1193,7 @@ glamor_composite_with_shader(CARD8 op, glamor_set_destination_pixmap_priv_nc(dest_pixmap_priv); glamor_composite_set_shader_blend(dest_pixmap_priv, &key, shader, &op_info); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glamor_priv->has_source_coords = key.source != SHADER_SOURCE_SOLID; glamor_priv->has_mask_coords = (key.mask != SHADER_MASK_NONE && @@ -1318,7 +1319,6 @@ glamor_composite_with_shader(CARD8 op, glamor_priv->render_idle_cnt = 0; if (saved_source_format) source->format = saved_source_format; - glamor_put_context(glamor_priv); ret = TRUE; return ret; @@ -1450,8 +1450,8 @@ glamor_composite_clipped_region(CARD8 op, || source_pixmap->drawable.height != height)))) { temp_src = glamor_convert_gradient_picture(screen, source, - extent->x1 + x_source - x_dest, - extent->y1 + y_source - y_dest, + x_source, + y_source, width, height); if (!temp_src) { temp_src = source; @@ -1459,8 +1459,8 @@ glamor_composite_clipped_region(CARD8 op, } temp_src_priv = glamor_get_pixmap_private((PixmapPtr) (temp_src->pDrawable)); - x_temp_src = -extent->x1 + x_dest; - y_temp_src = -extent->y1 + y_dest; + x_temp_src = 0; + y_temp_src = 0; } if (mask @@ -1474,8 +1474,8 @@ glamor_composite_clipped_region(CARD8 op, * to do reduce one convertion. */ temp_mask = glamor_convert_gradient_picture(screen, mask, - extent->x1 + x_mask - x_dest, - extent->y1 + y_mask - y_dest, + x_mask, + y_mask, width, height); if (!temp_mask) { temp_mask = mask; @@ -1483,8 +1483,8 @@ glamor_composite_clipped_region(CARD8 op, } temp_mask_priv = glamor_get_pixmap_private((PixmapPtr) (temp_mask->pDrawable)); - x_temp_mask = -extent->x1 + x_dest; - y_temp_mask = -extent->y1 + y_dest; + x_temp_mask = 0; + y_temp_mask = 0; } /* Do two-pass PictOpOver componentAlpha, until we enable * dual source color blending. diff --git a/xorg-server/glamor/glamor_spans.c b/xorg-server/glamor/glamor_spans.c index 98842cdde..46ba6c38f 100644 --- a/xorg-server/glamor/glamor_spans.c +++ b/xorg-server/glamor/glamor_spans.c @@ -61,7 +61,7 @@ glamor_fill_spans_gl(DrawablePtr drawable, if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) goto bail; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (glamor_priv->glsl_version >= 130) { prog = glamor_use_program_fill(pixmap, gc, &glamor_priv->fill_spans_program, @@ -152,11 +152,9 @@ glamor_fill_spans_gl(DrawablePtr drawable, glVertexAttribDivisor(GLAMOR_VERTEX_POS, 0); glDisableVertexAttribArray(GLAMOR_VERTEX_POS); - glamor_put_context(glamor_priv); return TRUE; bail_ctx: glDisable(GL_COLOR_LOGIC_OP); - glamor_put_context(glamor_priv); bail: return FALSE; } @@ -222,7 +220,7 @@ glamor_get_spans_gl(DrawablePtr drawable, int wmax, glamor_format_for_pixmap(pixmap, &format, &type); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glamor_pixmap_loop(pixmap_priv, box_x, box_y) { BoxPtr box = glamor_pixmap_box_at(pixmap_priv, box_x, box_y); @@ -261,7 +259,6 @@ glamor_get_spans_gl(DrawablePtr drawable, int wmax, } } - glamor_put_context(glamor_priv); return TRUE; bail: return FALSE; @@ -327,7 +324,7 @@ glamor_set_spans_gl(DrawablePtr drawable, GCPtr gc, char *src, glamor_get_drawable_deltas(drawable, pixmap, &off_x, &off_y); glamor_format_for_pixmap(pixmap, &format, &type); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -397,7 +394,6 @@ glamor_set_spans_gl(DrawablePtr drawable, GCPtr gc, char *src, } } - glamor_put_context(glamor_priv); return TRUE; bail: diff --git a/xorg-server/glamor/glamor_text.c b/xorg-server/glamor/glamor_text.c index 0e4b74c56..395116d5b 100644 --- a/xorg-server/glamor/glamor_text.c +++ b/xorg-server/glamor/glamor_text.c @@ -267,7 +267,7 @@ glamor_poly_text(DrawablePtr drawable, GCPtr gc, if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) goto bail; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); prog = glamor_use_program_fill(pixmap, gc, &glamor_priv->poly_text_progs, &glamor_facet_poly_text); @@ -279,8 +279,6 @@ glamor_poly_text(DrawablePtr drawable, GCPtr gc, glDisable(GL_COLOR_LOGIC_OP); - glamor_put_context(glamor_priv); - glamor_priv->state = RENDER_STATE; glamor_priv->render_idle_cnt = 0; @@ -289,7 +287,6 @@ glamor_poly_text(DrawablePtr drawable, GCPtr gc, bail_ctx: glDisable(GL_COLOR_LOGIC_OP); - glamor_put_context(glamor_priv); bail: return FALSE; } @@ -420,7 +417,7 @@ glamor_image_text(DrawablePtr drawable, GCPtr gc, glamor_get_glyphs(gc->font, glamor_font, count, chars, sixteen, charinfo); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (TERMINALFONT(gc->font)) prog = &glamor_priv->te_text_prog; @@ -482,8 +479,6 @@ glamor_image_text(DrawablePtr drawable, GCPtr gc, (void) glamor_text(drawable, gc, glamor_font, prog, x, y, count, chars, charinfo, sixteen); - glamor_put_context(glamor_priv); - glamor_priv->state = RENDER_STATE; glamor_priv->render_idle_cnt = 0; @@ -491,7 +486,6 @@ glamor_image_text(DrawablePtr drawable, GCPtr gc, bail: glDisable(GL_COLOR_LOGIC_OP); - glamor_put_context(glamor_priv); return FALSE; } diff --git a/xorg-server/glamor/glamor_tile.c b/xorg-server/glamor/glamor_tile.c index 9e115cad1..4e479763e 100644 --- a/xorg-server/glamor/glamor_tile.c +++ b/xorg-server/glamor/glamor_tile.c @@ -62,7 +62,7 @@ glamor_init_tile_shader(ScreenPtr screen) GLint sampler_uniform_location; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glamor_priv->tile_prog = glCreateProgram(); vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, tile_vs); fs_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, tile_fs); @@ -82,7 +82,6 @@ glamor_init_tile_shader(ScreenPtr screen) glamor_priv->tile_wh = glGetUniformLocation(glamor_priv->tile_prog, "wh"); - glamor_put_context(glamor_priv); } void @@ -91,9 +90,8 @@ glamor_fini_tile_shader(ScreenPtr screen) glamor_screen_private *glamor_priv; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glDeleteProgram(glamor_priv->tile_prog); - glamor_put_context(glamor_priv); } static void @@ -123,7 +121,7 @@ _glamor_tile(PixmapPtr pixmap, PixmapPtr tile, glamor_set_destination_pixmap_priv_nc(dst_pixmap_priv); pixmap_priv_get_dest_scale(dst_pixmap_priv, &dst_xscale, &dst_yscale); pixmap_priv_get_scale(src_pixmap_priv, &src_xscale, &src_yscale); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glUseProgram(glamor_priv->tile_prog); glamor_pixmap_fbo_fix_wh_ratio(wh, src_pixmap_priv); @@ -155,7 +153,6 @@ _glamor_tile(PixmapPtr pixmap, PixmapPtr tile, glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); glDisableVertexAttribArray(GLAMOR_VERTEX_POS); - glamor_put_context(glamor_priv); glamor_priv->state = RENDER_STATE; glamor_priv->render_idle_cnt = 0; @@ -193,10 +190,9 @@ glamor_tile(PixmapPtr pixmap, PixmapPtr tile, goto fail; } - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (!glamor_set_alu(screen, alu)) { glamor_fallback("unsupported alu %x\n", alu); - glamor_put_context(glamor_priv); goto fail; } @@ -290,7 +286,6 @@ glamor_tile(PixmapPtr pixmap, PixmapPtr tile, _glamor_tile(pixmap, tile, x, y, width, height, tile_x, tile_y); glamor_set_alu(screen, GXcopy); - glamor_put_context(glamor_priv); return TRUE; fail: return FALSE; diff --git a/xorg-server/glamor/glamor_transfer.c b/xorg-server/glamor/glamor_transfer.c index 0378bb076..ad875c962 100644 --- a/xorg-server/glamor/glamor_transfer.c +++ b/xorg-server/glamor/glamor_transfer.c @@ -70,7 +70,7 @@ glamor_upload_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox, glamor_format_for_pixmap(pixmap, &format, &type); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -127,7 +127,6 @@ glamor_upload_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox, glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); - glamor_put_context(glamor_priv); } /* @@ -180,7 +179,7 @@ glamor_download_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox, glamor_format_for_pixmap(pixmap, &format, &type); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glPixelStorei(GL_PACK_ALIGNMENT, 4); glPixelStorei(GL_PACK_ROW_LENGTH, byte_stride / bytes_per_pixel); @@ -226,7 +225,6 @@ glamor_download_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox, glPixelStorei(GL_PACK_ROW_LENGTH, 0); glPixelStorei(GL_PACK_SKIP_ROWS, 0); glPixelStorei(GL_PACK_SKIP_PIXELS, 0); - glamor_put_context(glamor_priv); } /* diff --git a/xorg-server/glamor/glamor_trapezoid.c b/xorg-server/glamor/glamor_trapezoid.c index c76b8bb2a..4aba469af 100644 --- a/xorg-server/glamor/glamor_trapezoid.c +++ b/xorg-server/glamor/glamor_trapezoid.c @@ -235,14 +235,13 @@ glamor_flush_composite_triangles(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glamor_put_vbo_space(screen); if (!glamor_priv->render_nr_verts) return; glDrawArrays(GL_TRIANGLES, 0, glamor_priv->render_nr_verts); - glamor_put_context(glamor_priv); } static Bool @@ -627,7 +626,7 @@ glamor_setup_composite_vbo_for_trapezoid(ScreenPtr screen, int n_verts) vert_size = n_verts * glamor_priv->vb_stride; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glDisableVertexAttribArray(GLAMOR_VERTEX_POS); glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); @@ -667,8 +666,6 @@ glamor_setup_composite_vbo_for_trapezoid(ScreenPtr screen, int n_verts) vbo_offset + stride * sizeof(float)); glEnableVertexAttribArray(GLAMOR_VERTEX_RIGHT_PARAM); - glamor_put_context(glamor_priv); - return vb; } @@ -811,7 +808,7 @@ _glamor_trapezoids_with_shader(CARD8 op, goto TRAPEZOID_OUT; } - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); box = REGION_RECTS(®ion); nbox = REGION_NUM_RECTS(®ion); @@ -979,7 +976,6 @@ _glamor_trapezoids_with_shader(CARD8 op, glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); glDisableVertexAttribArray(GLAMOR_VERTEX_MASK); glDisable(GL_BLEND); - glamor_put_context(glamor_priv); TRAPEZOID_OUT: if (box) { @@ -1332,7 +1328,7 @@ glamor_init_trapezoid_shader(ScreenPtr screen) "}\n"; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glamor_priv->trapezoid_prog = glCreateProgram(); @@ -1354,8 +1350,6 @@ glamor_init_trapezoid_shader(ScreenPtr screen) GLAMOR_VERTEX_RIGHT_PARAM, "v_right_param"); glamor_link_glsl_prog(screen, glamor_priv->trapezoid_prog, "trapezoid"); - - glamor_put_context(glamor_priv); } void @@ -1364,9 +1358,8 @@ glamor_fini_trapezoid_shader(ScreenPtr screen) glamor_screen_private *glamor_priv; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glDeleteProgram(glamor_priv->trapezoid_prog); - glamor_put_context(glamor_priv); } static Bool @@ -1406,7 +1399,7 @@ _glamor_generate_trapezoid_with_shader(ScreenPtr screen, PicturePtr picture, return FALSE; } - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glamor_set_destination_pixmap_priv_nc(pixmap_priv); @@ -1564,7 +1557,6 @@ _glamor_generate_trapezoid_with_shader(ScreenPtr screen, PicturePtr picture, glDisableVertexAttribArray(GLAMOR_VERTEX_TOP_BOTTOM); glDisableVertexAttribArray(GLAMOR_VERTEX_LEFT_PARAM); glDisableVertexAttribArray(GLAMOR_VERTEX_RIGHT_PARAM); - glamor_put_context(glamor_priv); return TRUE; } diff --git a/xorg-server/glamor/glamor_utils.h b/xorg-server/glamor/glamor_utils.h index 53b7d9bec..4c1581ef5 100644 --- a/xorg-server/glamor/glamor_utils.h +++ b/xorg-server/glamor/glamor_utils.h @@ -1499,15 +1499,12 @@ __fls(unsigned long x) #endif static inline void -glamor_get_context(glamor_screen_private * glamor_priv) +glamor_make_current(glamor_screen_private *glamor_priv) { - glamor_priv->ctx.get_context(&glamor_priv->ctx); -} - -static inline void -glamor_put_context(glamor_screen_private * glamor_priv) -{ - glamor_priv->ctx.put_context(&glamor_priv->ctx); + if (lastGLContext != &glamor_priv->ctx) { + lastGLContext = &glamor_priv->ctx; + glamor_priv->ctx.make_current(&glamor_priv->ctx); + } } #endif diff --git a/xorg-server/glamor/glamor_vbo.c b/xorg-server/glamor/glamor_vbo.c index 2731692d6..c6785594b 100644 --- a/xorg-server/glamor/glamor_vbo.c +++ b/xorg-server/glamor/glamor_vbo.c @@ -48,7 +48,7 @@ glamor_get_vbo_space(ScreenPtr screen, unsigned size, char **vbo_offset) glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); void *data; - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo); @@ -79,7 +79,6 @@ glamor_get_vbo_space(ScreenPtr screen, unsigned size, char **vbo_offset) */ glamor_priv->has_buffer_storage = false; glamor_priv->vbo_size = 0; - glamor_put_context(glamor_priv); return glamor_get_vbo_space(screen, size, vbo_offset); } @@ -130,8 +129,6 @@ glamor_get_vbo_space(ScreenPtr screen, unsigned size, char **vbo_offset) data = glamor_priv->vb; } - glamor_put_context(glamor_priv); - return data; } @@ -140,7 +137,7 @@ glamor_put_vbo_space(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); if (glamor_priv->has_buffer_storage) { /* If we're in the ARB_buffer_storage path, we have a @@ -155,8 +152,6 @@ glamor_put_vbo_space(ScreenPtr screen) } glBindBuffer(GL_ARRAY_BUFFER, 0); - - glamor_put_context(glamor_priv); } void @@ -164,11 +159,9 @@ glamor_init_vbo(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glGenBuffers(1, &glamor_priv->vbo); - - glamor_put_context(glamor_priv); } void @@ -176,11 +169,9 @@ glamor_fini_vbo(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glDeleteBuffers(1, &glamor_priv->vbo); if (!glamor_priv->has_map_buffer_range) free(glamor_priv->vb); - - glamor_put_context(glamor_priv); } diff --git a/xorg-server/glamor/glamor_xv.c b/xorg-server/glamor/glamor_xv.c index 4e60fa3a4..369b02b61 100644 --- a/xorg-server/glamor/glamor_xv.c +++ b/xorg-server/glamor/glamor_xv.c @@ -97,7 +97,7 @@ glamor_init_xv_shader(ScreenPtr screen) GLint fs_prog, vs_prog; glamor_priv = glamor_get_screen_private(screen); - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glamor_priv->xv_prog = glCreateProgram(); vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, xv_vs); @@ -110,8 +110,6 @@ glamor_init_xv_shader(ScreenPtr screen) glBindAttribLocation(glamor_priv->xv_prog, GLAMOR_VERTEX_SOURCE, "v_texcoord0"); glamor_link_glsl_prog(screen, glamor_priv->xv_prog, "xv"); - - glamor_put_context(glamor_priv); } #define ClipValue(v,min,max) ((v) < (min) ? (min) : (v) > (max) ? (max) : (v)) @@ -316,7 +314,7 @@ glamor_display_textured_video(glamor_port_private *port_priv) &src_yscale[i]); } } - glamor_get_context(glamor_priv); + glamor_make_current(glamor_priv); glUseProgram(glamor_priv->xv_prog); uloc = glGetUniformLocation(glamor_priv->xv_prog, "offsetyco"); @@ -404,7 +402,6 @@ glamor_display_textured_video(glamor_port_private *port_priv) glDisableVertexAttribArray(GLAMOR_VERTEX_POS); glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); - glamor_put_context(glamor_priv); DamageDamageRegion(port_priv->pDraw, &port_priv->clip); } diff --git a/xorg-server/glx/glxcmds.c b/xorg-server/glx/glxcmds.c index 187e42665..2fc3f4cc8 100644 --- a/xorg-server/glx/glxcmds.c +++ b/xorg-server/glx/glxcmds.c @@ -188,7 +188,7 @@ validGlxDrawable(ClientPtr client, XID id, int type, int access_mode, void __glXContextDestroy(__GLXcontext * context) { - __glXFlushContextCache(); + lastGLContext = NULL; } static void @@ -275,6 +275,17 @@ DoCreateContext(__GLXclientState * cl, GLXContextID gcId, ** Allocate memory for the new context */ if (!isDirect) { + /* Only allow creating indirect GLX contexts if allowed by + * server command line. Indirect GLX is of limited use (since + * it's only GL 1.4), it's slower than direct contexts, and + * it's a massive attack surface for buffer overflow type + * errors. + */ + if (!enableIndirectGLX) { + client->errorValue = isDirect; + return BadValue; + } + /* Without any attributes, the only error that the driver should be * able to generate is BadAlloc. As result, just drop the error * returned from the driver on the floor. @@ -434,10 +445,6 @@ static void StopUsingContext(__GLXcontext * glxc) { if (glxc) { - if (glxc == __glXLastContext) { - /* Tell server GL library */ - __glXLastContext = 0; - } glxc->currentClient = NULL; if (!glxc->idExists) { FreeResourceByType(glxc->id, __glXContextRes, FALSE); @@ -448,7 +455,6 @@ StopUsingContext(__GLXcontext * glxc) static void StartUsingContext(__GLXclientState * cl, __GLXcontext * glxc) { - __glXLastContext = glxc; glxc->currentClient = cl->client; } @@ -627,7 +633,7 @@ DoMakeCurrent(__GLXclientState * cl, if (!(*prevglxc->loseCurrent) (prevglxc)) { return __glXError(GLXBadContext); } - __glXFlushContextCache(); + lastGLContext = NULL; if (!prevglxc->isDirect) { prevglxc->drawPriv = NULL; prevglxc->readPriv = NULL; @@ -640,7 +646,9 @@ DoMakeCurrent(__GLXclientState * cl, glxc->readPriv = readPriv; /* make the context current */ + lastGLContext = glxc; if (!(*glxc->makeCurrent) (glxc)) { + lastGLContext = NULL; glxc->drawPriv = NULL; glxc->readPriv = NULL; return __glXError(GLXBadContext); diff --git a/xorg-server/glx/glxdri2.c b/xorg-server/glx/glxdri2.c index 5d1a45bff..c756bf570 100644 --- a/xorg-server/glx/glxdri2.c +++ b/xorg-server/glx/glxdri2.c @@ -115,55 +115,54 @@ __glXDRIdrawableDestroy(__GLXdrawable * drawable) } static void -__glXDRIdrawableCopySubBuffer(__GLXdrawable * drawable, - int x, int y, int w, int h) +copy_box(__GLXdrawable * drawable, + int dst, int src, + int x, int y, int w, int h) { - __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable; BoxRec box; RegionRec region; + __GLXcontext *cx = lastGLContext; box.x1 = x; - box.y1 = private->height - y - h; + box.y1 = y; box.x2 = x + w; - box.y2 = private->height - y; + box.y2 = y + h; RegionInit(®ion, &box, 0); - DRI2CopyRegion(drawable->pDraw, ®ion, - DRI2BufferFrontLeft, DRI2BufferBackLeft); + DRI2CopyRegion(drawable->pDraw, ®ion, dst, src); + if (cx != lastGLContext) { + lastGLContext = cx; + cx->makeCurrent(cx); + } } static void -__glXDRIdrawableWaitX(__GLXdrawable * drawable) +__glXDRIdrawableCopySubBuffer(__GLXdrawable * drawable, + int x, int y, int w, int h) { __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable; - BoxRec box; - RegionRec region; - box.x1 = 0; - box.y1 = 0; - box.x2 = private->width; - box.y2 = private->height; - RegionInit(®ion, &box, 0); + copy_box(drawable, x, private->height - y - h, + w, h, + DRI2BufferFrontLeft, DRI2BufferBackLeft); +} + +static void +__glXDRIdrawableWaitX(__GLXdrawable * drawable) +{ + __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable; - DRI2CopyRegion(drawable->pDraw, ®ion, - DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); + copy_box(drawable, DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft, + 0, 0, private->width, private->height); } static void __glXDRIdrawableWaitGL(__GLXdrawable * drawable) { __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable; - BoxRec box; - RegionRec region; - - box.x1 = 0; - box.y1 = 0; - box.x2 = private->width; - box.y2 = private->height; - RegionInit(®ion, &box, 0); - DRI2CopyRegion(drawable->pDraw, ®ion, - DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); + copy_box(drawable, DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft, + 0, 0, private->width, private->height); } static void @@ -204,26 +203,37 @@ __glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable * drawable) __GLXDRIdrawable *priv = (__GLXDRIdrawable *) drawable; __GLXDRIscreen *screen = priv->screen; CARD64 unused; + __GLXcontext *cx = lastGLContext; + int status; if (screen->flush) { (*screen->flush->flush) (priv->driDrawable); (*screen->flush->invalidate) (priv->driDrawable); } - if (DRI2SwapBuffers(client, drawable->pDraw, 0, 0, 0, &unused, - __glXdriSwapEvent, drawable) != Success) - return FALSE; + status = DRI2SwapBuffers(client, drawable->pDraw, 0, 0, 0, &unused, + __glXdriSwapEvent, drawable); + if (cx != lastGLContext) { + lastGLContext = cx; + cx->makeCurrent(cx); + } - return TRUE; + return status == Success; } static int __glXDRIdrawableSwapInterval(__GLXdrawable * drawable, int interval) { + __GLXcontext *cx = lastGLContext; + if (interval <= 0) /* || interval > BIGNUM? */ return GLX_BAD_VALUE; DRI2SwapInterval(drawable->pDraw, interval); + if (cx != lastGLContext) { + lastGLContext = cx; + cx->makeCurrent(cx); + } return 0; } @@ -276,7 +286,16 @@ static Bool __glXDRIcontextWait(__GLXcontext * baseContext, __GLXclientState * cl, int *error) { - if (DRI2WaitSwap(cl->client, baseContext->drawPriv->pDraw)) { + __GLXcontext *cx = lastGLContext; + Bool ret; + + ret = DRI2WaitSwap(cl->client, baseContext->drawPriv->pDraw); + if (cx != lastGLContext) { + lastGLContext = cx; + cx->makeCurrent(cx); + } + + if (ret) { *error = cl->client->noClientException; return TRUE; } @@ -600,6 +619,8 @@ __glXDRIscreenCreateDrawable(ClientPtr client, __GLXDRIscreen *driScreen = (__GLXDRIscreen *) screen; __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig; __GLXDRIdrawable *private; + __GLXcontext *cx = lastGLContext; + Bool ret; private = calloc(1, sizeof *private); if (private == NULL) @@ -618,9 +639,15 @@ __glXDRIscreenCreateDrawable(ClientPtr client, private->base.waitGL = __glXDRIdrawableWaitGL; private->base.waitX = __glXDRIdrawableWaitX; - if (DRI2CreateDrawable2(client, pDraw, drawId, - __glXDRIinvalidateBuffers, private, - &private->dri2_id)) { + ret = DRI2CreateDrawable2(client, pDraw, drawId, + __glXDRIinvalidateBuffers, private, + &private->dri2_id); + if (cx != lastGLContext) { + lastGLContext = cx; + cx->makeCurrent(cx); + } + + if (ret) { free(private); return NULL; } @@ -642,9 +669,22 @@ dri2GetBuffers(__DRIdrawable * driDrawable, DRI2BufferPtr *buffers; int i; int j; + __GLXcontext *cx = lastGLContext; buffers = DRI2GetBuffers(private->base.pDraw, width, height, attachments, count, out_count); + if (cx != lastGLContext) { + lastGLContext = cx; + cx->makeCurrent(cx); + + /* If DRI2GetBuffers() changed the GL context, it may also have + * invalidated the DRI2 buffers, so let's get them again + */ + buffers = DRI2GetBuffers(private->base.pDraw, + width, height, attachments, count, out_count); + assert(lastGLContext == cx); + } + if (*out_count > MAX_DRAWABLE_BUFFERS) { *out_count = 0; return NULL; @@ -686,10 +726,24 @@ dri2GetBuffersWithFormat(__DRIdrawable * driDrawable, DRI2BufferPtr *buffers; int i; int j = 0; + __GLXcontext *cx = lastGLContext; buffers = DRI2GetBuffersWithFormat(private->base.pDraw, width, height, attachments, count, out_count); + if (cx != lastGLContext) { + lastGLContext = cx; + cx->makeCurrent(cx); + + /* If DRI2GetBuffersWithFormat() changed the GL context, it may also have + * invalidated the DRI2 buffers, so let's get them again + */ + buffers = DRI2GetBuffersWithFormat(private->base.pDraw, + width, height, attachments, count, + out_count); + assert(lastGLContext == cx); + } + if (*out_count > MAX_DRAWABLE_BUFFERS) { *out_count = 0; return NULL; diff --git a/xorg-server/glx/glxdriswrast.c b/xorg-server/glx/glxdriswrast.c index 6fa328831..c30ce9aed 100644 --- a/xorg-server/glx/glxdriswrast.c +++ b/xorg-server/glx/glxdriswrast.c @@ -337,6 +337,7 @@ swrastPutImage(__DRIdrawable * draw, int op, __GLXDRIdrawable *drawable = loaderPrivate; DrawablePtr pDraw = drawable->base.pDraw; GCPtr gc; + __GLXcontext *cx = lastGLContext; switch (op) { case __DRI_SWRAST_IMAGE_OP_DRAW: @@ -352,6 +353,10 @@ swrastPutImage(__DRIdrawable * draw, int op, ValidateGC(pDraw, gc); gc->ops->PutImage(pDraw, gc, pDraw->depth, x, y, w, h, 0, ZPixmap, data); + if (cx != lastGLContext) { + lastGLContext = cx; + cx->makeCurrent(cx); + } } static void @@ -361,8 +366,13 @@ swrastGetImage(__DRIdrawable * draw, __GLXDRIdrawable *drawable = loaderPrivate; DrawablePtr pDraw = drawable->base.pDraw; ScreenPtr pScreen = pDraw->pScreen; + __GLXcontext *cx = lastGLContext; pScreen->GetImage(pDraw, x, y, w, h, ZPixmap, ~0L, data); + if (cx != lastGLContext) { + lastGLContext = cx; + cx->makeCurrent(cx); + } } static const __DRIswrastLoaderExtension swrastLoaderExtension = { diff --git a/xorg-server/glx/glxext.c b/xorg-server/glx/glxext.c index c9b8cc5b3..c0142fe2e 100644 --- a/xorg-server/glx/glxext.c +++ b/xorg-server/glx/glxext.c @@ -48,12 +48,6 @@ #include "indirect_util.h" /* -** The last context used by the server. It is the context that is current -** from the server's perspective. -*/ -__GLXcontext *__glXLastContext; - -/* ** X resources. */ RESTYPE __glXContextRes; @@ -79,7 +73,7 @@ static int __glXDispatch(ClientPtr); static void ResetExtension(ExtensionEntry * extEntry) { - __glXFlushContextCache(); + lastGLContext = NULL; } /* @@ -141,8 +135,7 @@ DrawableGone(__GLXdrawable * glxPriv, XID xid) (c->drawPriv == glxPriv || c->readPriv == glxPriv)) { /* just force a re-bind the next time through */ (*c->loseCurrent) (c); - if (c == __glXLastContext) - __glXFlushContextCache(); + lastGLContext = NULL; } if (c->drawPriv == glxPriv) c->drawPriv = NULL; @@ -203,8 +196,8 @@ __glXFreeContext(__GLXcontext * cx) free(cx->feedbackBuf); free(cx->selectBuf); - if (cx == __glXLastContext) { - __glXFlushContextCache(); + if (cx == lastGLContext) { + lastGLContext = NULL; } /* We can get here through both regular dispatching from @@ -296,6 +289,7 @@ glxClientCallback(CallbackListPtr *list, void *closure, void *data) next = c->next; if (c->currentClient == pClient) { c->loseCurrent(c); + lastGLContext = NULL; c->currentClient = NULL; __glXFreeContext(c); } @@ -406,12 +400,6 @@ GlxExtensionInit(void) /************************************************************************/ -void -__glXFlushContextCache(void) -{ - __glXLastContext = 0; -} - /* ** Make a context the current one for the GL (in this implementation, there ** is only one instance of the GL, and we use it to serve all GL clients by @@ -449,21 +437,22 @@ __glXForceCurrent(__GLXclientState * cl, GLXContextTag tag, int *error) if (cx->wait && (*cx->wait) (cx, cl, error)) return NULL; - if (cx == __glXLastContext) { + if (cx == lastGLContext) { /* No need to re-bind */ return cx; } /* Make this context the current one for the GL. */ if (!cx->isDirect) { + lastGLContext = cx; if (!(*cx->makeCurrent) (cx)) { /* Bind failed, and set the error code. Bummer */ + lastGLContext = NULL; cl->client->errorValue = cx->id; *error = __glXError(GLXBadContextState); return 0; } } - __glXLastContext = cx; return cx; } diff --git a/xorg-server/glx/glxserver.h b/xorg-server/glx/glxserver.h index 3f2ae3593..a324b290f 100644 --- a/xorg-server/glx/glxserver.h +++ b/xorg-server/glx/glxserver.h @@ -84,7 +84,6 @@ void __glXScreenInitVisuals(__GLXscreen * screen); /* ** The last context used (from the server's persective) is cached. */ -extern __GLXcontext *__glXLastContext; extern __GLXcontext *__glXForceCurrent(__GLXclientState *, GLXContextTag, int *); diff --git a/xorg-server/hw/dmx/config/xdmxconfig.c b/xorg-server/hw/dmx/config/xdmxconfig.c index 2b7b9683b..0540d0173 100644 --- a/xorg-server/hw/dmx/config/xdmxconfig.c +++ b/xorg-server/hw/dmx/config/xdmxconfig.c @@ -303,7 +303,6 @@ dmxConfigCanvasUpdate(void) fs = XQueryFont(dpy, gcontext); for (pt = dmxConfigCurrent->subentry; pt; pt = pt->next) { int x, y, len; - int xo = 3, yo = fs->ascent + fs->descent + 2; GC gc; if (pt->type != dmxConfigDisplay) @@ -321,6 +320,8 @@ dmxConfigCanvasUpdate(void) y = dmxConfigWidgetHeight - 1; XDrawRectangle(dpy, win, gc, x, y, w, h); if (fs && len) { + int xo = 3, yo = fs->ascent + fs->descent + 2; + while (len && XTextWidth(fs, pt->display->name, len) >= w - 2 * xo) --len; if (len) diff --git a/xorg-server/hw/kdrive/linux/linux.c b/xorg-server/hw/kdrive/linux/linux.c index 6284de576..73a8169bf 100644 --- a/xorg-server/hw/kdrive/linux/linux.c +++ b/xorg-server/hw/kdrive/linux/linux.c @@ -68,13 +68,16 @@ LinuxCheckChown(const char *file) struct stat st; __uid_t u; __gid_t g; + int r; if (stat(file, &st) < 0) return; u = getuid(); g = getgid(); - if (st.st_uid != u || st.st_gid != g) - chown(file, u, g); + if (st.st_uid != u || st.st_gid != g) { + r = chown(file, u, g); + (void) r; + } } static int diff --git a/xorg-server/hw/kdrive/src/kdrive.c b/xorg-server/hw/kdrive/src/kdrive.c index 8eb8cd02e..9814fc66a 100644 --- a/xorg-server/hw/kdrive/src/kdrive.c +++ b/xorg-server/hw/kdrive/src/kdrive.c @@ -118,10 +118,17 @@ KdDoSwitchCmd(const char *reason) { if (kdSwitchCmd) { char *command; + int ret; if (asprintf(&command, "%s %s", kdSwitchCmd, reason) == -1) return; - system(command); + + /* Ignore the return value from system; I'm not sure + * there's anything more useful to be done when + * it fails + */ + ret = system(command); + (void) ret; free(command); } } diff --git a/xorg-server/hw/xfree86/.gitignore b/xorg-server/hw/xfree86/.gitignore index fb6830b2c..c84c37ffb 100644 --- a/xorg-server/hw/xfree86/.gitignore +++ b/xorg-server/hw/xfree86/.gitignore @@ -1,4 +1,5 @@ Xorg +Xorg.wrap Xorg.sh xorg.conf.example sdksyms.c diff --git a/xorg-server/hw/xfree86/common/compiler.h b/xorg-server/hw/xfree86/common/compiler.h index 3a57186be..fb95f58bf 100644 --- a/xorg-server/hw/xfree86/common/compiler.h +++ b/xorg-server/hw/xfree86/common/compiler.h @@ -103,6 +103,7 @@ #if !defined(__sparc__) && !defined(__sparc) && !defined(__arm32__) && !defined(__nds32__) \ && !(defined(__alpha__) && defined(linux)) \ && !(defined(__ia64__) && defined(linux)) \ + && !(defined(__mips64) && defined(linux)) \ extern _X_EXPORT void outb(unsigned short, unsigned char); extern _X_EXPORT void outw(unsigned short, unsigned short); @@ -721,7 +722,7 @@ xf86WriteMmio32LeNB(__volatile__ void *base, const unsigned long offset, } #elif defined(__mips__) || (defined(__arm32__) && !defined(__linux__)) -#ifdef __arm32__ +#if defined(__arm32__) || defined(__mips64) #define PORT_SIZE long #else #define PORT_SIZE short diff --git a/xorg-server/hw/xfree86/dri/dri.c b/xorg-server/hw/xfree86/dri/dri.c index 60339995d..95828bbac 100644 --- a/xorg-server/hw/xfree86/dri/dri.c +++ b/xorg-server/hw/xfree86/dri/dri.c @@ -177,19 +177,15 @@ DRIOpenDRMMaster(ScrnInfoPtr pScrn, memset(&tmp, 0, sizeof(tmp)); /* Check the DRM lib version. - * drmGetLibVersion was not supported in version 1.0, so check for - * symbol first to avoid possible crash or hang. */ drmlibmajor = 1; drmlibminor = 0; - if (xf86LoaderCheckSymbol("drmGetLibVersion")) { - drmlibv = drmGetLibVersion(-1); - if (drmlibv != NULL) { - drmlibmajor = drmlibv->version_major; - drmlibminor = drmlibv->version_minor; - drmFreeVersion(drmlibv); - } + drmlibv = drmGetLibVersion(-1); + if (drmlibv != NULL) { + drmlibmajor = drmlibv->version_major; + drmlibminor = drmlibv->version_minor; + drmFreeVersion(drmlibv); } /* Check if the libdrm can handle falling back to loading based on name diff --git a/xorg-server/hw/xfree86/dri2/dri2.c b/xorg-server/hw/xfree86/dri2/dri2.c index 729a323da..76708cabc 100644 --- a/xorg-server/hw/xfree86/dri2/dri2.c +++ b/xorg-server/hw/xfree86/dri2/dri2.c @@ -1092,6 +1092,14 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc, return BadDrawable; } + /* According to spec, return expected swapbuffers count SBC after this swap + * will complete. This is ignored unless we return Success, but it must be + * initialized on every path where we return Success or the caller will send + * an uninitialized value off the stack to the client. So let's initialize + * it as early as possible, just to be sure. + */ + *swap_target = pPriv->swap_count + pPriv->swapsPending + 1; + for (i = 0; i < pPriv->bufferCount; i++) { if (pPriv->buffers[i]->attachment == DRI2BufferFrontLeft) pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i]; @@ -1149,17 +1157,13 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc, * we have to account for the current swap count, interval, and the * number of pending swaps. */ - *swap_target = pPriv->last_swap_target + pPriv->swap_interval; + target_msc = pPriv->last_swap_target + pPriv->swap_interval; } - else { - /* glXSwapBuffersMscOML could have a 0 target_msc, honor it */ - *swap_target = target_msc; - } pPriv->swapsPending++; ret = (*ds->ScheduleSwap) (client, pDraw, pDestBuffer, pSrcBuffer, - swap_target, divisor, remainder, func, data); + &target_msc, divisor, remainder, func, data); if (!ret) { pPriv->swapsPending--; /* didn't schedule */ xf86DrvMsg(pScreen->myNum, X_ERROR, @@ -1167,12 +1171,7 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc, return BadDrawable; } - pPriv->last_swap_target = *swap_target; - - /* According to spec, return expected swapbuffers count SBC after this swap - * will complete. - */ - *swap_target = pPriv->swap_count + pPriv->swapsPending; + pPriv->last_swap_target = target_msc; DRI2InvalidateDrawableAll(pDraw); diff --git a/xorg-server/hw/xfree86/man/Makefile.am b/xorg-server/hw/xfree86/man/Makefile.am index f41d26c4e..5da404cbb 100644 --- a/xorg-server/hw/xfree86/man/Makefile.am +++ b/xorg-server/hw/xfree86/man/Makefile.am @@ -5,4 +5,6 @@ fileman_PRE = xorg.conf.man xorg.conf.d.man if SUID_WRAPPER appman_PRE += Xorg.wrap.man fileman_PRE += Xwrapper.config.man +else +EXTRA_DIST += Xorg.wrap.man Xwrapper.config.man endif diff --git a/xorg-server/hw/xfree86/man/Xorg.wrap.man b/xorg-server/hw/xfree86/man/Xorg.wrap.man index f2153e35b..58937c74b 100644 --- a/xorg-server/hw/xfree86/man/Xorg.wrap.man +++ b/xorg-server/hw/xfree86/man/Xorg.wrap.man @@ -1,4 +1,4 @@ -.\" Xwrapper.wrap.1 +.\" Xwrapper.wrap.__appmansuffix__ .\" .\" Copyright 2014 Red Hat, Inc. .\" @@ -26,7 +26,7 @@ .\" .\" shorthand for double quote that works everywhere. .ds q \N'34' -.TH Xorg.wrap 1 __xorgversion__ +.TH Xorg.wrap __appmansuffix__ __xorgversion__ .SH NAME Xorg.wrap \- Xorg X server binary wrapper .SH DESCRIPTION diff --git a/xorg-server/hw/xfree86/man/Xwrapper.config.man b/xorg-server/hw/xfree86/man/Xwrapper.config.man index 800947c55..5c777c940 100644 --- a/xorg-server/hw/xfree86/man/Xwrapper.config.man +++ b/xorg-server/hw/xfree86/man/Xwrapper.config.man @@ -1 +1 @@ -.so man1/Xorg.wrap.1 +.so man__appmansuffix__/Xorg.wrap.__appmansuffix__ diff --git a/xorg-server/hw/xfree86/modes/xf86RandR12.c b/xorg-server/hw/xfree86/modes/xf86RandR12.c index 66139dcf0..8a04dfc2c 100644 --- a/xorg-server/hw/xfree86/modes/xf86RandR12.c +++ b/xorg-server/hw/xfree86/modes/xf86RandR12.c @@ -1256,12 +1256,13 @@ xf86RandR12CrtcSetGamma(ScreenPtr pScreen, RRCrtcPtr randr_crtc) CARD16 *tmp_ptr; tmp_ptr = - realloc(crtc->gamma_red, 3 * crtc->gamma_size * sizeof(CARD16)); + realloc(crtc->gamma_red, + 3 * randr_crtc->gammaSize * sizeof(CARD16)); if (!tmp_ptr) return FALSE; crtc->gamma_red = tmp_ptr; - crtc->gamma_green = crtc->gamma_red + crtc->gamma_size; - crtc->gamma_blue = crtc->gamma_green + crtc->gamma_size; + crtc->gamma_green = crtc->gamma_red + randr_crtc->gammaSize; + crtc->gamma_blue = crtc->gamma_green + randr_crtc->gammaSize; } crtc->gamma_size = randr_crtc->gammaSize; diff --git a/xorg-server/hw/xfree86/shadowfb/shadow.c b/xorg-server/hw/xfree86/shadowfb/shadow.c index 43529398a..10f72cc99 100644 --- a/xorg-server/hw/xfree86/shadowfb/shadow.c +++ b/xorg-server/hw/xfree86/shadowfb/shadow.c @@ -1,8 +1,8 @@ /* Copyright (C) 1999. The XFree86 Project Inc. + Copyright 2014 Red Hat, Inc. Written by Mark Vojkovich (mvojkovi@ucsd.edu) - Pre-fb-write callbacks and RENDER support - Nolan Leake (nolan@vmware.com) */ @@ -29,107 +29,23 @@ #include "picturestr.h" static Bool ShadowCloseScreen(ScreenPtr pScreen); -static void ShadowCopyWindow(WindowPtr pWin, - DDXPointRec ptOldOrg, RegionPtr prgn); -static Bool ShadowCreateGC(GCPtr pGC); - -static Bool ShadowEnterVT(ScrnInfoPtr pScrn); -static void ShadowLeaveVT(ScrnInfoPtr pScrn); - -static void ShadowComposite(CARD8 op, - PicturePtr pSrc, - PicturePtr pMask, - PicturePtr pDst, - INT16 xSrc, - INT16 ySrc, - INT16 xMask, - INT16 yMask, - INT16 xDst, - INT16 yDst, CARD16 width, CARD16 height); +static Bool ShadowCreateScreenResources(ScreenPtr pScreen); typedef struct { ScrnInfoPtr pScrn; RefreshAreaFuncPtr preRefresh; RefreshAreaFuncPtr postRefresh; CloseScreenProcPtr CloseScreen; - CopyWindowProcPtr CopyWindow; - CreateGCProcPtr CreateGC; - ModifyPixmapHeaderProcPtr ModifyPixmapHeader; - CompositeProcPtr Composite; - Bool (*EnterVT) (ScrnInfoPtr); - void (*LeaveVT) (ScrnInfoPtr); - Bool vtSema; + CreateScreenResourcesProcPtr CreateScreenResources; } ShadowScreenRec, *ShadowScreenPtr; -typedef struct { - const GCOps *ops; - const GCFuncs *funcs; -} ShadowGCRec, *ShadowGCPtr; - static DevPrivateKeyRec ShadowScreenKeyRec; -#define ShadowScreenKey (&ShadowScreenKeyRec) - -static DevPrivateKeyRec ShadowGCKeyRec; - -#define ShadowGCKey (&ShadowGCKeyRec) - -#define GET_SCREEN_PRIVATE(pScreen) \ - (ShadowScreenPtr)dixLookupPrivate(&(pScreen)->devPrivates, ShadowScreenKey) -#define GET_GC_PRIVATE(pGC) \ - (ShadowGCPtr)dixLookupPrivate(&(pGC)->devPrivates, ShadowGCKey) - -#define SHADOW_GC_FUNC_PROLOGUE(pGC)\ - ShadowGCPtr pGCPriv = GET_GC_PRIVATE(pGC);\ - (pGC)->funcs = pGCPriv->funcs;\ - if(pGCPriv->ops)\ - (pGC)->ops = pGCPriv->ops - -#define SHADOW_GC_FUNC_EPILOGUE(pGC)\ - pGCPriv->funcs = (pGC)->funcs;\ - (pGC)->funcs = &ShadowGCFuncs;\ - if(pGCPriv->ops) {\ - pGCPriv->ops = (pGC)->ops;\ - (pGC)->ops = &ShadowGCOps;\ - } - -#define SHADOW_GC_OP_PROLOGUE(pGC)\ - ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pGC->pScreen); \ - ShadowGCPtr pGCPriv = GET_GC_PRIVATE(pGC);\ - const GCFuncs *oldFuncs = pGC->funcs;\ - pGC->funcs = pGCPriv->funcs;\ - pGC->ops = pGCPriv->ops - -#define SHADOW_GC_OP_EPILOGUE(pGC)\ - pGCPriv->ops = pGC->ops;\ - pGC->funcs = oldFuncs;\ - pGC->ops = &ShadowGCOps - -#define IS_VISIBLE(pWin) (pPriv->vtSema && \ - (((WindowPtr)pWin)->visibility != VisibilityFullyObscured)) - -#define TRIM_BOX(box, pGC) { \ - BoxPtr extents = &pGC->pCompositeClip->extents;\ - if(box.x1 < extents->x1) box.x1 = extents->x1; \ - if(box.x2 > extents->x2) box.x2 = extents->x2; \ - if(box.y1 < extents->y1) box.y1 = extents->y1; \ - if(box.y2 > extents->y2) box.y2 = extents->y2; \ - } - -#define TRANSLATE_BOX(box, pDraw) { \ - box.x1 += pDraw->x; \ - box.x2 += pDraw->x; \ - box.y1 += pDraw->y; \ - box.y2 += pDraw->y; \ - } - -#define TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC) { \ - TRANSLATE_BOX(box, pDraw); \ - TRIM_BOX(box, pGC); \ - } - -#define BOX_NOT_EMPTY(box) \ - (((box.x2 - box.x1) > 0) && ((box.y2 - box.y1) > 0)) +static ShadowScreenPtr +shadowfbGetScreenPrivate(ScreenPtr pScreen) +{ + return dixLookupPrivate(&(pScreen)->devPrivates, &ShadowScreenKeyRec); +} Bool ShadowFBInit2(ScreenPtr pScreen, @@ -138,7 +54,6 @@ ShadowFBInit2(ScreenPtr pScreen, { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); ShadowScreenPtr pPriv; - PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); if (!preRefreshArea && !postRefreshArea) return FALSE; @@ -146,39 +61,20 @@ ShadowFBInit2(ScreenPtr pScreen, if (!dixRegisterPrivateKey(&ShadowScreenKeyRec, PRIVATE_SCREEN, 0)) return FALSE; - if (!dixRegisterPrivateKey - (&ShadowGCKeyRec, PRIVATE_GC, sizeof(ShadowGCRec))) - return FALSE; - if (!(pPriv = (ShadowScreenPtr) malloc(sizeof(ShadowScreenRec)))) return FALSE; - dixSetPrivate(&pScreen->devPrivates, ShadowScreenKey, pPriv); + dixSetPrivate(&pScreen->devPrivates, &ShadowScreenKeyRec, pPriv); pPriv->pScrn = pScrn; pPriv->preRefresh = preRefreshArea; pPriv->postRefresh = postRefreshArea; - pPriv->vtSema = TRUE; pPriv->CloseScreen = pScreen->CloseScreen; - pPriv->CopyWindow = pScreen->CopyWindow; - pPriv->CreateGC = pScreen->CreateGC; - pPriv->ModifyPixmapHeader = pScreen->ModifyPixmapHeader; - - pPriv->EnterVT = pScrn->EnterVT; - pPriv->LeaveVT = pScrn->LeaveVT; + pPriv->CreateScreenResources = pScreen->CreateScreenResources; pScreen->CloseScreen = ShadowCloseScreen; - pScreen->CopyWindow = ShadowCopyWindow; - pScreen->CreateGC = ShadowCreateGC; - - pScrn->EnterVT = ShadowEnterVT; - pScrn->LeaveVT = ShadowLeaveVT; - - if (ps) { - pPriv->Composite = ps->Composite; - ps->Composite = ShadowComposite; - } + pScreen->CreateScreenResources = ShadowCreateScreenResources; return TRUE; } @@ -189,1451 +85,83 @@ ShadowFBInit(ScreenPtr pScreen, RefreshAreaFuncPtr refreshArea) return ShadowFBInit2(pScreen, NULL, refreshArea); } -/**********************************************************/ - -static Bool -ShadowEnterVT(ScrnInfoPtr pScrn) -{ - Bool ret; - ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScrn->pScreen); - - pScrn->EnterVT = pPriv->EnterVT; - ret = (*pPriv->EnterVT) (pScrn); - pPriv->EnterVT = pScrn->EnterVT; - pScrn->EnterVT = ShadowEnterVT; - if (ret) { - pPriv->vtSema = TRUE; - return TRUE; - } - - return FALSE; -} - -static void -ShadowLeaveVT(ScrnInfoPtr pScrn) -{ - ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScrn->pScreen); - - pPriv->vtSema = FALSE; - - pScrn->LeaveVT = pPriv->LeaveVT; - (*pPriv->LeaveVT) (pScrn); - pPriv->LeaveVT = pScrn->LeaveVT; - pScrn->LeaveVT = ShadowLeaveVT; -} - -/**********************************************************/ - -static Bool -ShadowCloseScreen(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); - ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen); - PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); - - pScreen->CloseScreen = pPriv->CloseScreen; - pScreen->CopyWindow = pPriv->CopyWindow; - pScreen->CreateGC = pPriv->CreateGC; - pScreen->ModifyPixmapHeader = pPriv->ModifyPixmapHeader; - - pScrn->EnterVT = pPriv->EnterVT; - pScrn->LeaveVT = pPriv->LeaveVT; - - if (ps) { - ps->Composite = pPriv->Composite; - } - - free((void *) pPriv); - - return (*pScreen->CloseScreen) (pScreen); -} +/* + * Note that we don't do DamageEmpty, or indeed look at the region inside the + * DamagePtr at all. This is an optimization, believe it or not. The + * incoming RegionPtr is the new damage, and if we were to empty the region + * miext/damage would just have to waste time reallocating and re-unioning + * it every time, whereas if we leave it around the union gets fast-pathed + * away. + */ static void -ShadowCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgn) +shadowfbReportPre(DamagePtr damage, RegionPtr reg, void *closure) { - ScreenPtr pScreen = pWin->drawable.pScreen; - ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen); - int num = 0; - RegionRec rgnDst; - - if (pPriv->vtSema) { - RegionNull(&rgnDst); - RegionCopy(&rgnDst, prgn); - - RegionTranslate(&rgnDst, - pWin->drawable.x - ptOldOrg.x, - pWin->drawable.y - ptOldOrg.y); - RegionIntersect(&rgnDst, &pWin->borderClip, &rgnDst); - if ((num = RegionNumRects(&rgnDst))) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, num, RegionRects(&rgnDst)); - } - else { - RegionUninit(&rgnDst); - } - } + ShadowScreenPtr pPriv = closure; - pScreen->CopyWindow = pPriv->CopyWindow; - (*pScreen->CopyWindow) (pWin, ptOldOrg, prgn); - pScreen->CopyWindow = ShadowCopyWindow; + if (!pPriv->pScrn->vtSema) + return; - if (num) { - if (pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, num, RegionRects(&rgnDst)); - RegionUninit(&rgnDst); - } + pPriv->preRefresh(pPriv->pScrn, RegionNumRects(reg), RegionRects(reg)); } static void -ShadowComposite(CARD8 op, - PicturePtr pSrc, - PicturePtr pMask, - PicturePtr pDst, - INT16 xSrc, - INT16 ySrc, - INT16 xMask, - INT16 yMask, - INT16 xDst, INT16 yDst, CARD16 width, CARD16 height) +shadowfbReportPost(DamagePtr damage, RegionPtr reg, void *closure) { - ScreenPtr pScreen = pDst->pDrawable->pScreen; - ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen); - PictureScreenPtr ps = GetPictureScreen(pScreen); - BoxRec box; - BoxPtr extents; - Bool boxNotEmpty = FALSE; + ShadowScreenPtr pPriv = closure; - if (pPriv->vtSema && pDst->pDrawable->type == DRAWABLE_WINDOW) { + if (!pPriv->pScrn->vtSema) + return; - box.x1 = pDst->pDrawable->x + xDst; - box.y1 = pDst->pDrawable->y + yDst; - box.x2 = box.x1 + width; - box.y2 = box.y1 + height; - - extents = &pDst->pCompositeClip->extents; - if (box.x1 < extents->x1) - box.x1 = extents->x1; - if (box.x2 > extents->x2) - box.x2 = extents->x2; - if (box.y1 < extents->y1) - box.y1 = extents->y1; - if (box.y2 > extents->y2) - box.y2 = extents->y2; - - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - ps->Composite = pPriv->Composite; - (*ps->Composite) (op, pSrc, pMask, pDst, xSrc, ySrc, - xMask, yMask, xDst, yDst, width, height); - ps->Composite = ShadowComposite; - - if (pPriv->postRefresh && boxNotEmpty) { - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - } + pPriv->postRefresh(pPriv->pScrn, RegionNumRects(reg), RegionRects(reg)); } -/**********************************************************/ - -static void ShadowValidateGC(GCPtr, unsigned long, DrawablePtr); -static void ShadowChangeGC(GCPtr, unsigned long); -static void ShadowCopyGC(GCPtr, unsigned long, GCPtr); -static void ShadowDestroyGC(GCPtr); -static void ShadowChangeClip(GCPtr, int, void *, int); -static void ShadowDestroyClip(GCPtr); -static void ShadowCopyClip(GCPtr, GCPtr); - -GCFuncs ShadowGCFuncs = { - ShadowValidateGC, ShadowChangeGC, ShadowCopyGC, ShadowDestroyGC, - ShadowChangeClip, ShadowDestroyClip, ShadowCopyClip -}; - -extern GCOps ShadowGCOps; - static Bool -ShadowCreateGC(GCPtr pGC) +ShadowCreateScreenResources(ScreenPtr pScreen) { - ScreenPtr pScreen = pGC->pScreen; - ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen); - ShadowGCPtr pGCPriv = GET_GC_PRIVATE(pGC); Bool ret; + WindowPtr pWin = pScreen->root; + ShadowScreenPtr pPriv = shadowfbGetScreenPrivate(pScreen); - pScreen->CreateGC = pPriv->CreateGC; - if ((ret = (*pScreen->CreateGC) (pGC))) { - pGCPriv->ops = NULL; - pGCPriv->funcs = pGC->funcs; - pGC->funcs = &ShadowGCFuncs; - } - pScreen->CreateGC = ShadowCreateGC; - - return ret; -} - -static void -ShadowValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDraw) -{ - SHADOW_GC_FUNC_PROLOGUE(pGC); - (*pGC->funcs->ValidateGC) (pGC, changes, pDraw); - if (pDraw->type == DRAWABLE_WINDOW) - pGCPriv->ops = pGC->ops; /* just so it's not NULL */ - else - pGCPriv->ops = NULL; - SHADOW_GC_FUNC_EPILOGUE(pGC); -} - -static void -ShadowDestroyGC(GCPtr pGC) -{ - SHADOW_GC_FUNC_PROLOGUE(pGC); - (*pGC->funcs->DestroyGC) (pGC); - SHADOW_GC_FUNC_EPILOGUE(pGC); -} - -static void -ShadowChangeGC(GCPtr pGC, unsigned long mask) -{ - SHADOW_GC_FUNC_PROLOGUE(pGC); - (*pGC->funcs->ChangeGC) (pGC, mask); - SHADOW_GC_FUNC_EPILOGUE(pGC); -} + pScreen->CreateScreenResources = pPriv->CreateScreenResources; + ret = pScreen->CreateScreenResources(pScreen); + pPriv->CreateScreenResources = pScreen->CreateScreenResources; + pScreen->CreateScreenResources = ShadowCreateScreenResources; -static void -ShadowCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst) -{ - SHADOW_GC_FUNC_PROLOGUE(pGCDst); - (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst); - SHADOW_GC_FUNC_EPILOGUE(pGCDst); -} - -static void -ShadowChangeClip(GCPtr pGC, int type, void *pvalue, int nrects) -{ - SHADOW_GC_FUNC_PROLOGUE(pGC); - (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects); - SHADOW_GC_FUNC_EPILOGUE(pGC); -} - -static void -ShadowCopyClip(GCPtr pgcDst, GCPtr pgcSrc) -{ - SHADOW_GC_FUNC_PROLOGUE(pgcDst); - (*pgcDst->funcs->CopyClip) (pgcDst, pgcSrc); - SHADOW_GC_FUNC_EPILOGUE(pgcDst); -} - -static void -ShadowDestroyClip(GCPtr pGC) -{ - SHADOW_GC_FUNC_PROLOGUE(pGC); - (*pGC->funcs->DestroyClip) (pGC); - SHADOW_GC_FUNC_EPILOGUE(pGC); -} - -/**********************************************************/ - -static void -ShadowFillSpans(DrawablePtr pDraw, - GC * pGC, - int nInit, DDXPointPtr pptInit, int *pwidthInit, int fSorted) -{ - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && nInit) { - DDXPointPtr ppt = pptInit; - int *pwidth = pwidthInit; - int i = nInit; - BoxRec box; - Bool boxNotEmpty = FALSE; - - box.x1 = ppt->x; - box.x2 = box.x1 + *pwidth; - box.y2 = box.y1 = ppt->y; - - while (--i) { - ppt++; - pwidth++; - if (box.x1 > ppt->x) - box.x1 = ppt->x; - if (box.x2 < (ppt->x + *pwidth)) - box.x2 = ppt->x + *pwidth; - if (box.y1 > ppt->y) - box.y1 = ppt->y; - else if (box.y2 < ppt->y) - box.y2 = ppt->y; - } - - box.y2++; - - if (!pGC->miTranslate) { - TRANSLATE_BOX(box, pDraw); - } - TRIM_BOX(box, pGC); - - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - - (*pGC->ops->FillSpans) (pDraw, pGC, nInit, pptInit, pwidthInit, - fSorted); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - } - else - (*pGC->ops->FillSpans) (pDraw, pGC, nInit, pptInit, pwidthInit, - fSorted); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowSetSpans(DrawablePtr pDraw, - GCPtr pGC, - char *pcharsrc, - DDXPointPtr pptInit, int *pwidthInit, int nspans, int fSorted) -{ - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && nspans) { - DDXPointPtr ppt = pptInit; - int *pwidth = pwidthInit; - int i = nspans; - BoxRec box; - Bool boxNotEmpty = FALSE; - - box.x1 = ppt->x; - box.x2 = box.x1 + *pwidth; - box.y2 = box.y1 = ppt->y; - - while (--i) { - ppt++; - pwidth++; - if (box.x1 > ppt->x) - box.x1 = ppt->x; - if (box.x2 < (ppt->x + *pwidth)) - box.x2 = ppt->x + *pwidth; - if (box.y1 > ppt->y) - box.y1 = ppt->y; - else if (box.y2 < ppt->y) - box.y2 = ppt->y; - } - - box.y2++; - - if (!pGC->miTranslate) { - TRANSLATE_BOX(box, pDraw); - } - TRIM_BOX(box, pGC); - - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - - (*pGC->ops->SetSpans) (pDraw, pGC, pcharsrc, pptInit, - pwidthInit, nspans, fSorted); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - } - else - (*pGC->ops->SetSpans) (pDraw, pGC, pcharsrc, pptInit, - pwidthInit, nspans, fSorted); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowPutImage(DrawablePtr pDraw, - GCPtr pGC, - int depth, - int x, int y, int w, int h, - int leftPad, int format, char *pImage) -{ - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw)) { - box.x1 = x + pDraw->x; - box.x2 = box.x1 + w; - box.y1 = y + pDraw->y; - box.y2 = box.y1 + h; + /* this might look like it leaks, but the damage code reaps listeners + * when their drawable disappears. + */ + if (ret) { + DamagePtr damage; - TRIM_BOX(box, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; + if (pPriv->preRefresh) { + damage = DamageCreate(shadowfbReportPre, NULL, + DamageReportRawRegion, + TRUE, pScreen, pPriv); + DamageRegister(&pWin->drawable, damage); } - } - - (*pGC->ops->PutImage) (pDraw, pGC, depth, x, y, w, h, - leftPad, format, pImage); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static RegionPtr -ShadowCopyArea(DrawablePtr pSrc, - DrawablePtr pDst, - GC * pGC, - int srcx, int srcy, int width, int height, int dstx, int dsty) -{ - RegionPtr ret; - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDst)) { - box.x1 = dstx + pDst->x; - box.x2 = box.x1 + width; - box.y1 = dsty + pDst->y; - box.y2 = box.y1 + height; - - TRIM_BOX(box, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; + if (pPriv->postRefresh) { + damage = DamageCreate(shadowfbReportPost, NULL, + DamageReportRawRegion, + TRUE, pScreen, pPriv); + DamageSetReportAfterOp(damage, TRUE); + DamageRegister(&pWin->drawable, damage); } } - ret = (*pGC->ops->CopyArea) (pSrc, pDst, - pGC, srcx, srcy, width, height, dstx, dsty); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); - return ret; } -static RegionPtr -ShadowCopyPlane(DrawablePtr pSrc, - DrawablePtr pDst, - GCPtr pGC, - int srcx, int srcy, - int width, int height, - int dstx, int dsty, unsigned long bitPlane) -{ - RegionPtr ret; - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDst)) { - box.x1 = dstx + pDst->x; - box.x2 = box.x1 + width; - box.y1 = dsty + pDst->y; - box.y2 = box.y1 + height; - - TRIM_BOX(box, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - ret = (*pGC->ops->CopyPlane) (pSrc, pDst, - pGC, srcx, srcy, width, height, dstx, dsty, - bitPlane); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); - - return ret; -} - -static void -ShadowPolyPoint(DrawablePtr pDraw, - GCPtr pGC, int mode, int nptInit, xPoint * pptInit) -{ - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && nptInit) { - xPoint *ppt = pptInit; - int npt = nptInit; - - box.x2 = box.x1 = pptInit->x; - box.y2 = box.y1 = pptInit->y; - - /* this could be slow if the points were spread out */ - - while (--npt) { - ppt++; - if (box.x1 > ppt->x) - box.x1 = ppt->x; - else if (box.x2 < ppt->x) - box.x2 = ppt->x; - if (box.y1 > ppt->y) - box.y1 = ppt->y; - else if (box.y2 < ppt->y) - box.y2 = ppt->y; - } - - box.x2++; - box.y2++; - - TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - (*pGC->ops->PolyPoint) (pDraw, pGC, mode, nptInit, pptInit); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowPolylines(DrawablePtr pDraw, - GCPtr pGC, int mode, int nptInit, DDXPointPtr pptInit) -{ - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && nptInit) { - DDXPointPtr ppt = pptInit; - int npt = nptInit; - int extra = pGC->lineWidth >> 1; - - box.x2 = box.x1 = pptInit->x; - box.y2 = box.y1 = pptInit->y; - - if (npt > 1) { - if (pGC->joinStyle == JoinMiter) - extra = 6 * pGC->lineWidth; - else if (pGC->capStyle == CapProjecting) - extra = pGC->lineWidth; - } - - if (mode == CoordModePrevious) { - int x = box.x1; - int y = box.y1; - - while (--npt) { - ppt++; - x += ppt->x; - y += ppt->y; - if (box.x1 > x) - box.x1 = x; - else if (box.x2 < x) - box.x2 = x; - if (box.y1 > y) - box.y1 = y; - else if (box.y2 < y) - box.y2 = y; - } - } - else { - while (--npt) { - ppt++; - if (box.x1 > ppt->x) - box.x1 = ppt->x; - else if (box.x2 < ppt->x) - box.x2 = ppt->x; - if (box.y1 > ppt->y) - box.y1 = ppt->y; - else if (box.y2 < ppt->y) - box.y2 = ppt->y; - } - } - - box.x2++; - box.y2++; - - if (extra) { - box.x1 -= extra; - box.x2 += extra; - box.y1 -= extra; - box.y2 += extra; - } - - TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - (*pGC->ops->Polylines) (pDraw, pGC, mode, nptInit, pptInit); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowPolySegment(DrawablePtr pDraw, - GCPtr pGC, int nsegInit, xSegment * pSegInit) -{ - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && nsegInit) { - int extra = pGC->lineWidth; - xSegment *pSeg = pSegInit; - int nseg = nsegInit; - - if (pGC->capStyle != CapProjecting) - extra >>= 1; - - if (pSeg->x2 > pSeg->x1) { - box.x1 = pSeg->x1; - box.x2 = pSeg->x2; - } - else { - box.x2 = pSeg->x1; - box.x1 = pSeg->x2; - } - - if (pSeg->y2 > pSeg->y1) { - box.y1 = pSeg->y1; - box.y2 = pSeg->y2; - } - else { - box.y2 = pSeg->y1; - box.y1 = pSeg->y2; - } - - while (--nseg) { - pSeg++; - if (pSeg->x2 > pSeg->x1) { - if (pSeg->x1 < box.x1) - box.x1 = pSeg->x1; - if (pSeg->x2 > box.x2) - box.x2 = pSeg->x2; - } - else { - if (pSeg->x2 < box.x1) - box.x1 = pSeg->x2; - if (pSeg->x1 > box.x2) - box.x2 = pSeg->x1; - } - if (pSeg->y2 > pSeg->y1) { - if (pSeg->y1 < box.y1) - box.y1 = pSeg->y1; - if (pSeg->y2 > box.y2) - box.y2 = pSeg->y2; - } - else { - if (pSeg->y2 < box.y1) - box.y1 = pSeg->y2; - if (pSeg->y1 > box.y2) - box.y2 = pSeg->y1; - } - } - - box.x2++; - box.y2++; - - if (extra) { - box.x1 -= extra; - box.x2 += extra; - box.y1 -= extra; - box.y2 += extra; - } - - TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - (*pGC->ops->PolySegment) (pDraw, pGC, nsegInit, pSegInit); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowPolyRectangle(DrawablePtr pDraw, - GCPtr pGC, int nRectsInit, xRectangle *pRectsInit) -{ - BoxRec box; - BoxPtr pBoxInit = NULL; - Bool boxNotEmpty = FALSE; - int num = 0; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && nRectsInit) { - xRectangle *pRects = pRectsInit; - int nRects = nRectsInit; - - if (nRects >= 32) { - int extra = pGC->lineWidth >> 1; - - box.x1 = pRects->x; - box.x2 = box.x1 + pRects->width; - box.y1 = pRects->y; - box.y2 = box.y1 + pRects->height; - - while (--nRects) { - pRects++; - if (box.x1 > pRects->x) - box.x1 = pRects->x; - if (box.x2 < (pRects->x + pRects->width)) - box.x2 = pRects->x + pRects->width; - if (box.y1 > pRects->y) - box.y1 = pRects->y; - if (box.y2 < (pRects->y + pRects->height)) - box.y2 = pRects->y + pRects->height; - } - - if (extra) { - box.x1 -= extra; - box.x2 += extra; - box.y1 -= extra; - box.y2 += extra; - } - - box.x2++; - box.y2++; - - TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - else { - BoxPtr pbox; - int offset1, offset2, offset3; - - offset2 = pGC->lineWidth; - if (!offset2) - offset2 = 1; - offset1 = offset2 >> 1; - offset3 = offset2 - offset1; - - pBoxInit = (BoxPtr) malloc(nRects * 4 * sizeof(BoxRec)); - pbox = pBoxInit; - - while (nRects--) { - pbox->x1 = pRects->x - offset1; - pbox->y1 = pRects->y - offset1; - pbox->x2 = pbox->x1 + pRects->width + offset2; - pbox->y2 = pbox->y1 + offset2; - TRIM_AND_TRANSLATE_BOX((*pbox), pDraw, pGC); - if (BOX_NOT_EMPTY((*pbox))) { - num++; - pbox++; - } - - pbox->x1 = pRects->x - offset1; - pbox->y1 = pRects->y + offset3; - pbox->x2 = pbox->x1 + offset2; - pbox->y2 = pbox->y1 + pRects->height - offset2; - TRIM_AND_TRANSLATE_BOX((*pbox), pDraw, pGC); - if (BOX_NOT_EMPTY((*pbox))) { - num++; - pbox++; - } - - pbox->x1 = pRects->x + pRects->width - offset1; - pbox->y1 = pRects->y + offset3; - pbox->x2 = pbox->x1 + offset2; - pbox->y2 = pbox->y1 + pRects->height - offset2; - TRIM_AND_TRANSLATE_BOX((*pbox), pDraw, pGC); - if (BOX_NOT_EMPTY((*pbox))) { - num++; - pbox++; - } - - pbox->x1 = pRects->x - offset1; - pbox->y1 = pRects->y + pRects->height - offset1; - pbox->x2 = pbox->x1 + pRects->width + offset2; - pbox->y2 = pbox->y1 + offset2; - TRIM_AND_TRANSLATE_BOX((*pbox), pDraw, pGC); - if (BOX_NOT_EMPTY((*pbox))) { - num++; - pbox++; - } - - pRects++; - } - - if (num) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, num, pBoxInit); - } - else { - free(pBoxInit); - } - } - } - - (*pGC->ops->PolyRectangle) (pDraw, pGC, nRectsInit, pRectsInit); - - if (boxNotEmpty && pPriv->postRefresh) { - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - } - else if (num) { - if (pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, num, pBoxInit); - free(pBoxInit); - } - - SHADOW_GC_OP_EPILOGUE(pGC); - -} - -static void -ShadowPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcsInit, xArc * parcsInit) -{ - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && narcsInit) { - int narcs = narcsInit; - xArc *parcs = parcsInit; - int extra = pGC->lineWidth >> 1; - - box.x1 = parcs->x; - box.x2 = box.x1 + parcs->width; - box.y1 = parcs->y; - box.y2 = box.y1 + parcs->height; - - /* should I break these up instead ? */ - - while (--narcs) { - parcs++; - if (box.x1 > parcs->x) - box.x1 = parcs->x; - if (box.x2 < (parcs->x + parcs->width)) - box.x2 = parcs->x + parcs->width; - if (box.y1 > parcs->y) - box.y1 = parcs->y; - if (box.y2 < (parcs->y + parcs->height)) - box.y2 = parcs->y + parcs->height; - } - - if (extra) { - box.x1 -= extra; - box.x2 += extra; - box.y1 -= extra; - box.y2 += extra; - } - - box.x2++; - box.y2++; - - TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - (*pGC->ops->PolyArc) (pDraw, pGC, narcsInit, parcsInit); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); - -} - -static void -ShadowFillPolygon(DrawablePtr pDraw, - GCPtr pGC, - int shape, int mode, int count, DDXPointPtr pptInit) -{ - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && (count > 2)) { - DDXPointPtr ppt = pptInit; - int i = count; - BoxRec box; - Bool boxNotEmpty = FALSE; - - box.x2 = box.x1 = ppt->x; - box.y2 = box.y1 = ppt->y; - - if (mode != CoordModeOrigin) { - int x = box.x1; - int y = box.y1; - - while (--i) { - ppt++; - x += ppt->x; - y += ppt->y; - if (box.x1 > x) - box.x1 = x; - else if (box.x2 < x) - box.x2 = x; - if (box.y1 > y) - box.y1 = y; - else if (box.y2 < y) - box.y2 = y; - } - } - else { - while (--i) { - ppt++; - if (box.x1 > ppt->x) - box.x1 = ppt->x; - else if (box.x2 < ppt->x) - box.x2 = ppt->x; - if (box.y1 > ppt->y) - box.y1 = ppt->y; - else if (box.y2 < ppt->y) - box.y2 = ppt->y; - } - } - - box.x2++; - box.y2++; - - TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - - (*pGC->ops->FillPolygon) (pDraw, pGC, shape, mode, count, pptInit); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - } - else - (*pGC->ops->FillPolygon) (pDraw, pGC, shape, mode, count, pptInit); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowPolyFillRect(DrawablePtr pDraw, - GCPtr pGC, int nRectsInit, xRectangle *pRectsInit) -{ - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && nRectsInit) { - BoxRec box; - Bool boxNotEmpty = FALSE; - xRectangle *pRects = pRectsInit; - int nRects = nRectsInit; - - box.x1 = pRects->x; - box.x2 = box.x1 + pRects->width; - box.y1 = pRects->y; - box.y2 = box.y1 + pRects->height; - - while (--nRects) { - pRects++; - if (box.x1 > pRects->x) - box.x1 = pRects->x; - if (box.x2 < (pRects->x + pRects->width)) - box.x2 = pRects->x + pRects->width; - if (box.y1 > pRects->y) - box.y1 = pRects->y; - if (box.y2 < (pRects->y + pRects->height)) - box.y2 = pRects->y + pRects->height; - } - - /* cfb messes with the pRectsInit so we have to do our - calculations first */ - - TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - - (*pGC->ops->PolyFillRect) (pDraw, pGC, nRectsInit, pRectsInit); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - } - else - (*pGC->ops->PolyFillRect) (pDraw, pGC, nRectsInit, pRectsInit); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowPolyFillArc(DrawablePtr pDraw, GCPtr pGC, int narcsInit, xArc * parcsInit) -{ - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && narcsInit) { - xArc *parcs = parcsInit; - int narcs = narcsInit; - - box.x1 = parcs->x; - box.x2 = box.x1 + parcs->width; - box.y1 = parcs->y; - box.y2 = box.y1 + parcs->height; - - /* should I break these up instead ? */ - - while (--narcs) { - parcs++; - if (box.x1 > parcs->x) - box.x1 = parcs->x; - if (box.x2 < (parcs->x + parcs->width)) - box.x2 = parcs->x + parcs->width; - if (box.y1 > parcs->y) - box.y1 = parcs->y; - if (box.y2 < (parcs->y + parcs->height)) - box.y2 = parcs->y + parcs->height; - } - - TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - (*pGC->ops->PolyFillArc) (pDraw, pGC, narcsInit, parcsInit); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowTextExtent(FontPtr pFont, int count, char *chars, - FontEncoding fontEncoding, BoxPtr box) -{ - unsigned long n, i; - int w; - CharInfoPtr charinfo[255]; /* encoding only has 1 byte for count */ - - GetGlyphs(pFont, (unsigned long) count, (unsigned char *) chars, - fontEncoding, &n, charinfo); - w = 0; - for (i = 0; i < n; i++) { - w += charinfo[i]->metrics.characterWidth; - } - if (i) { - w += charinfo[i - 1]->metrics.rightSideBearing; - } - - box->x1 = 0; - if (n) { - if (charinfo[0]->metrics.leftSideBearing < 0) { - box->x1 = charinfo[0]->metrics.leftSideBearing; - } - } - box->x2 = w; - box->y1 = -FONTMAXBOUNDS(pFont, ascent); - box->y2 = FONTMAXBOUNDS(pFont, descent); -} - -static void -ShadowFontToBox(BoxPtr BB, DrawablePtr pDrawable, GCPtr pGC, int x, int y, - int count, char *chars, int wide) -{ - FontPtr pFont; - - pFont = pGC->font; - if (pFont->info.constantWidth) { - int ascent, descent, left, right = 0; - - ascent = max(pFont->info.fontAscent, pFont->info.maxbounds.ascent); - descent = max(pFont->info.fontDescent, pFont->info.maxbounds.descent); - left = pFont->info.maxbounds.leftSideBearing; - if (count > 0) { - right = (count - 1) * pFont->info.maxbounds.characterWidth; - } - right += pFont->info.maxbounds.rightSideBearing; - BB->x1 = - max(pDrawable->x + x - left, - RegionExtents(&((WindowPtr) pDrawable)->winSize)->x1); - BB->y1 = - max(pDrawable->y + y - ascent, - RegionExtents(&((WindowPtr) pDrawable)->winSize)->y1); - BB->x2 = - min(pDrawable->x + x + right, - RegionExtents(&((WindowPtr) pDrawable)->winSize)->x2); - BB->y2 = - min(pDrawable->y + y + descent, - RegionExtents(&((WindowPtr) pDrawable)->winSize)->y2); - } - else { - ShadowTextExtent(pFont, count, chars, wide ? (FONTLASTROW(pFont) == 0) - ? Linear16Bit : TwoD16Bit : Linear8Bit, BB); - BB->x1 = - max(pDrawable->x + x + BB->x1, - RegionExtents(&((WindowPtr) pDrawable)->winSize)->x1); - BB->y1 = - max(pDrawable->y + y + BB->y1, - RegionExtents(&((WindowPtr) pDrawable)->winSize)->y1); - BB->x2 = - min(pDrawable->x + x + BB->x2, - RegionExtents(&((WindowPtr) pDrawable)->winSize)->x2); - BB->y2 = - min(pDrawable->y + y + BB->y2, - RegionExtents(&((WindowPtr) pDrawable)->winSize)->y2); - } -} - -static int -ShadowPolyText8(DrawablePtr pDraw, - GCPtr pGC, int x, int y, int count, char *chars) -{ - int width; - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw)) { - ShadowFontToBox(&box, pDraw, pGC, x, y, count, chars, 0); - - TRIM_BOX(box, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - width = (*pGC->ops->PolyText8) (pDraw, pGC, x, y, count, chars); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); - - return width; -} - -static int -ShadowPolyText16(DrawablePtr pDraw, - GCPtr pGC, int x, int y, int count, unsigned short *chars) -{ - int width; - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw)) { - ShadowFontToBox(&box, pDraw, pGC, x, y, count, (char *) chars, 1); - - TRIM_BOX(box, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - width = (*pGC->ops->PolyText16) (pDraw, pGC, x, y, count, chars); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); - - return width; -} - -static void -ShadowImageText8(DrawablePtr pDraw, - GCPtr pGC, int x, int y, int count, char *chars) -{ - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && count) { - int top, bot, Min, Max; - - top = max(FONTMAXBOUNDS(pGC->font, ascent), FONTASCENT(pGC->font)); - bot = max(FONTMAXBOUNDS(pGC->font, descent), FONTDESCENT(pGC->font)); - - Min = count * FONTMINBOUNDS(pGC->font, characterWidth); - if (Min > 0) - Min = 0; - Max = count * FONTMAXBOUNDS(pGC->font, characterWidth); - if (Max < 0) - Max = 0; - - /* ugh */ - box.x1 = pDraw->x + x + Min + FONTMINBOUNDS(pGC->font, leftSideBearing); - box.x2 = pDraw->x + x + Max + - FONTMAXBOUNDS(pGC->font, rightSideBearing); - - box.y1 = pDraw->y + y - top; - box.y2 = pDraw->y + y + bot; - - TRIM_BOX(box, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - (*pGC->ops->ImageText8) (pDraw, pGC, x, y, count, chars); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowImageText16(DrawablePtr pDraw, - GCPtr pGC, int x, int y, int count, unsigned short *chars) -{ - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && count) { - int top, bot, Min, Max; - - top = max(FONTMAXBOUNDS(pGC->font, ascent), FONTASCENT(pGC->font)); - bot = max(FONTMAXBOUNDS(pGC->font, descent), FONTDESCENT(pGC->font)); - - Min = count * FONTMINBOUNDS(pGC->font, characterWidth); - if (Min > 0) - Min = 0; - Max = count * FONTMAXBOUNDS(pGC->font, characterWidth); - if (Max < 0) - Max = 0; - - /* ugh */ - box.x1 = pDraw->x + x + Min + FONTMINBOUNDS(pGC->font, leftSideBearing); - box.x2 = pDraw->x + x + Max + - FONTMAXBOUNDS(pGC->font, rightSideBearing); - - box.y1 = pDraw->y + y - top; - box.y2 = pDraw->y + y + bot; - - TRIM_BOX(box, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - (*pGC->ops->ImageText16) (pDraw, pGC, x, y, count, chars); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowImageGlyphBlt(DrawablePtr pDraw, - GCPtr pGC, - int x, int y, - unsigned int nglyphInit, - CharInfoPtr * ppciInit, void *pglyphBase) -{ - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && nglyphInit) { - CharInfoPtr *ppci = ppciInit; - unsigned int nglyph = nglyphInit; - int top, bot, width = 0; - - top = max(FONTMAXBOUNDS(pGC->font, ascent), FONTASCENT(pGC->font)); - bot = max(FONTMAXBOUNDS(pGC->font, descent), FONTDESCENT(pGC->font)); - - box.x1 = ppci[0]->metrics.leftSideBearing; - if (box.x1 > 0) - box.x1 = 0; - box.x2 = ppci[nglyph - 1]->metrics.rightSideBearing - - ppci[nglyph - 1]->metrics.characterWidth; - if (box.x2 < 0) - box.x2 = 0; - - box.x2 += pDraw->x + x; - box.x1 += pDraw->x + x; - - while (nglyph--) { - width += (*ppci)->metrics.characterWidth; - ppci++; - } - - if (width > 0) - box.x2 += width; - else - box.x1 += width; - - box.y1 = pDraw->y + y - top; - box.y2 = pDraw->y + y + bot; - - TRIM_BOX(box, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - (*pGC->ops->ImageGlyphBlt) (pDraw, pGC, x, y, nglyphInit, - ppciInit, pglyphBase); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowPolyGlyphBlt(DrawablePtr pDraw, - GCPtr pGC, - int x, int y, - unsigned int nglyphInit, - CharInfoPtr * ppciInit, void *pglyphBase) -{ - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw) && nglyphInit) { - CharInfoPtr *ppci = ppciInit; - unsigned int nglyph = nglyphInit; - - /* ugh */ - box.x1 = pDraw->x + x + ppci[0]->metrics.leftSideBearing; - box.x2 = pDraw->x + x + ppci[nglyph - 1]->metrics.rightSideBearing; - - if (nglyph > 1) { - int width = 0; - - while (--nglyph) { - width += (*ppci)->metrics.characterWidth; - ppci++; - } - - if (width > 0) - box.x2 += width; - else - box.x1 += width; - } - - box.y1 = pDraw->y + y - FONTMAXBOUNDS(pGC->font, ascent); - box.y2 = pDraw->y + y + FONTMAXBOUNDS(pGC->font, descent); - - TRIM_BOX(box, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - (*pGC->ops->PolyGlyphBlt) (pDraw, pGC, x, y, nglyphInit, - ppciInit, pglyphBase); - - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); - - SHADOW_GC_OP_EPILOGUE(pGC); -} - -static void -ShadowPushPixels(GCPtr pGC, - PixmapPtr pBitMap, - DrawablePtr pDraw, int dx, int dy, int xOrg, int yOrg) +static Bool +ShadowCloseScreen(ScreenPtr pScreen) { - BoxRec box; - Bool boxNotEmpty = FALSE; - - SHADOW_GC_OP_PROLOGUE(pGC); - - if (IS_VISIBLE(pDraw)) { - box.x1 = xOrg; - box.y1 = yOrg; - - if (!pGC->miTranslate) { - box.x1 += pDraw->x; - box.y1 += pDraw->y; - } + ShadowScreenPtr pPriv = shadowfbGetScreenPrivate(pScreen); - box.x2 = box.x1 + dx; - box.y2 = box.y1 + dy; - - TRIM_BOX(box, pGC); - if (BOX_NOT_EMPTY(box)) { - if (pPriv->preRefresh) - (*pPriv->preRefresh) (pPriv->pScrn, 1, &box); - boxNotEmpty = TRUE; - } - } - - (*pGC->ops->PushPixels) (pGC, pBitMap, pDraw, dx, dy, xOrg, yOrg); + pScreen->CloseScreen = pPriv->CloseScreen; + pScreen->CreateScreenResources = pPriv->CreateScreenResources; - if (boxNotEmpty && pPriv->postRefresh) - (*pPriv->postRefresh) (pPriv->pScrn, 1, &box); + free(pPriv); - SHADOW_GC_OP_EPILOGUE(pGC); + return (*pScreen->CloseScreen) (pScreen); } - -GCOps ShadowGCOps = { - ShadowFillSpans, ShadowSetSpans, - ShadowPutImage, ShadowCopyArea, - ShadowCopyPlane, ShadowPolyPoint, - ShadowPolylines, ShadowPolySegment, - ShadowPolyRectangle, ShadowPolyArc, - ShadowFillPolygon, ShadowPolyFillRect, - ShadowPolyFillArc, ShadowPolyText8, - ShadowPolyText16, ShadowImageText8, - ShadowImageText16, ShadowImageGlyphBlt, - ShadowPolyGlyphBlt, ShadowPushPixels, -}; diff --git a/xorg-server/hw/xfree86/xorg-wrapper.c b/xorg-server/hw/xfree86/xorg-wrapper.c index 90c8c11ef..4ea47331b 100644 --- a/xorg-server/hw/xfree86/xorg-wrapper.c +++ b/xorg-server/hw/xfree86/xorg-wrapper.c @@ -25,6 +25,7 @@ #include "dix-config.h" +#include <errno.h> #include <fcntl.h> #include <limits.h> #include <stdint.h> @@ -34,12 +35,17 @@ #include <sys/ioctl.h> #include <sys/stat.h> #include <sys/types.h> +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) +#include <sys/consio.h> +#endif #include <unistd.h> -#include <drm/drm.h> +#include <drm.h> #include <xf86drm.h> /* For DRM_DEV_NAME */ #define CONFIG_FILE SYSCONFDIR "/X11/Xwrapper.config" +static const char *progname; + enum { ROOT_ONLY, CONSOLE_ONLY, ANYBODY }; /* KISS non locale / LANG parsing isspace version */ @@ -88,18 +94,21 @@ static void parse_config(int *allowed, int *needs_root_rights) /* Split in a key + value pair */ equals = strchr(stripped, '='); if (!equals) { - fprintf(stderr, "Syntax error at %s line %d\n", CONFIG_FILE, line); + fprintf(stderr, "%s: Syntax error at %s line %d\n", progname, + CONFIG_FILE, line); exit(1); } *equals = 0; key = strip(stripped); /* To remove trailing whitespace from key */ value = strip(equals + 1); /* To remove leading whitespace from val */ if (!key[0]) { - fprintf(stderr, "Missing key at %s line %d\n", CONFIG_FILE, line); + fprintf(stderr, "%s: Missing key at %s line %d\n", progname, + CONFIG_FILE, line); exit(1); } if (!value[0]) { - fprintf(stderr, "Missing value at %s line %d\n", CONFIG_FILE, line); + fprintf(stderr, "%s: Missing value at %s line %d\n", progname, + CONFIG_FILE, line); exit(1); } @@ -113,8 +122,8 @@ static void parse_config(int *allowed, int *needs_root_rights) *allowed = ANYBODY; else { fprintf(stderr, - "Invalid value '%s' for 'allowed_users' at %s line %d\n", - value, CONFIG_FILE, line); + "%s: Invalid value '%s' for 'allowed_users' at %s line %d\n", + progname, value, CONFIG_FILE, line); exit(1); } } @@ -127,8 +136,8 @@ static void parse_config(int *allowed, int *needs_root_rights) *needs_root_rights = -1; else { fprintf(stderr, - "Invalid value '%s' for 'needs_root_rights' at %s line %d\n", - value, CONFIG_FILE, line); + "%s: Invalid value '%s' for 'needs_root_rights' at %s line %d\n", + progname, value, CONFIG_FILE, line); exit(1); } } @@ -136,18 +145,45 @@ static void parse_config(int *allowed, int *needs_root_rights) /* Backward compatibility with older Debian Xwrapper, ignore */ } else { - fprintf(stderr, "Invalid key '%s' at %s line %d\n", key, - CONFIG_FILE, line); + fprintf(stderr, "%s: Invalid key '%s' at %s line %d\n", key, + progname, CONFIG_FILE, line); exit(1); } } fclose(f); } +static int on_console(int fd) +{ +#if defined(__linux__) + struct stat st; + int r; + + r = fstat(fd, &st); + if (r == 0 && S_ISCHR(st.st_mode) && major(st.st_rdev) == 4) + return 1; +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + int idx; + + if (ioctl(fd, VT_GETINDEX, &idx) != -1) + return 1; +#else +#warning This program needs porting to your kernel. + static int seen; + + if (!seen) { + fprintf(stderr, "%s: Unable to determine if running on a console\n", + progname); + seen = 1; + } +#endif + + return 0; +} + int main(int argc, char *argv[]) { struct drm_mode_card_res res; - struct stat st; char buf[PATH_MAX]; int i, r, fd; int kms_cards = 0; @@ -155,6 +191,8 @@ int main(int argc, char *argv[]) int allowed = CONSOLE_ONLY; int needs_root_rights = -1; + progname = argv[0]; + parse_config(&allowed, &needs_root_rights); /* For non root users check if they are allowed to run the X server */ @@ -168,8 +206,7 @@ int main(int argc, char *argv[]) case CONSOLE_ONLY: /* Some of stdin / stdout / stderr maybe redirected to a file */ for (i = STDIN_FILENO; i <= STDERR_FILENO; i++) { - r = fstat(i, &st); - if (r == 0 && S_ISCHR(st.st_mode) && major(st.st_rdev) == 4) + if (on_console(i)) break; } if (i > STDERR_FILENO) { @@ -207,11 +244,13 @@ int main(int argc, char *argv[]) uid_t realuid = getuid(); if (setresgid(-1, realgid, realgid) != 0) { - perror("Could not drop setgid privileges"); + fprintf(stderr, "%s: Could not drop setgid privileges: %s\n", + progname, strerror(errno)); exit(1); } if (setresuid(-1, realuid, realuid) != 0) { - perror("Could not drop setuid privileges"); + fprintf(stderr, "%s: Could not drop setuid privileges: %s\n", + progname, strerror(errno)); exit(1); } } @@ -220,12 +259,14 @@ int main(int argc, char *argv[]) /* Check if the server is executable by our real uid */ if (access(buf, X_OK) != 0) { - perror("Missing execute permissions for " SUID_WRAPPER_DIR "Xorg.bin"); + fprintf(stderr, "%s: Missing execute permissions for %s/Xorg.bin: %s\n", + progname, SUID_WRAPPER_DIR, strerror(errno)); exit(1); } argv[0] = buf; (void) execv(argv[0], argv); - perror("Failed to execute " SUID_WRAPPER_DIR "/Xorg.bin"); + fprintf(stderr, "%s: Failed to execute %s/Xorg.bin: %s\n", + progname, SUID_WRAPPER_DIR, strerror(errno)); exit(1); } diff --git a/xorg-server/hw/xwayland/xwayland.c b/xorg-server/hw/xwayland/xwayland.c index c2c6481af..b966e5070 100644 --- a/xorg-server/hw/xwayland/xwayland.c +++ b/xorg-server/hw/xwayland/xwayland.c @@ -218,7 +218,6 @@ xwl_realize_window(WindowPtr window) screen->RealizeWindow = xwl_realize_window; if (xwl_screen->rootless && !window->parent) { - ErrorF("Clearing root clip\n"); RegionNull(&window->clipList); RegionNull(&window->borderClip); RegionNull(&window->winSize); @@ -573,8 +572,10 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) fbPictureInit(pScreen, 0, 0); +#ifdef HAVE_XSHMFENCE if (!miSyncShmScreenInit(pScreen)) return FALSE; +#endif xwl_screen->wayland_fd = wl_display_get_fd(xwl_screen->display); AddGeneralSocket(xwl_screen->wayland_fd); @@ -616,8 +617,10 @@ xwl_log_handler(const char *format, va_list args) FatalError("%s", msg); } -static const ExtensionModule glx_extension[] = { +static const ExtensionModule xwayland_extensions[] = { +#ifdef GLXEXT { GlxExtensionInit, "GLX", &noGlxExtension }, +#endif }; void @@ -639,7 +642,8 @@ InitOutput(ScreenInfo * screen_info, int argc, char **argv) screen_info->bitmapBitOrder = BITMAP_BIT_ORDER; screen_info->numPixmapFormats = ARRAY_SIZE(depths); - LoadExtensionList(glx_extension, ARRAY_SIZE(glx_extension), FALSE); + LoadExtensionList(xwayland_extensions, + ARRAY_SIZE(xwayland_extensions), FALSE); /* Cast away warning from missing printf annotation for * wl_log_func_t. Wayland 1.5 will have the annotation, so we can diff --git a/xorg-server/include/dix.h b/xorg-server/include/dix.h index 8371df072..f42e23655 100644 --- a/xorg-server/include/dix.h +++ b/xorg-server/include/dix.h @@ -608,4 +608,6 @@ CorePointerProc(DeviceIntPtr dev, int what); extern _X_HIDDEN int CoreKeyboardProc(DeviceIntPtr dev, int what); +extern _X_EXPORT void *lastGLContext; + #endif /* DIX_H */ diff --git a/xorg-server/include/opaque.h b/xorg-server/include/opaque.h index 6b8071c5b..a2c54aa6a 100644 --- a/xorg-server/include/opaque.h +++ b/xorg-server/include/opaque.h @@ -56,6 +56,7 @@ extern _X_EXPORT Bool explicit_display; extern _X_EXPORT int defaultBackingStore; extern _X_EXPORT Bool disableBackingStore; extern _X_EXPORT Bool enableBackingStore; +extern _X_EXPORT Bool enableIndirectGLX; extern _X_EXPORT Bool PartialNetwork; extern _X_EXPORT Bool RunFromSigStopParent; diff --git a/xorg-server/os/busfault.c b/xorg-server/os/busfault.c index 43bb6ea8a..ac0268fd5 100644 --- a/xorg-server/os/busfault.c +++ b/xorg-server/os/busfault.c @@ -142,6 +142,7 @@ busfault_init(void) act.sa_sigaction = busfault_sigaction; act.sa_flags = SA_SIGINFO; + sigemptyset(&act.sa_mask); if (sigaction(SIGBUS, &act, &old_act) < 0) return FALSE; previous_busfault_sigaction = old_act.sa_sigaction; diff --git a/xorg-server/os/connection.c b/xorg-server/os/connection.c index e914d9d94..40d9ff39b 100644 --- a/xorg-server/os/connection.c +++ b/xorg-server/os/connection.c @@ -353,9 +353,12 @@ NotifyParentProcess(void) { #if !defined(WIN32) if (displayfd >= 0) { - write(displayfd, display, strlen(display)); - write(displayfd, "\n", 1); + if (write(displayfd, display, strlen(display)) != strlen(display)) + FatalError("Cannot write display number to fd %d\n", displayfd); + if (write(displayfd, "\n", 1) != 1) + FatalError("Cannot write display number to fd %d\n", displayfd); close(displayfd); + displayfd = -1; } if (RunFromSmartParent) { if (ParentProcess > 1) { diff --git a/xorg-server/os/log.c b/xorg-server/os/log.c index 38193eed6..a0f2a81f3 100644 --- a/xorg-server/os/log.c +++ b/xorg-server/os/log.c @@ -491,13 +491,14 @@ static void LogSWrite(int verb, const char *buf, size_t len, Bool end_line) { static Bool newline = TRUE; + int ret; if (verb < 0 || logVerbosity >= verb) - write(2, buf, len); + ret = write(2, buf, len); if (verb < 0 || logFileVerbosity >= verb) { if (inSignalContext && logFileFd >= 0) { - write(logFileFd, buf, len); + ret = write(logFileFd, buf, len); #ifndef WIN32 if (logFlush && logSync) fsync(logFileFd); @@ -529,6 +530,11 @@ LogSWrite(int verb, const char *buf, size_t len, Bool end_line) bufferPos += len; } } + + /* There's no place to log an error message if the log write + * fails... + */ + (void) ret; } void diff --git a/xorg-server/os/utils.c b/xorg-server/os/utils.c index 6e6974e89..bc5e7df4d 100644 --- a/xorg-server/os/utils.c +++ b/xorg-server/os/utils.c @@ -194,6 +194,8 @@ Bool noGEExtension = FALSE; Bool CoreDump; +Bool enableIndirectGLX = TRUE; + #ifdef PANORAMIX Bool PanoramiXExtensionDisabledHack = FALSE; #endif @@ -313,7 +315,8 @@ LockServer(void) if (lfd < 0) FatalError("Could not create lock file in %s\n", tmp); snprintf(pid_str, sizeof(pid_str), "%10ld\n", (long) getpid()); - (void) write(lfd, pid_str, 11); + if (write(lfd, pid_str, 11) != 11) + FatalError("Could not write pid to lock file in %s\n", tmp); (void) fchmod(lfd, 0444); (void) close(lfd); @@ -537,6 +540,8 @@ UseMsg(void) ErrorF("-fn string default font name\n"); ErrorF("-fp string default font path\n"); ErrorF("-help prints message with these options\n"); + ErrorF("+iglx Allow creating indirect GLX contexts (default)\n"); + ErrorF("-iglx Prohibit creating indirect GLX contexts\n"); ErrorF("-I ignore all remaining arguments\n"); #ifdef RLIMIT_DATA ErrorF("-ld int limit data space to N Kb\n"); @@ -783,6 +788,10 @@ ProcessCommandLine(int argc, char *argv[]) UseMsg(); exit(0); } + else if (strcmp(argv[i], "+iglx") == 0) + enableIndirectGLX = TRUE; + else if (strcmp(argv[i], "-iglx") == 0) + enableIndirectGLX = FALSE; else if ((skip = XkbProcessArguments(argc, argv, i)) != 0) { if (skip > 0) i += skip - 1; diff --git a/xorg-server/randr/randr.c b/xorg-server/randr/randr.c index 3c97714d8..6e3f14b4e 100644 --- a/xorg-server/randr/randr.c +++ b/xorg-server/randr/randr.c @@ -679,7 +679,7 @@ static int SProcRRDispatch(ClientPtr client) { REQUEST(xReq); - if (stuff->data >= RRNumberRequests || !ProcRandrVector[stuff->data]) + if (stuff->data >= RRNumberRequests || !SProcRandrVector[stuff->data]) return BadRequest; return (*SProcRandrVector[stuff->data]) (client); } diff --git a/xorg-server/randr/rrprovider.c b/xorg-server/randr/rrprovider.c index 3ce7d75b0..4507ba894 100644 --- a/xorg-server/randr/rrprovider.c +++ b/xorg-server/randr/rrprovider.c @@ -285,7 +285,7 @@ ProcRRSetProviderOutputSource(ClientPtr client) RRProviderPtr provider, source_provider = NULL; ScreenPtr pScreen; - REQUEST_AT_LEAST_SIZE(xRRSetProviderOutputSourceReq); + REQUEST_SIZE_MATCH(xRRSetProviderOutputSourceReq); VERIFY_RR_PROVIDER(stuff->provider, provider, DixReadAccess); @@ -320,7 +320,7 @@ ProcRRSetProviderOffloadSink(ClientPtr client) RRProviderPtr provider, sink_provider = NULL; ScreenPtr pScreen; - REQUEST_AT_LEAST_SIZE(xRRSetProviderOffloadSinkReq); + REQUEST_SIZE_MATCH(xRRSetProviderOffloadSinkReq); VERIFY_RR_PROVIDER(stuff->provider, provider, DixReadAccess); if (!(provider->capabilities & RR_Capability_SourceOffload)) diff --git a/xorg-server/randr/rrsdispatch.c b/xorg-server/randr/rrsdispatch.c index 9968c7f81..08c3b6abe 100644 --- a/xorg-server/randr/rrsdispatch.c +++ b/xorg-server/randr/rrsdispatch.c @@ -434,6 +434,133 @@ SProcRRGetOutputPrimary(ClientPtr client) return ProcRandrVector[stuff->randrReqType] (client); } +static int SProcRRGetProviders(ClientPtr client) +{ + REQUEST(xRRGetProvidersReq); + + REQUEST_SIZE_MATCH(xRRGetProvidersReq); + swaps(&stuff->length); + swapl(&stuff->window); + return ProcRandrVector[stuff->randrReqType] (client); +} + +static int SProcRRGetProviderInfo(ClientPtr client) +{ + REQUEST(xRRGetProviderInfoReq); + + REQUEST_SIZE_MATCH(xRRGetProviderInfoReq); + swaps(&stuff->length); + swapl(&stuff->provider); + swapl(&stuff->configTimestamp); + return ProcRandrVector[stuff->randrReqType] (client); +} + +static int SProcRRSetProviderOffloadSink(ClientPtr client) +{ + REQUEST(xRRSetProviderOffloadSinkReq); + + REQUEST_SIZE_MATCH(xRRSetProviderOffloadSinkReq); + swaps(&stuff->length); + swapl(&stuff->provider); + swapl(&stuff->sink_provider); + swapl(&stuff->configTimestamp); + return ProcRandrVector[stuff->randrReqType] (client); +} + +static int SProcRRSetProviderOutputSource(ClientPtr client) +{ + REQUEST(xRRSetProviderOutputSourceReq); + + REQUEST_SIZE_MATCH(xRRSetProviderOutputSourceReq); + swaps(&stuff->length); + swapl(&stuff->provider); + swapl(&stuff->source_provider); + swapl(&stuff->configTimestamp); + return ProcRandrVector[stuff->randrReqType] (client); +} + +static int SProcRRListProviderProperties(ClientPtr client) +{ + REQUEST(xRRListProviderPropertiesReq); + + REQUEST_SIZE_MATCH(xRRListProviderPropertiesReq); + swaps(&stuff->length); + swapl(&stuff->provider); + return ProcRandrVector[stuff->randrReqType] (client); +} + +static int SProcRRQueryProviderProperty(ClientPtr client) +{ + REQUEST(xRRQueryProviderPropertyReq); + + REQUEST_SIZE_MATCH(xRRQueryProviderPropertyReq); + swaps(&stuff->length); + swapl(&stuff->provider); + swapl(&stuff->property); + return ProcRandrVector[stuff->randrReqType] (client); +} + +static int SProcRRConfigureProviderProperty(ClientPtr client) +{ + REQUEST(xRRConfigureProviderPropertyReq); + + REQUEST_AT_LEAST_SIZE(xRRConfigureProviderPropertyReq); + swaps(&stuff->length); + swapl(&stuff->provider); + swapl(&stuff->property); + /* TODO: no way to specify format? */ + SwapRestL(stuff); + return ProcRandrVector[stuff->randrReqType] (client); +} + +static int SProcRRChangeProviderProperty(ClientPtr client) +{ + REQUEST(xRRChangeProviderPropertyReq); + + REQUEST_AT_LEAST_SIZE(xRRChangeProviderPropertyReq); + swaps(&stuff->length); + swapl(&stuff->provider); + swapl(&stuff->property); + swapl(&stuff->type); + swapl(&stuff->nUnits); + switch (stuff->format) { + case 8: + break; + case 16: + SwapRestS(stuff); + break; + case 32: + SwapRestL(stuff); + break; + } + return ProcRandrVector[stuff->randrReqType] (client); +} + +static int SProcRRDeleteProviderProperty(ClientPtr client) +{ + REQUEST(xRRDeleteProviderPropertyReq); + + REQUEST_SIZE_MATCH(xRRDeleteProviderPropertyReq); + swaps(&stuff->length); + swapl(&stuff->provider); + swapl(&stuff->property); + return ProcRandrVector[stuff->randrReqType] (client); +} + +static int SProcRRGetProviderProperty(ClientPtr client) +{ + REQUEST(xRRGetProviderPropertyReq); + + REQUEST_SIZE_MATCH(xRRGetProviderPropertyReq); + swaps(&stuff->length); + swapl(&stuff->provider); + swapl(&stuff->property); + swapl(&stuff->type); + swapl(&stuff->longOffset); + swapl(&stuff->longLength); + return ProcRandrVector[stuff->randrReqType] (client); +} + int (*SProcRandrVector[RRNumberRequests]) (ClientPtr) = { SProcRRQueryVersion, /* 0 */ /* we skip 1 to make old clients fail pretty immediately */ @@ -472,4 +599,15 @@ int (*SProcRandrVector[RRNumberRequests]) (ClientPtr) = { SProcRRSetPanning, /* 29 */ SProcRRSetOutputPrimary, /* 30 */ SProcRRGetOutputPrimary, /* 31 */ +/* V1.4 additions */ + SProcRRGetProviders, /* 32 */ + SProcRRGetProviderInfo, /* 33 */ + SProcRRSetProviderOffloadSink, /* 34 */ + SProcRRSetProviderOutputSource, /* 35 */ + SProcRRListProviderProperties, /* 36 */ + SProcRRQueryProviderProperty, /* 37 */ + SProcRRConfigureProviderProperty, /* 38 */ + SProcRRChangeProviderProperty, /* 39 */ + SProcRRDeleteProviderProperty, /* 40 */ + SProcRRGetProviderProperty, /* 41 */ }; diff --git a/xorg-server/render/render.c b/xorg-server/render/render.c index 3b7151a69..9ac4a98e7 100644 --- a/xorg-server/render/render.c +++ b/xorg-server/render/render.c @@ -638,7 +638,7 @@ ProcRenderSetPictureClipRectangles(ClientPtr client) REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq); VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess); if (!pPicture->pDrawable) - return BadDrawable; + return RenderErrBase + BadPicture; nr = (client->req_len << 2) - sizeof(xRenderSetPictureClipRectanglesReq); if (nr & 4) diff --git a/xorg-server/test/.gitignore b/xorg-server/test/.gitignore index acbda7a57..a62fc3d70 100644 --- a/xorg-server/test/.gitignore +++ b/xorg-server/test/.gitignore @@ -4,9 +4,12 @@ input list misc os +sdksyms.c string touch xfree86 xkb xtest signal-logging +*.log +*.trs diff --git a/xorg-server/test/Makefile.am b/xorg-server/test/Makefile.am index 3ad24d9ec..32edc7a3b 100644 --- a/xorg-server/test/Makefile.am +++ b/xorg-server/test/Makefile.am @@ -41,7 +41,7 @@ os_LDADD=$(TEST_LDADD) libxservertest_la_LIBADD = $(XSERVER_LIBS) if XORG -nodist_libxservertest_la_SOURCES = $(top_builddir)/hw/xfree86/sdksyms.c +nodist_libxservertest_la_SOURCES = sdksyms.c libxservertest_la_LIBADD += \ $(top_builddir)/hw/xfree86/loader/libloader.la \ $(top_builddir)/hw/xfree86/os-support/libxorgos.la \ @@ -55,6 +55,12 @@ libxservertest_la_LIBADD += \ $(top_builddir)/hw/xfree86/dixmods/libxorgxkb.la \ @XORG_LIBS@ +BUILT_SOURCES = sdksyms.c +CLEANFILES = sdksyms.c + +sdksyms.c: $(top_builddir)/hw/xfree86/sdksyms.c + $(AM_V_GEN)$(LN_S) $(top_builddir)/hw/xfree86/sdksyms.c + if DRI libxservertest_la_LIBADD += $(top_builddir)/hw/xfree86/dri/libdri.la endif diff --git a/xorg-server/test/signal-logging.c b/xorg-server/test/signal-logging.c index 88b37c14e..432012195 100644 --- a/xorg-server/test/signal-logging.c +++ b/xorg-server/test/signal-logging.c @@ -178,9 +178,14 @@ static void logging_format(void) LogInit(log_file_path, NULL); assert(f = fopen(log_file_path, "r")); -#define read_log_msg(msg) \ - fgets(read_buf, sizeof(read_buf), f); \ - msg = strchr(read_buf, ']') + 2; /* advance past [time.stamp] */ +#define read_log_msg(msg) do { \ + msg = fgets(read_buf, sizeof(read_buf), f); \ + assert(msg != NULL); \ + msg = strchr(read_buf, ']'); \ + assert(msg != NULL); \ + assert(strlen(msg) > 2); \ + msg = msg + 2; /* advance past [time.stamp] */ \ + } while (0) /* boring test message */ LogMessageVerbSigSafe(X_ERROR, -1, "test message\n"); diff --git a/xorg-server/xfixes/region.c b/xorg-server/xfixes/region.c index cc8f1a5ef..f9de52542 100644 --- a/xorg-server/xfixes/region.c +++ b/xorg-server/xfixes/region.c @@ -269,6 +269,9 @@ ProcXFixesCreateRegionFromPicture(ClientPtr client) VERIFY_PICTURE(pPicture, stuff->picture, client, DixGetAttrAccess); + if (!pPicture->pDrawable) + return RenderErrBase + BadPicture; + switch (pPicture->clientClipType) { case CT_PIXMAP: pRegion = BitmapToRegion(pPicture->pDrawable->pScreen, @@ -750,6 +753,9 @@ ProcXFixesSetPictureClipRegion(ClientPtr client) VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess); VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixReadAccess); + if (!pPicture->pDrawable) + return RenderErrBase + BadPicture; + return SetPictureClipRegion(pPicture, stuff->xOrigin, stuff->yOrigin, pRegion); } diff --git a/xorg-server/xkb/xkmread.c b/xorg-server/xkb/xkmread.c index 258bb91b5..b6241b5c7 100644 --- a/xorg-server/xkb/xkmread.c +++ b/xorg-server/xkb/xkmread.c @@ -1204,7 +1204,8 @@ XkmReadTOC(FILE * file, xkmFileInfo * file_info, int max_toc, } return 0; } - fread(file_info, SIZEOF(xkmFileInfo), 1, file); + if (fread(file_info, SIZEOF(xkmFileInfo), 1, file) != 1) + return 0; size_toc = file_info->num_toc; if (size_toc > max_toc) { DebugF("Warning! Too many TOC entries; last %d ignored\n", @@ -1212,7 +1213,8 @@ XkmReadTOC(FILE * file, xkmFileInfo * file_info, int max_toc, size_toc = max_toc; } for (i = 0; i < size_toc; i++) { - fread(&toc[i], SIZEOF(xkmSectionInfo), 1, file); + if (fread(&toc[i], SIZEOF(xkmSectionInfo), 1, file) != 1) + return 0; } return 1; } diff --git a/xorg-server/xkeyboard-config/rules/base.xml.in b/xorg-server/xkeyboard-config/rules/base.xml.in index c924edf6d..59b03c338 100644 --- a/xorg-server/xkeyboard-config/rules/base.xml.in +++ b/xorg-server/xkeyboard-config/rules/base.xml.in @@ -3905,7 +3905,7 @@ <variant> <configItem> <name>cyrillicyz</name> - <_description>Montenegrin (Cyrillic, Z and ZHE swapped)</_description> + <_description>Montenegrin (Cyrillic, ZE and ZHE swapped)</_description> </configItem> </variant> <variant> diff --git a/xorg-server/xkeyboard-config/symbols/fi b/xorg-server/xkeyboard-config/symbols/fi index 1818243dd..1bf9ff074 100644 --- a/xorg-server/xkeyboard-config/symbols/fi +++ b/xorg-server/xkeyboard-config/symbols/fi @@ -101,8 +101,7 @@ xkb_symbols "classic" { partial alphanumeric_keys hidden xkb_symbols "fi" { - // Classic Finnish keyboard layout with dead keys support - // and all ISO-8859-1 and ISO-8859-15 characters available + // Classic Finnish keyboard layout with dead keys key <TLDE> { [ section, onehalf, onequarter, threequarters ] }; key <AE01> { [ 1, exclam, exclamdown, onesuperior ] }; @@ -112,8 +111,8 @@ xkb_symbols "fi" { key <AE05> { [ 5, percent, EuroSign, masculine ] }; key <AE06> { [ 6, ampersand, yen, ordfeminine ] }; key <AE07> { [ 7, slash, braceleft, plusminus ] }; - key <AE08> { [ 8, parenleft, bracketleft, guillemotleft ] }; - key <AE09> { [ 9, parenright, bracketright, guillemotright ] }; + key <AE08> { [ 8, parenleft, bracketleft, less ] }; + key <AE09> { [ 9, parenright, bracketright, greater ] }; key <AE10> { [ 0, equal, braceright, degree ] }; key <AE11> { [ plus, question, backslash, questiondown ] }; key <AE12> { [ dead_acute, dead_grave, dead_cedilla, dead_ogonek ] }; @@ -205,9 +204,10 @@ xkb_symbols "mac" { name[Group1]="Finnish (Macintosh)"; }; -// EXTRAS: - partial alphanumeric_keys - xkb_symbols "sun_type6" { - include "sun_vndr/fi(sun_type6)" +xkb_symbols "sun_type6" { + + // Sun Type 6/7 keyboard for Finland + + include "sun_vndr/fi(sun_type6)" }; diff --git a/xorg-server/xkeyboard-config/symbols/hr b/xorg-server/xkeyboard-config/symbols/hr index 61fc39221..cdceea1fe 100644 --- a/xorg-server/xkeyboard-config/symbols/hr +++ b/xorg-server/xkeyboard-config/symbols/hr @@ -4,12 +4,12 @@ xkb_symbols "basic" { include "rs(latin)" name[Group1]="Croatian"; - // Redefine these keys to match XFree86 Croatian layout - key <AE01> { [ 1, exclam, asciitilde, dead_tilde ] }; - key <AE03> { [ 3, numbersign, asciicircum, dead_circumflex ] }; - key <AE05> { [ 5, percent, degree, dead_abovering ] }; - key <AE07> { [ 7, slash, grave, dead_grave ] }; - key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] }; + // Redefine these keys to match the XFree86 Croatian layout. + key <AE01> { [ 1, exclam, asciitilde, dead_tilde ] }; + key <AE03> { [ 3, numbersign, asciicircum, dead_circumflex ] }; + key <AE05> { [ 5, percent, degree, dead_abovering ] }; + key <AE07> { [ 7, slash, grave, dead_grave ] }; + key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] }; }; partial alphanumeric_keys @@ -18,28 +18,28 @@ xkb_symbols "us" { include "us" name[Group1]= "Croatian (US keyboard with Croatian letters)"; - key <AD01> { [ any, any, backslash ] }; - key <AD02> { [ any, any, bar ] }; - key <AD03> { [ any, any, EuroSign ] }; - key <AD06> { [ any, any, z, Z ] }; - key <AD11> { [ any, any, scaron, Scaron ] }; - key <AD12> { [ any, any, dstroke, Dstroke ] }; - key <AC04> { [ any, any, bracketleft ] }; - key <AC05> { [ any, any, bracketright ] }; - key <AC08> { [ any, any, lstroke ] }; - key <AC09> { [ any, any, Lstroke ] }; - key <AC10> { [ any, any, ccaron, Ccaron ] }; - key <AC11> { [ any, any, cacute, Cacute ] }; - key <LSGT> { [ any, any, bar ] }; - key <AB01> { [ any, any, y, Y ] }; - key <AB04> { [ any, any, at ] }; - key <AB05> { [ any, any, braceleft ] }; - key <AB06> { [ any, any, braceright ] }; - key <AB07> { [ any, any, section ] }; - key <AB08> { [ any, any, semicolon ] }; - key <AB09> { [ any, any, colon ] }; - key <AB10> { [ any, any, minus, underscore ] }; - key <BKSL> { [ any, any, zcaron, Zcaron ] }; + key <AD01> { [ any, any, backslash ] }; + key <AD02> { [ any, any, bar ] }; + key <AD03> { [ any, any, EuroSign ] }; + key <AD06> { [ any, any, z, Z ] }; + key <AD11> { [ any, any, scaron, Scaron ] }; + key <AD12> { [ any, any, dstroke, Dstroke ] }; + key <AC04> { [ any, any, bracketleft ] }; + key <AC05> { [ any, any, bracketright ] }; + key <AC08> { [ any, any, lstroke ] }; + key <AC09> { [ any, any, Lstroke ] }; + key <AC10> { [ any, any, ccaron, Ccaron ] }; + key <AC11> { [ any, any, cacute, Cacute ] }; + key <LSGT> { [ any, any, bar ] }; + key <AB01> { [ any, any, y, Y ] }; + key <AB04> { [ any, any, at ] }; + key <AB05> { [ any, any, braceleft ] }; + key <AB06> { [ any, any, braceright ] }; + key <AB07> { [ any, any, section ] }; + key <AB08> { [ any, any, semicolon ] }; + key <AB09> { [ any, any, colon ] }; + key <AB10> { [ any, any, minus, underscore ] }; + key <BKSL> { [ any, any, zcaron, Zcaron ] }; include "level3(ralt_switch)" }; diff --git a/xorg-server/xkeyboard-config/symbols/jp b/xorg-server/xkeyboard-config/symbols/jp index f0b2c4d75..26dfdf9bd 100644 --- a/xorg-server/xkeyboard-config/symbols/jp +++ b/xorg-server/xkeyboard-config/symbols/jp @@ -131,7 +131,7 @@ xkb_symbols "kana86" { name[Group1]= "Japanese (Kana 86)"; key <ESC> { [ Escape ] }; - key <NMLK> { [ Num_Lock, Pointer_EnableKeys ] }; + key <NMLK> { [ Num_Lock ] }; key <BKSP> { [ BackSpace ] }; key <TAB> { [ Tab, ISO_Left_Tab ] }; key <RTRN> { [ Return ] }; diff --git a/xorg-server/xkeyboard-config/symbols/keypad b/xorg-server/xkeyboard-config/symbols/keypad index 9b49a5773..0187ecbeb 100644 --- a/xorg-server/xkeyboard-config/symbols/keypad +++ b/xorg-server/xkeyboard-config/symbols/keypad @@ -211,7 +211,7 @@ xkb_symbols "core" { modifier_map Mod2 { Num_Lock }; - key <NMLK> { [ Num_Lock, Pointer_EnableKeys ] }; + key <NMLK> { [ Num_Lock ] }; key <KPEN> { [ KP_Enter ] }; key <KPEQ> { [ KP_Equal ] }; }; diff --git a/xorg-server/xkeyboard-config/symbols/me b/xorg-server/xkeyboard-config/symbols/me index acb37e76d..1ada63493 100644 --- a/xorg-server/xkeyboard-config/symbols/me +++ b/xorg-server/xkeyboard-config/symbols/me @@ -21,7 +21,7 @@ xkb_symbols "cyrillic" { partial alphanumeric_keys xkb_symbols "cyrillicyz" { include "rs(yz)" - name[Group1]= "Montenegrin (Cyrillic, Z and ZHE swapped)"; + name[Group1]= "Montenegrin (Cyrillic, ZE and ZHE swapped)"; }; partial alphanumeric_keys diff --git a/xorg-server/xkeyboard-config/symbols/rs b/xorg-server/xkeyboard-config/symbols/rs index 06025e17e..c39f4ed49 100644 --- a/xorg-server/xkeyboard-config/symbols/rs +++ b/xorg-server/xkeyboard-config/symbols/rs @@ -1,342 +1,331 @@ -// Bosnian, Croatian, Serbian and Slovenian XKB keyboard mapping -// (derived from "Danube" D.2) +// Bosnian, Croatian, Serbian and Slovenian XKB keyboard mappings. // -// Danube D.2 from 2003-05-12 is available at http://srpski.org/dunav/ +// Derived from "Danube" D.2 from 2003-05-12, +// which is available at http://srpski.org/dunav/. // // Original authors: // Danilo Segan (Данило Шеган) <danilo@kvota.net> // Chusslove Illich (Часлав Илић) <caslav.ilic@gmx.net> // // Danilo Segan <danilo@kvota.net>: -// - Modified for inclusion in XFree86 -// - Further modifications on 2005-08-18 to support Bosnian, Croatian -// and Slovenian in xkeyboard-config -// +// - Modified for inclusion in XFree86. +// - Further modifications on 2005-08-18 to support Bosnian, +// Croatian and Slovenian in xkeyboard-config. default partial alphanumeric_keys xkb_symbols "basic" { - name[Group1]= "Serbian"; + name[Group1]= "Serbian"; - include "rs(cyrlevel3)" - include "rs(common)" - include "rs(cyralpha)" - include "level3(ralt_switch)" + include "rs(cyrlevel3)" + include "rs(common)" + include "rs(cyralpha)" + include "level3(ralt_switch)" }; - partial alphanumeric_keys xkb_symbols "latin" { - name[Group1]= "Serbian (Latin)"; + name[Group1]= "Serbian (Latin)"; - include "latin(type3)" - include "rs(latalpha)" - include "rs(latlevel3)" - include "rs(common)" - include "level3(ralt_switch)" + include "latin(type3)" + include "rs(latalpha)" + include "rs(latlevel3)" + include "rs(common)" + include "level3(ralt_switch)" }; - partial alphanumeric_keys xkb_symbols "yz" { - include "rs(basic)" - name[Group1]= "Serbian (Cyrillic, ZE and ZHE swapped)"; + include "rs(basic)" + name[Group1]= "Serbian (Cyrillic, ZE and ZHE swapped)"; - key <AD06> { [ Cyrillic_zhe, Cyrillic_ZHE, any,any ] }; // y - key <AB01> { [ Cyrillic_ze, Cyrillic_ZE, any,any ] }; // z + key <AD06> { [ Cyrillic_zhe, Cyrillic_ZHE, any, any ] }; // y + key <AB01> { [ Cyrillic_ze, Cyrillic_ZE, any, any ] }; // z }; partial hidden alphanumeric_keys xkb_symbols "common" { - // "Common" keys: keys which are same for both latin and cyrillic keyboards - - key.type[Group1] = "FOUR_LEVEL"; - - key <TLDE> { [ grave, asciitilde, any,any ] }; // - key <AE01> { [ 1, exclam, any,any ] }; // - key <AE02> { [ 2, quotedbl, any,any ] }; // - key <AE03> { [ 3, numbersign, any,any ] }; // - key <AE04> { [ 4, dollar, any,any ] }; // - key <AE05> { [ 5, percent, any,any ] }; // - key <AE06> { [ 6, ampersand, any,any ] }; // - key <AE07> { [ 7, slash, any,any ] }; // - key <AE08> { [ 8, parenleft, any,any ] }; // - key <AE09> { [ 9, parenright, any,any ] }; // - key <AE10> { [ 0, equal, any,any ] }; // - key <AE11> { [ apostrophe, question, any,any ] }; // - key <AE12> { [ plus, asterisk, any,any ] }; // - - key <AB08> { [ comma, semicolon, any,any ] }; // - key <AB09> { [ period, colon, any,any ] }; // - key <AB10> { [ minus, underscore, any,any ] }; // - - include "kpdl(comma)" + // "Common" keys: keys that are the same + // for both latin and cyrillic keyboards. + + key.type[Group1] = "FOUR_LEVEL"; + + key <TLDE> { [ grave, asciitilde, any, any ] }; + key <AE01> { [ 1, exclam, any, any ] }; + key <AE02> { [ 2, quotedbl, any, any ] }; + key <AE03> { [ 3, numbersign, any, any ] }; + key <AE04> { [ 4, dollar, any, any ] }; + key <AE05> { [ 5, percent, any, any ] }; + key <AE06> { [ 6, ampersand, any, any ] }; + key <AE07> { [ 7, slash, any, any ] }; + key <AE08> { [ 8, parenleft, any, any ] }; + key <AE09> { [ 9, parenright, any, any ] }; + key <AE10> { [ 0, equal, any, any ] }; + key <AE11> { [ apostrophe, question, any, any ] }; + key <AE12> { [ plus, asterisk, any, any ] }; + + key <AB08> { [ comma, semicolon, any, any ] }; + key <AB09> { [ period, colon, any, any ] }; + key <AB10> { [ minus, underscore, any, any ] }; + + include "kpdl(comma)" }; partial hidden alphanumeric_keys xkb_symbols "cyralpha" { - key.type[Group1] = "FOUR_LEVEL_ALPHABETIC"; - - key <AD01> { [ Cyrillic_lje, Cyrillic_LJE, any,any ] }; // q - key <AD02> { [ Cyrillic_nje, Cyrillic_NJE, any,any ] }; // w - key <AD03> { [ Cyrillic_ie, Cyrillic_IE, any,any ] }; // e - key <AD04> { [ Cyrillic_er, Cyrillic_ER, any,any ] }; // r - key <AD05> { [ Cyrillic_te, Cyrillic_TE, any,any ] }; // t - key <AD06> { [ Cyrillic_ze, Cyrillic_ZE, any,any ] }; // y - key <AD07> { [ Cyrillic_u, Cyrillic_U, any,any ] }; // u - key <AD08> { [ Cyrillic_i, Cyrillic_I, any,any ] }; // i - key <AD09> { [ Cyrillic_o, Cyrillic_O, any,any ] }; // o - key <AD10> { [ Cyrillic_pe, Cyrillic_PE, any,any ] }; // p - key <AD11> { [ Cyrillic_sha, Cyrillic_SHA, any,any ] }; // [ { - key <AD12> { [ Serbian_dje, Serbian_DJE, any,any ] }; // ] } - - key <AC01> { [ Cyrillic_a, Cyrillic_A, any,any ] }; // a - key <AC02> { [ Cyrillic_es, Cyrillic_ES, any,any ] }; // s - key <AC03> { [ Cyrillic_de, Cyrillic_DE, any,any ] }; // d - key <AC04> { [ Cyrillic_ef, Cyrillic_EF, any,any ] }; // f - key <AC05> { [ Cyrillic_ghe, Cyrillic_GHE, any,any ] }; // g - key <AC06> { [ Cyrillic_ha, Cyrillic_HA, any,any ] }; // h - key <AC07> { [ Cyrillic_je, Cyrillic_JE, any,any ] }; // j - key <AC08> { [ Cyrillic_ka, Cyrillic_KA, any,any ] }; // k - key <AC09> { [ Cyrillic_el, Cyrillic_EL, any,any ] }; // l - key <AC10> { [ Cyrillic_che, Cyrillic_CHE, any,any ] }; // ; : - key <AC11> { [ Serbian_tshe, Serbian_TSHE, any,any ] }; // ' " - key <BKSL> { [ Cyrillic_zhe, Cyrillic_ZHE, any,any ] }; // \ | - - key <AB01> { [ Cyrillic_zhe, Cyrillic_ZHE, any,any ] }; // z - key <AB02> { [ Cyrillic_dzhe, Cyrillic_DZHE, any,any ] }; // x - key <AB03> { [ Cyrillic_tse, Cyrillic_TSE, any,any ] }; // c - key <AB04> { [ Cyrillic_ve, Cyrillic_VE, any,any ] }; // v - key <AB05> { [ Cyrillic_be, Cyrillic_BE, any,any ] }; // b - key <AB06> { [ Cyrillic_en, Cyrillic_EN, any,any ] }; // n - key <AB07> { [ Cyrillic_em, Cyrillic_EM, any,any ] }; // m + key.type[Group1] = "FOUR_LEVEL_ALPHABETIC"; + + key <AD01> { [ Cyrillic_lje, Cyrillic_LJE, any, any ] }; // q + key <AD02> { [ Cyrillic_nje, Cyrillic_NJE, any, any ] }; // w + key <AD03> { [ Cyrillic_ie, Cyrillic_IE, any, any ] }; // e + key <AD04> { [ Cyrillic_er, Cyrillic_ER, any, any ] }; // r + key <AD05> { [ Cyrillic_te, Cyrillic_TE, any, any ] }; // t + key <AD06> { [ Cyrillic_ze, Cyrillic_ZE, any, any ] }; // y + key <AD07> { [ Cyrillic_u, Cyrillic_U, any, any ] }; // u + key <AD08> { [ Cyrillic_i, Cyrillic_I, any, any ] }; // i + key <AD09> { [ Cyrillic_o, Cyrillic_O, any, any ] }; // o + key <AD10> { [ Cyrillic_pe, Cyrillic_PE, any, any ] }; // p + key <AD11> { [ Cyrillic_sha, Cyrillic_SHA, any, any ] }; // [ { + key <AD12> { [ Serbian_dje, Serbian_DJE, any, any ] }; // ] } + + key <AC01> { [ Cyrillic_a, Cyrillic_A, any, any ] }; // a + key <AC02> { [ Cyrillic_es, Cyrillic_ES, any, any ] }; // s + key <AC03> { [ Cyrillic_de, Cyrillic_DE, any, any ] }; // d + key <AC04> { [ Cyrillic_ef, Cyrillic_EF, any, any ] }; // f + key <AC05> { [ Cyrillic_ghe, Cyrillic_GHE, any, any ] }; // g + key <AC06> { [ Cyrillic_ha, Cyrillic_HA, any, any ] }; // h + key <AC07> { [ Cyrillic_je, Cyrillic_JE, any, any ] }; // j + key <AC08> { [ Cyrillic_ka, Cyrillic_KA, any, any ] }; // k + key <AC09> { [ Cyrillic_el, Cyrillic_EL, any, any ] }; // l + key <AC10> { [ Cyrillic_che, Cyrillic_CHE, any, any ] }; // ; : + key <AC11> { [ Serbian_tshe, Serbian_TSHE, any, any ] }; // ' " + key <BKSL> { [ Cyrillic_zhe, Cyrillic_ZHE, any, any ] }; // \ | + + key <AB01> { [ Cyrillic_zhe, Cyrillic_ZHE, any, any ] }; // z + key <AB02> { [ Cyrillic_dzhe, Cyrillic_DZHE, any, any ] }; // x + key <AB03> { [ Cyrillic_tse, Cyrillic_TSE, any, any ] }; // c + key <AB04> { [ Cyrillic_ve, Cyrillic_VE, any, any ] }; // v + key <AB05> { [ Cyrillic_be, Cyrillic_BE, any, any ] }; // b + key <AB06> { [ Cyrillic_en, Cyrillic_EN, any, any ] }; // n + key <AB07> { [ Cyrillic_em, Cyrillic_EM, any, any ] }; // m }; partial hidden alphanumeric_keys xkb_symbols "latalpha" { - key.type[Group1] = "FOUR_LEVEL_ALPHABETIC"; + key.type[Group1] = "FOUR_LEVEL_ALPHABETIC"; - key <AD11> { [ scaron, Scaron, any,any ] }; // - key <AD12> { [ dstroke, Dstroke, any,any ] }; // - - key <AC10> { [ ccaron, Ccaron, any,any ] }; // - key <AC11> { [ cacute, Cacute, any,any ] }; // - key <BKSL> { [ zcaron, Zcaron, any,any ] }; // + key <AD11> { [ scaron, Scaron, any, any ] }; // [ { + key <AD12> { [ dstroke, Dstroke, any, any ] }; // ] } + key <AC10> { [ ccaron, Ccaron, any, any ] }; // ; : + key <AC11> { [ cacute, Cacute, any, any ] }; // ' " + key <BKSL> { [ zcaron, Zcaron, any, any ] }; // \ | }; partial hidden alphanumeric_keys xkb_symbols "twoletter" { - // These are letters which are written in latin transcription with two-characters. - key <AD01> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC", - [ U1C9, U1C8, any, U1C7 ] }; // q - key <AD02> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC", - [ U1CC, U1CB, any, U1CA ] }; // w - key <AB02> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC", - [ U1C6, U1C5, any, U1C4 ] }; // x + // Letters which are written in latin transcription with two characters. + key <AD01> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC", + [ U1C9, U1C8, any, U1C7 ] }; // q + key <AD02> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC", + [ U1CC, U1CB, any, U1CA ] }; // w + key <AB02> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC", + [ U1C6, U1C5, any, U1C4 ] }; // x - // Also replace letter Y with Zcaron, since Y is of no use any longer - key <AB01> { [ zcaron, Zcaron, any,any ] }; // + // Also replace letter Y with Zcaron, since Y is of no use any longer. + key <AB01> { [ zcaron, Zcaron, any, any ] }; // z }; partial hidden alphanumeric_keys xkb_symbols "latlevel3" { - key <TLDE> { [ any,any, notsign, notsign ] }; // ` ~ - key <AE01> { [ any,any, dead_tilde, asciitilde ] }; // 1 ! - key <AE02> { [ any,any, dead_caron, caron ] }; // 2 @ - key <AE03> { [ any,any, dead_circumflex, asciicircum ] }; // 3 # - key <AE04> { [ any,any, dead_breve, breve ] }; // 4 $ - key <AE05> { [ any,any, dead_abovering, degree ] }; // 5 % - key <AE06> { [ any,any, dead_ogonek, ogonek ] }; // 6 ^ - key <AE07> { [ any,any, dead_grave, grave ] }; // 7 & - key <AE08> { [ any,any, dead_abovedot, abovedot ] }; // 8 * - key <AE09> { [ any,any, dead_acute, apostrophe ] }; // 9 ( - key <AE10> { [ any,any, dead_doubleacute, doubleacute ] }; // 0 ) - key <AE11> { [ any,any, dead_diaeresis, diaeresis ] }; // - _ - key <AE12> { [ any,any, dead_cedilla, cedilla ] }; // = + - - key <AD01> { [ any,any, backslash, Greek_OMEGA ] }; // q - key <AD02> { [ any,any, bar, Lstroke ] }; // w - key <AD03> { [ any,any, EuroSign, EuroSign ] }; // e - key <AD04> { [ any,any, paragraph, registered ] }; // r - key <AD05> { [ any,any, tslash, Tslash ] }; // t // ALPHABETIC - key <AD06> { [ any,any, leftarrow, yen ] }; // y - key <AD07> { [ any,any, downarrow, uparrow ] }; // u - key <AD08> { [ any,any, rightarrow, idotless ] }; // i - key <AD09> { [ any,any, oslash, Ooblique ] }; // o // ALPHABETIC - key <AD10> { [ any,any, thorn, THORN ] }; // p // ALPHABETIC - key <AD11> { [ any,any, division, dead_abovering ] }; // [ - key <AD12> { [ any,any, multiply, dead_macron ] }; // ] - - key <AC01> { [ any,any, ae, AE ] }; // a // ALPHABETIC - key <AC02> { [ any,any, doublelowquotemark, guillemotright ] }; // s - key <AC03> { [ any,any, leftdoublequotemark, guillemotleft ] }; // d - key <AC04> { [ any,any, bracketleft, ordfeminine ] }; // f - key <AC05> { [ any,any, bracketright, ENG ] }; // g - key <AC06> { [ any,any, hstroke, Hstroke ] }; // h // ALPHABETIC - key <AC07> { [ any,any, NoSymbol, NoSymbol ] }; // j - key <AC08> { [ any,any, lstroke, ampersand ] }; // k - key <AC09> { [ any,any, lstroke, Lstroke ] }; // l - key <AC10> { [ any,any, dead_acute, dead_doubleacute ] }; // ; - key <AC11> { [ any,any, ssharp, dead_caron ] }; // ' - key <BKSL> { [ any,any, currency, dead_breve ] }; // \ - - key <AB01> { [ any,any, leftsinglequotemark, guillemotright ] }; // z - key <AB02> { [ any,any, rightsinglequotemark,guillemotleft ] }; // x - key <AB03> { [ any,any, cent, copyright ] }; // c - key <AB04> { [ any,any, at, grave ] }; // v - key <AB05> { [ any,any, braceleft, apostrophe ] }; // b - key <AB06> { [ any,any, braceright, braceright ] }; // n - key <AB07> { [ any,any, asciicircum, masculine ] }; // m - key <AB08> { [ any,any, less, multiply ] }; // , < - key <AB09> { [ any,any, greater, division ] }; // . > - key <AB10> { [ any,any, emdash, endash ] }; // / ? - + key <TLDE> { [ any, any, notsign, notsign ] }; // ` ~ + key <AE01> { [ any, any, dead_tilde, asciitilde ] }; // 1 ! + key <AE02> { [ any, any, dead_caron, caron ] }; // 2 @ + key <AE03> { [ any, any, dead_circumflex, asciicircum ] }; // 3 # + key <AE04> { [ any, any, dead_breve, breve ] }; // 4 $ + key <AE05> { [ any, any, dead_abovering, degree ] }; // 5 % + key <AE06> { [ any, any, dead_ogonek, ogonek ] }; // 6 ^ + key <AE07> { [ any, any, dead_grave, grave ] }; // 7 & + key <AE08> { [ any, any, dead_abovedot, abovedot ] }; // 8 * + key <AE09> { [ any, any, dead_acute, apostrophe ] }; // 9 ( + key <AE10> { [ any, any, dead_doubleacute, doubleacute ] }; // 0 ) + key <AE11> { [ any, any, dead_diaeresis, diaeresis ] }; // - _ + key <AE12> { [ any, any, dead_cedilla, cedilla ] }; // = + + + key <AD01> { [ any, any, backslash, Greek_OMEGA ] }; // q + key <AD02> { [ any, any, bar, Lstroke ] }; // w + key <AD03> { [ any, any, EuroSign, EuroSign ] }; // e + key <AD04> { [ any, any, paragraph, registered ] }; // r + key <AD05> { [ any, any, tslash, Tslash ] }; // t // ALPHABETIC + key <AD06> { [ any, any, leftarrow, yen ] }; // y + key <AD07> { [ any, any, downarrow, uparrow ] }; // u + key <AD08> { [ any, any, rightarrow, idotless ] }; // i + key <AD09> { [ any, any, oslash, Ooblique ] }; // o // ALPHABETIC + key <AD10> { [ any, any, thorn, THORN ] }; // p // ALPHABETIC + key <AD11> { [ any, any, division, dead_abovering ] }; // [ + key <AD12> { [ any, any, multiply, dead_macron ] }; // ] + + key <AC01> { [ any, any, ae, AE ] }; // a // ALPHABETIC + key <AC02> { [ any, any, doublelowquotemark, guillemotright ] }; // s + key <AC03> { [ any, any, leftdoublequotemark, guillemotleft ] }; // d + key <AC04> { [ any, any, bracketleft, ordfeminine ] }; // f + key <AC05> { [ any, any, bracketright, ENG ] }; // g + key <AC06> { [ any, any, hstroke, Hstroke ] }; // h // ALPHABETIC + key <AC07> { [ any, any, NoSymbol, NoSymbol ] }; // j + key <AC08> { [ any, any, lstroke, ampersand ] }; // k + key <AC09> { [ any, any, lstroke, Lstroke ] }; // l + key <AC10> { [ any, any, dead_acute, dead_doubleacute ] }; // ; + key <AC11> { [ any, any, ssharp, dead_caron ] }; // ' + key <BKSL> { [ any, any, currency, dead_breve ] }; // \ + + key <AB01> { [ any, any, leftsinglequotemark, guillemotright ] }; // z + key <AB02> { [ any, any, rightsinglequotemark,guillemotleft ] }; // x + key <AB03> { [ any, any, cent, copyright ] }; // c + key <AB04> { [ any, any, at, grave ] }; // v + key <AB05> { [ any, any, braceleft, apostrophe ] }; // b + key <AB06> { [ any, any, braceright, braceright ] }; // n + key <AB07> { [ any, any, asciicircum, masculine ] }; // m + key <AB08> { [ any, any, less, multiply ] }; // , < + key <AB09> { [ any, any, greater, division ] }; // . > + key <AB10> { [ any, any, emdash, endash ] }; // / ? }; partial hidden alphanumeric_keys xkb_symbols "cyrlevel3" { - key <TLDE> { [ any,any, degree, notsign ] }; // ` ~ - key <AE03> { [ any,any, dead_circumflex, NoSymbol ] }; // 3 # - key <AE07> { [ any,any, dead_grave, NoSymbol ] }; // 7 & - key <AE08> { [ any,any, dead_doublegrave, NoSymbol ] }; // 8 * - key <AE09> { [ any,any, dead_acute, NoSymbol ] }; // 9 ( - key <AE10> { [ any,any, dead_invertedbreve, NoSymbol ] }; // 0 ) - key <AE11> { [ any,any, dead_macron, NoSymbol ] }; // - _ - - key <AD01> { [ any,any, backslash, NoSymbol ] }; // q - key <AD02> { [ any,any, bar, NoSymbol ] }; // w - key <AD03> { [ any,any, EuroSign, sterling ] }; // e - key <AD04> { [ any,any, paragraph, registered ] }; // r - key <AD05> { [ any,any, ellipsis, NoSymbol ] }; // t // ALPHABETIC - key <AD06> { [ any,any, leftarrow, yen ] }; // y - key <AD07> { [ any,any, downarrow, uparrow ] }; // u - key <AD08> { [ any,any, rightarrow, NoSymbol ] }; // i - key <AD09> { [ any,any, section, NoSymbol ] }; // o // ALPHABETIC - key <AD11> { [ any,any, division, NoSymbol ] }; // [ - key <AD12> { [ any,any, multiply, NoSymbol ] }; // ] - - key <AC02> { [ any,any, doublelowquotemark, guillemotright ] }; // s - key <AC03> { [ any,any, leftdoublequotemark, guillemotleft ] }; // d - key <AC04> { [ any,any, bracketleft, NoSymbol ] }; // f - key <AC05> { [ any,any, bracketright, NoSymbol ] }; // g - key <BKSL> { [ any,any, currency, NoSymbol ] }; // \ - - key <AB01> { [ any,any, leftsinglequotemark, NoSymbol ] }; // z - key <AB02> { [ any,any, rightsinglequotemark,NoSymbol ] }; // x - key <AB03> { [ any,any, cent, copyright ] }; // c - key <AB04> { [ any,any, at, NoSymbol ] }; // v - key <AB05> { [ any,any, braceleft, NoSymbol ] }; // b - key <AB06> { [ any,any, braceright, NoSymbol ] }; // n - key <AB07> { [ any,any, asciicircum, NoSymbol ] }; // m - key <AB08> { [ any,any, less, NoSymbol ] }; // , < - key <AB09> { [ any,any, greater, NoSymbol ] }; // . > - key <AB10> { [ any,any, emdash, endash ] }; // / ? + key <TLDE> { [ any, any, degree, notsign ] }; // ` ~ + key <AE03> { [ any, any, dead_circumflex, NoSymbol ] }; // 3 # + key <AE07> { [ any, any, dead_grave, NoSymbol ] }; // 7 & + key <AE08> { [ any, any, dead_doublegrave, NoSymbol ] }; // 8 * + key <AE09> { [ any, any, dead_acute, NoSymbol ] }; // 9 ( + key <AE10> { [ any, any, dead_invertedbreve, NoSymbol ] }; // 0 ) + key <AE11> { [ any, any, dead_macron, NoSymbol ] }; // - _ + + key <AD01> { [ any, any, backslash, NoSymbol ] }; // q + key <AD02> { [ any, any, bar, NoSymbol ] }; // w + key <AD03> { [ any, any, EuroSign, sterling ] }; // e + key <AD04> { [ any, any, paragraph, registered ] }; // r + key <AD05> { [ any, any, ellipsis, NoSymbol ] }; // t // ALPHABETIC + key <AD06> { [ any, any, leftarrow, yen ] }; // y + key <AD07> { [ any, any, downarrow, uparrow ] }; // u + key <AD08> { [ any, any, rightarrow, NoSymbol ] }; // i + key <AD09> { [ any, any, section, NoSymbol ] }; // o // ALPHABETIC + key <AD11> { [ any, any, division, NoSymbol ] }; // [ + key <AD12> { [ any, any, multiply, NoSymbol ] }; // ] + + key <AC02> { [ any, any, doublelowquotemark, guillemotright ] }; // s + key <AC03> { [ any, any, leftdoublequotemark, guillemotleft ] }; // d + key <AC04> { [ any, any, bracketleft, NoSymbol ] }; // f + key <AC05> { [ any, any, bracketright, NoSymbol ] }; // g + key <BKSL> { [ any, any, currency, NoSymbol ] }; // \ + + key <AB01> { [ any, any, leftsinglequotemark, NoSymbol ] }; // z + key <AB02> { [ any, any, rightsinglequotemark,NoSymbol ] }; // x + key <AB03> { [ any, any, cent, copyright ] }; // c + key <AB04> { [ any, any, at, NoSymbol ] }; // v + key <AB05> { [ any, any, braceleft, NoSymbol ] }; // b + key <AB06> { [ any, any, braceright, NoSymbol ] }; // n + key <AB07> { [ any, any, asciicircum, NoSymbol ] }; // m + key <AB08> { [ any, any, less, NoSymbol ] }; // , < + key <AB09> { [ any, any, greater, NoSymbol ] }; // . > + key <AB10> { [ any, any, emdash, endash ] }; // / ? }; partial alphanumeric_keys xkb_symbols "latinunicode" { - // This mapping supports the Unicode characters 0x1c4-0x1cc (dz, lj, and nj - // as single character). You get the title form with AltGr+Shift. + // This mapping supports the Unicode characters 0x1c4-0x1cc (dz, lj, and nj + // as single character). You get the title form with AltGr+Shift. - include "rs(latin)" + include "rs(latin)" + name[Group1]= "Serbian (Latin Unicode)"; - name[Group1]= "Serbian (Latin Unicode)"; - - include "rs(twoletter)" + include "rs(twoletter)" }; partial alphanumeric_keys xkb_symbols "latinyz" { - // For those who insist on using "english-position" Z and Y. - - include "rs(latin)" + // For those who insist on using "english-position" Z and Y. - name[Group1]= "Serbian (Latin qwerty)"; + include "rs(latin)" + name[Group1]= "Serbian (Latin qwerty)"; - key <AD06> { [ y, Y, any,any ] }; // y - key <AB01> { [ z, Z, any,any ] }; // z + key <AD06> { [ y, Y, any, any ] }; // y + key <AB01> { [ z, Z, any, any ] }; // z }; partial alphanumeric_keys xkb_symbols "latinunicodeyz" { - // Unicode, ZHE and Z swapped. - - include "rs(latinunicode)" + // Unicode, ZHE and Z swapped. - name[Group1]= "Serbian (Latin Unicode qwerty)"; + include "rs(latinunicode)" + name[Group1]= "Serbian (Latin Unicode qwerty)"; - key <AD06> { [ zcaron, Zcaron, any,any ] }; // y - key <AB01> { [ z, Z, any,any ] }; // z + key <AD06> { [ zcaron, Zcaron, any, any ] }; // y + key <AB01> { [ z, Z, any, any ] }; // z }; xkb_symbols "alternatequotes" { - // Another acceptable »pair of quotes« for Serbian + // Another acceptable »pair of quotes« for Serbian. - include "rs(basic)" + include "rs(basic)" + name[Group1]= "Serbian (Cyrillic with guillemets)"; - name[Group1]= "Serbian (Cyrillic with guillemets)"; - - key <AC02> { [ any,any, guillemotright, NoSymbol ] }; // s - key <AC03> { [ any,any, guillemotleft, NoSymbol ] }; // d + key <AC02> { [ any, any, guillemotright, NoSymbol ] }; // s + key <AC03> { [ any, any, guillemotleft, NoSymbol ] }; // d }; xkb_symbols "latinalternatequotes" { - // Another acceptable »pair of quotes« for Serbian - - include "rs(latin)" + // Another acceptable »pair of quotes« for Serbian. - name[Group1]= "Serbian (Latin with guillemets)"; + include "rs(latin)" + name[Group1]= "Serbian (Latin with guillemets)"; - key <AC02> { [ any,any, guillemotright, NoSymbol ] }; // s - key <AC03> { [ any,any, guillemotleft, NoSymbol ] }; // d + key <AC02> { [ any, any, guillemotright, NoSymbol ] }; // s + key <AC03> { [ any, any, guillemotleft, NoSymbol ] }; // d }; xkb_symbols "rue" { - // Layout for Pannonian Rusyn (spoken mainly in Serbia and - // Croatia by the Rusyn people), based on Serbian Cyrillic layout. - // Authors: - // Ljubomir J. Papuga (Любомир Я. Папуґа) <papuga@zoho.com> - // Mihajlo Hornjak <smeceiotpad@gmail.com> - - include "rs(basic)" + // Layout for Pannonian Rusyn (spoken mainly in Serbia and Croatia + // by the Rusyn people), based on Serbian Cyrillic layout. + // Authors: + // Ljubomir J. Papuga (Любомир Я. Папуґа) <papuga@zoho.com> + // Mihajlo Hornjak <smeceiotpad@gmail.com> - name[Group1]= "Pannonian Rusyn"; + include "rs(basic)" + name[Group1]= "Pannonian Rusyn"; - key <TLDE> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; // ` + key <TLDE> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; // ` - key <AD01> { [ Cyrillic_ya, Cyrillic_YA ] }; // q - key <AD02> { [ Ukrainian_ie, Ukrainian_IE ] }; // w - key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; // ] + key <AD01> { [ Cyrillic_ya, Cyrillic_YA ] }; // q + key <AD02> { [ Ukrainian_ie, Ukrainian_IE ] }; // w + key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; // ] - key <AC05> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] }; // g - key <AC07> { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; // j - key <AC11> { [ Cyrillic_ghe, Cyrillic_GHE ] }; // ' + key <AC05> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] }; // g + key <AC07> { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; // j + key <AC11> { [ Cyrillic_ghe, Cyrillic_GHE ] }; // ' - key <AB01> { [ Cyrillic_yu, Cyrillic_YU ] }; // z - key <AB02> { [ Ukrainian_yi, Ukrainian_YI ] }; // x + key <AB01> { [ Cyrillic_yu, Cyrillic_YU ] }; // z + key <AB02> { [ Ukrainian_yi, Ukrainian_YI ] }; // x }; // EXTRAS: xkb_symbols "combiningkeys" { - // Raw combining characters instead of dead keys, - // especially good for post-accenting texts. - - include "rs(basic)" - - name[Group1]= "Serbian (combining accents instead of dead keys)"; - - key <AE03> { [ any,any, U0302, dead_circumflex ] }; // 3, U0302 = COMBINING CIRCUMFLEX ACCENT - key <AE07> { [ any,any, U0300, NoSymbol ] }; // 7, U0300 = COMBINING GRAVE ACCENT - key <AE08> { [ any,any, U030F, NoSymbol ] }; // 8, U030F = COMBINING DOUBLE GRAVE ACCENT - key <AE09> { [ any,any, U0301, NoSymbol ] }; // 9, U0301 = COMBINING ACUTE ACCENT - key <AE10> { [ any,any, U0311, NoSymbol ] }; // 0, U0311 = COMBINING INVERTED BREVE - key <AE11> { [ any,any, U0304, NoSymbol ] }; // -, U0304 = COMBINING MACRON + // Raw combining characters instead of dead keys, + // especially good for post-accenting texts. + + include "rs(basic)" + name[Group1]= "Serbian (combining accents instead of dead keys)"; + + key <AE03> { [ any, any, U0302, dead_circumflex ] }; // 3, U0302 = COMBINING CIRCUMFLEX ACCENT + key <AE07> { [ any, any, U0300, NoSymbol ] }; // 7, U0300 = COMBINING GRAVE ACCENT + key <AE08> { [ any, any, U030F, NoSymbol ] }; // 8, U030F = COMBINING DOUBLE GRAVE ACCENT + key <AE09> { [ any, any, U0301, NoSymbol ] }; // 9, U0301 = COMBINING ACUTE ACCENT + key <AE10> { [ any, any, U0311, NoSymbol ] }; // 0, U0311 = COMBINING INVERTED BREVE + key <AE11> { [ any, any, U0304, NoSymbol ] }; // -, U0304 = COMBINING MACRON }; diff --git a/xorg-server/xkeyboard-config/symbols/ru b/xorg-server/xkeyboard-config/symbols/ru index 2b34a4d52..fd1cc0ec5 100644 --- a/xorg-server/xkeyboard-config/symbols/ru +++ b/xorg-server/xkeyboard-config/symbols/ru @@ -182,7 +182,7 @@ xkb_symbols "phonetic" { key <LatA> { [ Cyrillic_a, Cyrillic_A ] }; key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] }; key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] }; - key <LatX> { [ Cyrillic_ha, Cyrillic_HA ] }; + key <LatX> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; key <LatD> { [ Cyrillic_de, Cyrillic_DE ] }; key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] }; key <LatV> { [ Cyrillic_zhe, Cyrillic_ZHE ] }; @@ -191,7 +191,7 @@ xkb_symbols "phonetic" { key <LatR> { [ Cyrillic_er, Cyrillic_ER ] }; key <LatN> { [ Cyrillic_en, Cyrillic_EN ] }; key <LatB> { [ Cyrillic_be, Cyrillic_BE ] }; - key <LatH> { [ Cyrillic_che, Cyrillic_CHE ] }; + key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] }; key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] }; key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] }; key <LatM> { [ Cyrillic_em, Cyrillic_EM ] }; @@ -204,7 +204,7 @@ xkb_symbols "phonetic" { key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] }; key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] }; - key <AE12> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; + key <AE12> { [ Cyrillic_che, Cyrillic_CHE ] }; key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; key <BKSL> { [ Cyrillic_e, Cyrillic_E ] }; }; @@ -268,10 +268,10 @@ xkb_symbols "cv" { key.type[group1]="FOUR_LEVEL"; - key <AD03> { [ Cyrillic_u, Cyrillic_U, U04F3, U04F2 ] }; - key <AD05> { [ Cyrillic_ie, Cyrillic_IE, U04D7, U04D6 ] }; - key <AC04> { [ Cyrillic_a, Cyrillic_A, U04D1, U04D0 ] }; - key <AB03> { [ Cyrillic_es, Cyrillic_ES, U04AB, U04AA ] }; + key <AD03> { [ Cyrillic_u, Cyrillic_U, 0x010004f3, 0x010004f2 ] }; + key <AD05> { [ Cyrillic_ie, Cyrillic_IE, 0x010004d7, 0x010004d6 ] }; + key <AC04> { [ Cyrillic_a, Cyrillic_A, 0x010004d1, 0x010004d0 ] }; + key <AB03> { [ Cyrillic_es, Cyrillic_ES, 0x010004ab, 0x010004aa ] }; include "level3(ralt_switch)" }; |