[Vm-dev] VMMaker-tfel.358 in Inbox: Fixes for BitBlt simulation
Eliot Miranda
eliot.miranda at gmail.com
Thu Feb 12 18:28:26 UTC 2015
Hi Tim,
On Thu, Feb 12, 2015 at 8:55 AM, timfelgentreff <timfelgentreff at gmail.com>
wrote:
>
> Hi,
>
> I've pushed a change to the BitBlt simulation code to the Inbox
> (VMMaker-tfel.358), because I didn't know where else to put it. With these
> changes, we are able to run a current 4.5 image with VMMaker loaded on our
> RSqueakVM, with BitBlt entirely run from within the image.
>
> The goal is to have the VM run as many plugins as possible from pure
> Smalltalk, so there will be more slight changes and maybe the odd
> performance improvement for the simulation forthcoming. Is this something
> that would be ok with everyone?
>
It's certainly good for me; thanks. Since you're looking at BitBlt code
let me try and rope you in to a problem I'm having with 64-bit Spur. Right
now a number of tests fail because of byte-swapping of bits data, e.g.
ShortIntegerArray, failing on 64-bit Spur. This is done with BitBlt. See
ShortIntegerArray>>restoreEndianness. Apart from the fact that this is an
absurd way to do things (*) it should work and right now doesn't. Would
you be interested in taking a look at it and trying to figure out why? If
you're interested you'll need a 64-bit linux for the real VM, and I'll put
together a simulator image and a 64-bit test image for you to play with.
(*) more generally a) using 6 bitblt invocations instead of a single byte
reversal primitive is...um, diplomatically, a waste of cycles, but more
seriously, b) we're paying for needless byte reversals to keep things in
big-endian format. Little endian has essentially won with most ARM
deployments being little endian and x86 & x64 being little endian.
SHouldn't we be looking to eliminate all this unnecessary overhead? It's
in image segment load/store, sound processing, and its unnecessary.
> Here's the diff:
>
> BitBltSimulation>>loadColorMap: (changed)
> loadColorMap
> "ColorMap, if not nil, must be longWords, and
> 2^N long, where N = sourceDepth for 1, 2, 4, 8 bits,
> or N = 9, 12, or 15 (3, 4, 5 bits per color) for 16 or 32 bits."
> | cmSize oldStyle oop cmOop |
> <inline: true>
> cmFlags := cmMask := cmBitsPerColor := 0.
> cmShiftTable := nil.
> cmMaskTable := nil.
> cmLookupTable := nil.
> cmOop := interpreterProxy fetchPointer: BBColorMapIndex ofObject:
> bitBltOop.
> cmOop = interpreterProxy nilObject
> ifTrue: [^ true].
> cmFlags := ColorMapPresent.
> "even if identity or somesuch - may be cleared later"
> oldStyle := false.
> (interpreterProxy isWords: cmOop)
> ifTrue: ["This is an old-style color map (indexed only,
> with implicit
> RGBA conversion)"
> cmSize := interpreterProxy slotSizeOf: cmOop.
> cmLookupTable := interpreterProxy
> firstIndexableField: cmOop.
> - oldStyle := true.
> - self
> - cCode: ''
> - inSmalltalk: [self assert: cmLookupTable
> unitSize = 4]]
> + oldStyle := true]
> ifFalse: ["A new-style color map (fully qualified)"
> ((interpreterProxy isPointers: cmOop)
> and: [(interpreterProxy
> slotSizeOf: cmOop)
> >= 3])
> ifFalse: [^ false].
> cmShiftTable := self
>
> loadColorMapShiftOrMaskFrom: (interpreterProxy fetchPointer: 0
> ofObject: cmOop).
> cmMaskTable := self
>
> loadColorMapShiftOrMaskFrom: (interpreterProxy fetchPointer: 1
> ofObject: cmOop).
> oop := interpreterProxy fetchPointer: 2 ofObject:
> cmOop.
> oop = interpreterProxy nilObject
> ifTrue: [cmSize := 0]
> ifFalse: [(interpreterProxy isWords: oop)
> ifFalse: [^ false].
> cmSize := interpreterProxy
> slotSizeOf: oop.
> cmLookupTable := interpreterProxy
> firstIndexableField: oop].
> cmFlags := cmFlags bitOr: ColorMapNewStyle.
> self
> cCode: ''
> inSmalltalk: [self assert: cmShiftTable
> unitSize = 4.
> self assert: cmMaskTable unitSize
> = 4.
> self assert: cmLookupTable
> unitSize = 4]].
> (cmSize bitAnd: cmSize - 1)
> = 0
> ifFalse: [^ false].
> cmMask := cmSize - 1.
> cmBitsPerColor := 0.
> cmSize = 512
> ifTrue: [cmBitsPerColor := 3].
> cmSize = 4096
> ifTrue: [cmBitsPerColor := 4].
> cmSize = 32768
> ifTrue: [cmBitsPerColor := 5].
> cmSize = 0
> ifTrue: [cmLookupTable := nil.
> cmMask := 0]
> ifFalse: [cmFlags := cmFlags bitOr: ColorMapIndexedPart].
> oldStyle
> ifTrue: ["needs implicit conversion"
> self setupColorMasks].
> "Check if colorMap is just identity mapping for RGBA parts"
> (self isIdentityMap: cmShiftTable with: cmMaskTable)
> ifTrue: [cmMaskTable := nil.
> cmShiftTable := nil]
> ifFalse: [cmFlags := cmFlags bitOr: ColorMapFixedPart].
> ^ true
>
>
> BitBltSimulator>>halftoneAt: (added)
> +halftoneAt: idx
> + ^ halftoneBase + (idx \\ halftoneHeight * 4) long32At: 0
>
>
>
>
>
>
> --
> View this message in context:
> http://forum.world.st/VMMaker-tfel-358-in-Inbox-Fixes-for-BitBlt-simulation-tp4805362.html
> Sent from the Squeak VM mailing list archive at Nabble.com.
>
--
best,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20150212/527ab241/attachment.htm
More information about the Vm-dev
mailing list