mirror of
https://github.com/elwrcl/intel-hard-lab.git
synced 2026-10-31 07:48:02 +03:00
5172 lines
265 KiB
Plaintext
5172 lines
265 KiB
Plaintext
Intel® OpenSource HD Graphics
|
||
Programmer’s Reference Manual (PRM)
|
||
Volume 4 Part 2: Shared Functions –
|
||
Message Gateway, URB, Video Motion
|
||
Estimation, Pixel Interpolator (Ivy Bridge)
|
||
|
||
|
||
For the 2012 Intel® Core™ Processor Family
|
||
|
||
|
||
May 2012
|
||
Revision 1.0
|
||
|
||
|
||
NOTICE:
|
||
This document contains information on products in the design phase of development, and Intel
|
||
reserves the right to add or remove product features at any time, with or without changes to this
|
||
open source documentation.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12
|
||
Creative Commons License
|
||
You are free to Share — to copy, distribute, display, and perform the work
|
||
|
||
Under the following conditions:
|
||
|
||
Attribution. You must attribute the work in the manner specified by the author or licensor (but not in any
|
||
way that suggests that they endorse you or your use of the work).
|
||
|
||
No Derivative Works. You may not alter, transform, or build upon this work.
|
||
®
|
||
INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL PRODUCTS. NO
|
||
LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL
|
||
PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. EXCEPT AS PROVIDED IN INTEL'S
|
||
TERMS AND CONDITIONS OF SALE FOR SUCH PRODUCTS, INTEL ASSUMES NO LIABILITY
|
||
WHATSOEVER AND INTEL DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY, RELATING TO
|
||
SALE AND/OR USE OF INTEL PRODUCTS INCLUDING LIABILITY OR WARRANTIES RELATING TO
|
||
FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY
|
||
PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT.
|
||
|
||
A "Mission Critical Application" is any application in which failure of the Intel Product could result, directly
|
||
or indirectly, in personal injury or death. SHOULD YOU PURCHASE OR USE INTEL'S PRODUCTS FOR
|
||
ANY SUCH MISSION CRITICAL APPLICATION, YOU SHALL INDEMNIFY AND HOLD INTEL AND ITS
|
||
SUBSIDIARIES, SUBCONTRACTORS AND AFFILIATES, AND THE DIRECTORS, OFFICERS, AND
|
||
EMPLOYEES OF EACH, HARMLESS AGAINST ALL CLAIMS COSTS, DAMAGES, AND EXPENSES
|
||
AND REASONABLE ATTORNEYS' FEES ARISING OUT OF, DIRECTLY OR INDIRECTLY, ANY CLAIM
|
||
OF PRODUCT LIABILITY, PERSONAL INJURY, OR DEATH ARISING IN ANY WAY OUT OF SUCH
|
||
MISSION CRITICAL APPLICATION, WHETHER OR NOT INTEL OR ITS SUBCONTRACTOR WAS
|
||
NEGLIGENT IN THE DESIGN, MANUFACTURE, OR WARNING OF THE INTEL PRODUCT OR ANY
|
||
OF ITS PARTS.
|
||
|
||
Intel may make changes to specifications and product descriptions at any time, without notice. Designers
|
||
must not rely on the absence or characteristics of any features or instructions marked "reserved" or
|
||
"undefined". Intel reserves these for future definition and shall have no responsibility whatsoever for
|
||
conflicts or incompatibilities arising from future changes to them. The information here is subject to
|
||
change without notice. Do not finalize a design with this information.
|
||
|
||
The products described in this document may contain design defects or errors known as errata which
|
||
may cause the product to deviate from published specifications. Current characterized errata are
|
||
available on request.
|
||
|
||
Implementations of the I2C bus/protocol may require licenses from various entities, including Philips
|
||
Electronics N.V. and North American Philips Corporation.
|
||
|
||
Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and other countries.
|
||
|
||
*Other names and brands may be claimed as the property of others.
|
||
|
||
|
||
Copyright © 2012, Intel Corporation. All rights reserved.
|
||
|
||
|
||
|
||
|
||
2 5/29/2012 Doc Ref #: IHD-OS-V4 Pt 2 – 05 12
|
||
Contents
|
||
1. Shared Functions - Message Gateway ................................................................................................ 5
|
||
1.1 Messages ............................................................................................................................................. 5
|
||
1.1.1 Message Descriptor ........................................................................................................................ 6
|
||
1.1.2 OpenGateway Message ................................................................................................................. 7
|
||
1.1.3 CloseGateway Message ................................................................................................................. 8
|
||
1.1.4 GetTimeStamp Message .............................................................................................................. 11
|
||
1.1.5 BarrierMsg Message .................................................................................................................... 13
|
||
1.1.6 MMIOReadWrite Message ........................................................................................................... 15
|
||
2. Shared Functions - Unified Return Buffer (URB) ............................................................................. 17
|
||
2.1 URB Size ............................................................................................................................................ 17
|
||
2.2 URB Access ....................................................................................................................................... 17
|
||
2.3 State ................................................................................................................................................... 18
|
||
2.4 URB Messages .................................................................................................................................. 18
|
||
2.4.1 Execution Mask ............................................................................................................................ 19
|
||
2.4.2 Message Descriptor ...................................................................................................................... 19
|
||
2.4.3 URB_WRITE* and URB_READ* .................................................................................................. 20
|
||
2.4.4 URB_ATOMIC* ............................................................................................................................. 32
|
||
3. Shared Functions – Video Motion Estimation .................................................................................. 34
|
||
3.1 Theory of Operation ........................................................................................................................... 34
|
||
3.1.1 Shape Decision ............................................................................................................................ 34
|
||
3.1.2 Integer Motion Estimation ............................................................................................................. 39
|
||
3.1.3 Fractional Motion Estimation ........................................................................................................ 44
|
||
3.1.4 BME and Weighted Prediction...................................................................................................... 45
|
||
3.1.5 Skip Check.................................................................................................................................... 46
|
||
3.1.6 Intra Prediction Estimation ............................................................................................................ 48
|
||
3.1.7 Transform Adjusted SAD .............................................................................................................. 48
|
||
3.1.8 Early Decisions ............................................................................................................................. 50
|
||
3.1.9 Performance Information .............................................................................................................. 51
|
||
3.1.10 VME Changes............................................................................................................................. 52
|
||
3.2 Surfaces ............................................................................................................................................. 52
|
||
3.3 State ................................................................................................................................................... 52
|
||
3.3.1 BINDING_TABLE_STATE............................................................................................................ 52
|
||
3.3.2 SURFACE_STATE ....................................................................................................................... 52
|
||
3.3.3 VME_STATE ................................................................................................................................ 53
|
||
3.4 Change Details ................................................................................................................................... 56
|
||
3.4.1 Record Stream-out and Stream-in ............................................................................................... 56
|
||
3.4.2 MV Definitions and Precision........................................................................................................ 57
|
||
3.4.3 Expanded MV Costs ..................................................................................................................... 58
|
||
3.4.4 Remove Skip MV Restriction ........................................................................................................ 59
|
||
3.4.5 Bilinear Interpolation ..................................................................................................................... 59
|
||
3.4.6 AVC Intra Mode Mask .................................................................................................................. 59
|
||
3.5 Messages ........................................................................................................................................... 59
|
||
3.5.1 VME Motion Search Request ....................................................................................................... 60
|
||
3.5.2 Message Descriptor ...................................................................................................................... 60
|
||
3.5.3 Input Message .............................................................................................................................. 61
|
||
3.5.4 Writeback Message ...................................................................................................................... 80
|
||
3.5.5 Stream-in\Stream-out Message.................................................................................................... 90
|
||
4. Shared Functions Pixel Interpolater .................................................................................................. 93
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 3
|
||
4.1 Messages ........................................................................................................................................... 93
|
||
4.1.1 Initiating Message ......................................................................................................................... 93
|
||
4.1.2 Writeback Message ...................................................................................................................... 98
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 4
|
||
1. Shared Functions - Message Gateway
|
||
The Message Gateway shared function provides a mechanism for active thread-to-thread communication.
|
||
Such thread-to-thread communication is based on direct register access. One thread, a requester
|
||
thread, is capable of writing into the GRF register space of another thread, a recipient thread. Such
|
||
direct register access between two threads in a multi-processor environment some time is referred to as
|
||
remote register access. Remote register access may include read or write. The architecture supports
|
||
remote register write, but not remote register read (natively). Message Gateway facilitates such remote
|
||
register write via message passing. The requester thread sends a message to Message Gateway
|
||
requesting a write to the recipient thread’s GRF register space. Message Gateway sends a writeback
|
||
message to the recipient thread to complete the register write on behave of the requester. The requester
|
||
thread and the recipient thread may be on the same EU or on different EUs.
|
||
When Bypass Gateway Control is set to 1, commands OpenGateway and CloseGateway are no longer
|
||
used, the gateway parameters are taking the default values as the following:
|
||
|
||
RegBase = 0
|
||
Gateway Size check and Key check are bypassed.
|
||
Gateway Open (an internal signal that is used to be set by OpenGateway message) check is
|
||
bypassed
|
||
|
||
A separate Gateway exists per half-slice in the architecture. For ForwardMsg this is handled
|
||
transparently, but barriers can only be accessed by threads in the local half-slice. This means that all
|
||
threads that access a shared barrier need to use the half-slice select in GPGPU_OBJECT and
|
||
MEDIA_OBJECT to stay on a single half-slice. GPGPU_WALKER handles this automatically.
|
||
|
||
|
||
1.1 Messages
|
||
Message Gateway supports such thread-to-thread communication with the following three messages:
|
||
|
||
OpenGateway: opens a gateway for a requester thread. Once a thread successfully opens its
|
||
gateway, it can be a recipient thread to receive remote register write.
|
||
CloseGateway: closes the gateway for a requester thread. Once a thread successfully closes its
|
||
gateway, Message Gateway will block any future remote register writes to this thread.
|
||
ForwardMsg: forwards a formatted message (remote register write) from a requester thread to a
|
||
recipient thread.
|
||
GetTimeStamp: reads absolute and relative timestamps for a requester thread.
|
||
BarrierMsg: A set of threads sends this message to the Gateway. When all threads in a group have
|
||
sent the message, a reply (both a register write and an N0 notification) is sent to each member of
|
||
the group.
|
||
UpdateGatewayState: updates the internal state of the Message Gateway.
|
||
One example usage is to allow a control thread to change Barrier Byte to convey dynamic state
|
||
information. This may be used to support interrupt when persistent compute/worker threads are
|
||
synchronized using Barrier.
|
||
MMIO Read/Write: allows a message to read or write an MMIO register. The MEDIA_VFE_STATE
|
||
command has a field which limits the accesses for security.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 5
|
||
1.1.1 Message Descriptor
|
||
The following message descriptor applies to all messages supported by Message Gateway.
|
||
Bit Description
|
||
19
|
||
Header Present
|
||
This bit must be set to zero for all Message Gateway messages.
|
||
(this bit is not part of the shared function specific message descriptor)
|
||
|
||
18:17
|
||
Ignored (these bits are not part of the shared function specific message descriptor)
|
||
16:15
|
||
Notify. Send Notification Signal.
|
||
This is a two-bit field indicating which notify event is sent.
|
||
00: No notify
|
||
01: Increment recipient thread’s N0 notification counter
|
||
10: Increment recepient thread’s N2 notification counter
|
||
11: Reserved
|
||
This field is only valid for a ForwardMsg message. It is ignored for other messages. The BarrierMsg message
|
||
always increments the N0 notification counter.
|
||
14
|
||
AckReq. Acknowledgment Required. When this bit is set, an acknowledgment return message is required.
|
||
Message Gateway will send a writeback message containing the error code to the requester thread using the
|
||
post destination register address. When this bit is not set, no writeback message is sent to the requesting
|
||
thread by Message Gateway, even if an error occurs.
|
||
This field is valid for OpenGateway, CloseGateway, ForwardMsg and BarrierMsg messages.
|
||
When this bit is set, post destination register must be valid and the response length must be 1.
|
||
When this bit is not set, post destination register must be null and the response length must be 0.
|
||
This bit cannot be set when EOT is set; otherwise, hardware behavior is undefined.
|
||
0 = No Acknowledgement is required.
|
||
1 = Acknowledgement is required.
|
||
13:3 Reserved: MBZ
|
||
2:0
|
||
SubFuncID. Identify the supported sub-functions by Message Gateway. Encodings are:
|
||
000 = OpenGateway. Open the gateway for the requester thread.
|
||
001 = CloseGateway. Close the gateway for the requester thread.
|
||
010 = ForwardMsg. Forward the formatted message to the recipient thread with the given offset from the
|
||
recipient’s register base.
|
||
011 = GetTimeStamp. Read absolute and relative timestamps.
|
||
100 = BarrierMsg. Record an additional thread reaching the barrier.
|
||
101 = UpdateGatewayState. Update the barrier byte for a barrier.
|
||
110 = MMIO Read/Write
|
||
Others are reserved
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 6
|
||
1.1.2 OpenGateway Message
|
||
The OpenGateway message opens a communication channel between the requesting thread and other
|
||
threads. It specifies a key for other threads to access its gateway, as well as the GRF register range
|
||
allowed to be written. The message consists of a single 256-bit message payload.
|
||
If the AckReq bit is set, a single 256-bit payload writeback message is sent back to the requesting thread
|
||
after completion of the OpenGateway function. Only the least significant DWord in the post destination
|
||
register is overwritten.
|
||
If the EOT is set for this message, Message Gateway will ignore this message; instead, it will close the
|
||
gateway for the requesting thread regardless of the previous state of the gateway.
|
||
It is software’s policy to determine how to generate the key.
|
||
|
||
1.1.2.1 Message Payload
|
||
DWord Bit Description
|
||
M0.7 31:0
|
||
Reserved
|
||
|
||
M0.6 31:0
|
||
Reserved
|
||
|
||
31:29
|
||
M0.5 Reserved: MBZ
|
||
|
||
28:21
|
||
RegBase: The register base address to be stored in the Message Gateway. It is used to compute the
|
||
destination GRF register address from the offset field in ForwardMsg. RegBase contains 256-bit GRF
|
||
aligned register address.
|
||
Note 1: This field aligns with bits [28:21] of the Offset field of the message payload for ForwardMsg.
|
||
Note 2: the most significant bit of this field must be zero.
|
||
Format = U8
|
||
Range = [0,127]
|
||
|
||
20:11
|
||
Reserved: MBZ
|
||
|
||
10:8
|
||
Gateway Size: The range limit for messages through the Message Gateway. The maximal allowed
|
||
Gateway Size is 32 GRF registers.
|
||
000: 1 GRF Register
|
||
001: 2 GRF Registers
|
||
010: 4 GRF Registers
|
||
011: 8 GRF Registers
|
||
100: 16 GRF Registers
|
||
101: 32 GRF Registers
|
||
7:0
|
||
Dispatch ID: This ID is assigned by the fixed function unit and is a unique identifier for the thread. It is
|
||
used to free up resources used by the thread upon thread completion.
|
||
This field is ignored by Message Gateway
|
||
This field is only required for a thread that is created by a fixed function (therefore, not a child thread)
|
||
and EOT bit is set for the message.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 7
|
||
DWord Bit Description
|
||
31:16
|
||
M0.4 Reserved: MBZ
|
||
|
||
15:0
|
||
Reserved: MBZ
|
||
|
||
M0.3:0 Ignored
|
||
|
||
|
||
1.1.2.2 Writeback Message to Requester Thread
|
||
The writeback message is only sent if the AckReq bit in the message descriptor is set.
|
||
DWord Bit Description
|
||
W0.7:1 Reserved (not overwritten)
|
||
W0.0 31:20 Reserved
|
||
19:16
|
||
Shared Function ID: Contains the message gateway’s shared function ID.
|
||
|
||
15:3 Reserved
|
||
2:0
|
||
Error Code
|
||
000: Successful. No Error (Normal)
|
||
101: Opcode Error. Attempt to send a message which is not either open/close/forward
|
||
other codes: Reserved
|
||
|
||
|
||
|
||
1.1.3 CloseGateway Message
|
||
The CloseGateway message closes a communication channel for the requesting thread that was
|
||
previously opened with OpenGateway. Each thread is allowed to have only one open gateway at a time,
|
||
thus no additional information in the message payload is required to close the gateway. The message
|
||
consists of a single 256-bit message payload.is
|
||
If the AckReq bit is set, a single 256-bit payload writeback message is sent back to the requesting thread
|
||
after completion of the CloseGateway function. Only the least significant DWord in the post destination
|
||
register is overwritten.
|
||
|
||
1.1.3.1 Message Payload
|
||
DWord Bit Description
|
||
M0.7:6 Ignored
|
||
31:8 Ignored
|
||
M0.5
|
||
7:0
|
||
Dispatch ID: This ID is assigned by the fixed function unit and is a unique identifier for the thread. It is
|
||
used to free up resources used by the thread upon thread completion.
|
||
This field is ignored by Message Gateway
|
||
This field is only required for a thread that is created by a fixed function (therefore, not a child thread)
|
||
and EOT bit is set for the message.
|
||
M0.4:0 Ignored
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 8
|
||
1.1.3.2 Writeback Message to Requester Thread
|
||
The writeback message is only sent if the AckReq bit in the message descriptor is set.
|
||
DWord Bit Description
|
||
W0.7:1 Reserved (not overwritten)
|
||
W0.0 31:20 Reserved
|
||
19:16
|
||
Shared Function ID: Contains the message gateway’s shared function ID.
|
||
|
||
15:3 Reserved
|
||
2:0
|
||
Error Code
|
||
000: Successful. No Error (Normal)
|
||
101: Opcode Error. Attempt to send a message which is not either open/close/forward
|
||
other codes: Reserved
|
||
|
||
|
||
1.1.3.3 ForwardMsg Message
|
||
The ForwardMsg message gives the ability for a requester thread to write a data segment in the form of
|
||
a byte, a dword, 2 dwords, or 4 dwords to a GRF register in a recipient thread. The message consists of a
|
||
single 256-bit message payload, which contains the specially formatted data segment.
|
||
The ForwardMsg message utilizes a communication channel previously opened by the recipient thread.
|
||
The recipient thread has communicated its EUID, TID, and key to the requester thread previously via
|
||
some other mechanism. Generally, this is done through the thread spawn message from parent to child
|
||
thread, allowing each child (requester) to then communicate with its parent through a gateway opened by
|
||
the parent (recipient). The child could then use ForwardMsg message to communicate its own EUID, TID,
|
||
and key back to the parent to enable bi-directional communication after opening its own gateway.
|
||
If the AckReq bit is set, a single 256-bit payload writeback message is sent back to the requester thread
|
||
after completion of the ForwardMsg function. Only the least significant DWord in the post destination
|
||
register is overwritten.
|
||
If the Notify bit in the message descriptor is set, a ‘notification’ is sent to the recipient thread in order to
|
||
increment the recipient thread’s notification counter. This allows multiple messages to be sent to the
|
||
recipient without waking up the recipient thread. The last message, having this bit set, will then wake up
|
||
the recipient thread.
|
||
|
||
1.1.3.4 Message Payload
|
||
DWord Bit Description
|
||
M0.7 31:0
|
||
Reserved
|
||
|
||
M0.6 31:0
|
||
Reserved
|
||
|
||
31:29 Reserved: MBZ
|
||
M0.5
|
||
28:16
|
||
Offset: It provides the destination register position in the recipient thread GRF register space as the
|
||
offset from the RegBase stored in the recipient thread’s gateway entry. The offset is in unit of byte,
|
||
such that bits [28:21] is the 256-bit aligned register offset and bits [4:0] is the sub-register offset. The
|
||
sub-register offset must be aligned to the Length field in bits [10:8]. The subfields of Offset are further
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 9
|
||
DWord Bit Description
|
||
illustrated as the following.
|
||
Offset[28:21]: Register offset from the gateway base (Range [0, 127]: bit 12 MBZ)
|
||
Offset[20:18]: DW offset
|
||
Offset[17:16]: Byte offset (must be 00 for all DW length cases)
|
||
Programming restriction: R0 can not be used as destination GRF register for ForwardMsg. NULL
|
||
register is also not allowed as destination.
|
||
15:11 Reserved: MBZ
|
||
10:8
|
||
Length: The length of the data segment.
|
||
000: 1 byte
|
||
001: 1 word
|
||
010: 1 dword
|
||
011: 2 dwords
|
||
100: 4 dwords
|
||
101-111: Reserved
|
||
|
||
7:0
|
||
Dispatch ID: This ID is assigned by the fixed function unit and is a unique identifier for the thread. It is
|
||
used to free up resources used by the thread upon thread completion.
|
||
This field is ignored by Message Gateway
|
||
This field is only required for a thread that is created by a fixed function (therefore, not a child thread)
|
||
and EOT bit is set for the message.
|
||
31:30 Ignored
|
||
M0.4
|
||
29
|
||
28
|
||
31:30
|
||
29:28
|
||
27:24
|
||
EUID: The Execution Unit ID as part of the Recipient field is used to identify the recipient thread to
|
||
whom the message is forwarded.
|
||
23:19 Ignored
|
||
18:16
|
||
TID: The Thread ID as part of the Recipient field is used to identify the recipient thread to whom the
|
||
message is forwarded.
|
||
|
||
15:0
|
||
Key
|
||
The key to match with the one stored in the recipient thread’s entry in Message Gateway.
|
||
Ignored
|
||
M0.3 31:0
|
||
Data Segment DWord 3: valid only for the 4-DWord data segment length
|
||
|
||
M0.2 31:0
|
||
Data Segment DWord 2: valid only for the 4-DWord data segment length
|
||
|
||
M0.1 31:0
|
||
Data Segment Dword 1: valid only for the 2- and 4-DWord data segment lengths
|
||
|
||
31:24
|
||
M0.0 Data Segment Byte 0: the same byte must be copied to all Data Segment Dword 0: valid only for
|
||
four positions within this DWord. Valid only for the 1-Byte the 1-, 2- and 4-Dword data segment
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 10
|
||
DWord Bit Description
|
||
data segment length. lengths
|
||
23:16
|
||
Data Segment Byte 0
|
||
|
||
15:8
|
||
Data Segment Byte 0
|
||
|
||
7:0
|
||
Data Segment Byte 0
|
||
|
||
|
||
|
||
1.1.3.5 Writeback Message to Requester Thread
|
||
The writeback message is only sent if the AckReq bit in the message descriptor is set.
|
||
DWord Bit Description
|
||
W0.7:1 Reserved (not overwritten)
|
||
W0.0 31:20 Reserved
|
||
19:16
|
||
Shared Function ID: Contains the message gateway’s shared function ID.
|
||
|
||
15:3 Reserved
|
||
2:0
|
||
Error Code
|
||
000: Successful. No Error (Normal)
|
||
001: Reserved
|
||
010: Gateway Closed. Attempt to send a message through a closed gateway
|
||
101: Opcode Error. Attempt to send a message which is not either open/close/forward
|
||
110: Invalid Message Size. Attempt to forward a message with length greater than 4 DW
|
||
111: Reserved
|
||
|
||
|
||
1.1.3.6 Writeback Message to Recipient Thread
|
||
This message contains the byte or dwords data segment indicated in the message written to the GRF
|
||
register offset indicated. Only the byte/dword(s) will be enabled, all other data in the GRF register is
|
||
untouched.
|
||
|
||
|
||
1.1.4 GetTimeStamp Message
|
||
The GetTimeStamp message gives the ability for a requester thread to read the timestamps back from
|
||
the message gateway. The message consists of a single 256-bit message payload.
|
||
AbsoluteTimeLap is based on an absolute wall clock in unit of nSec/uSec that is independent of context
|
||
switch or GPU frequency adjustment. Message Gateway shares the same GPU timestamp. Details can
|
||
be found in the TIMESTAMP register section in vol1c Memory Interface and Command Stream.
|
||
RelativeTimeLap is based on a relative time count that is counting the GPU clocks for the context. The
|
||
relative time count is saved/restored during context switch.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 11
|
||
1.1.4.1 Message Payload
|
||
DWord Bit Description
|
||
M0.7 31:0
|
||
Reserved
|
||
|
||
M0.6 31:0
|
||
Reserved
|
||
|
||
31
|
||
M0.5 Return to High GRF:
|
||
0: the return 128-bit data goes to the first half of the destination GRF register
|
||
1: the return 128-bit data goes to the second half of the destination GRF register
|
||
30:8 Reserved : MBZ
|
||
7:0
|
||
Dispatch ID: This ID is assigned by the fixed function unit and is a unique identifier for the thread. It is
|
||
used to free up resources used by the thread upon thread completion.
|
||
This field is ignored by Message Gateway
|
||
This field is only required for a thread that is created by a fixed function (therefore, not a child thread)
|
||
and EOT bit is set for the message.
|
||
M0.4 31:0 Ignored
|
||
M0.3 31:0 Ignored
|
||
M0.2 31:0 Ignored
|
||
M0.1 31:0 Ignored
|
||
M0.0 31:0 Ignored
|
||
|
||
|
||
1.1.4.2 Writeback Message to Requester Thread
|
||
As the writeback message is only sent if the AckReq bit in the message descriptor is set, AckReq bit
|
||
must be set for this message.
|
||
Only half of the destination GRF register is updated (via write-enables). The other half of the register is
|
||
not changed. This is determined by the Return to High GRF control field.
|
||
Writeback Message if Return to High GRF is set to 0:
|
||
DWord Bit Description
|
||
W0.7:4 Reserved (not overwritten)
|
||
W0.3 31:0
|
||
RelativeTimeLapHigh: This field returns the MSBs of time lap for the relative clock since the previous
|
||
reset. This field represents 1.024 uSec increment of the time stamp. Hardware handles the
|
||
wraparound (over 64 bit boundary) of the timestamp.
|
||
Format: U12
|
||
|
||
31:20
|
||
W0.2 RelativeTimeLapLow: This field returns the LSBs of time lap for the relative clock since the previous
|
||
reset. This field represents 1/4 nSec increment of the time stamp. Hardware handles the wraparound
|
||
(over 64 bit boundary) of the timestamp.
|
||
Format: U12
|
||
19:0 Reserved : MBZ
|
||
W0.1 31:0
|
||
AbsoluteTimeLapHigh: This field returns the MSBs of time lap for the absolute clock since the
|
||
previous reset. This field represents 1.024 uSec increment of the time stamp. Hardware handles the
|
||
wraparound (over 64 bit boundary) of the timestamp.
|
||
Format: U12
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 12
|
||
DWord Bit Description
|
||
31:20
|
||
W0.0 AbsoluteTimeLapLow: This field returns the LSBs of time lap for the absolute clock since the
|
||
previous reset. This field represents 1/4 nSec increment of the time stamp. Hardware handles the
|
||
wraparound (over 64 bit boundary) of the timestamp.
|
||
Format: U12
|
||
19:0 Reserved : MBZ
|
||
|
||
Writeback Message if Return to High GRF is set to 1:
|
||
DWord Bit Description
|
||
W0.7 31:0
|
||
RelativeTimeLapHigh
|
||
|
||
31:20
|
||
W0.6 RelativeTimeLapLow
|
||
|
||
19:0 Reserved : MBZ
|
||
W0.5 31:0
|
||
AbsoluteTimeLapHigh
|
||
|
||
31:20
|
||
W0.4 AbsoluteTimeLapLow
|
||
|
||
19:0 Reserved : MBZ
|
||
W0.3:0 Reserved : MBZ
|
||
|
||
|
||
1.1.5 BarrierMsg Message
|
||
The BarrierMsg message gives the ability for multiple threads to synchronize their progress. This is useful
|
||
when there are data shared between threads. The message consists of a single 256-bit message
|
||
payload.
|
||
Upon receiving one such message, Message Gateway increments the Barrier counter and mark the
|
||
Barrier requester thread. There is no immediate response from the Message Gateway. When the counter
|
||
value equates Barrier Thread Count, Message Gateway will send response back to all the Barrier
|
||
requesters.
|
||
|
||
1.1.5.1 Message Payload
|
||
DWord Bit Description
|
||
M0.7 31:0
|
||
Reserved
|
||
|
||
M0.6 31:0
|
||
Reserved
|
||
|
||
M0.5 31:0 Ignored
|
||
M0.4 31:0 Ignored
|
||
M0.3 31:0 Ignored
|
||
31:28 Ignored
|
||
M0.2
|
||
27:24
|
||
BarrierID. This field indicates which one from the 16 Barrier States is updated.
|
||
Format: U4
|
||
Note: this field location matches with that of R0 header.
|
||
23:16
|
||
Barrier.Offset. This is the offset for the Barrier to indicate the offset from the requester’s RegBase.
|
||
Regbase is 0 if Bypass Gateway Control is 1. Barrier.Offset + RegBase must be in the valid GRF
|
||
range, but not point to r0. Otherwise, hardware behavior is undefined.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 13
|
||
DWord Bit Description
|
||
It is in unit of 256-bit GRF register.
|
||
The most significant bit of this field must be zero.
|
||
Format = U8
|
||
Range = [0,127]
|
||
15:0 Ignored
|
||
M0.1 31:0 Ignored
|
||
M0.0 31:4 Ignored
|
||
|
||
|
||
1.1.5.2 Message Payload
|
||
DWord Bit Description
|
||
M0.7 31:0
|
||
Ignored
|
||
|
||
M0.6 31:0
|
||
Ignored
|
||
|
||
M0.5 31:0 Ignored
|
||
M0.4 31:0 Ignored
|
||
M0.3 31:0
|
||
Ignored
|
||
|
||
31
|
||
M0.2 Ignored
|
||
|
||
30:28 Ignored
|
||
27:24
|
||
BarrierID. This field indicates which one from the 16 Barrier States is updated.
|
||
Format: U4
|
||
Note: this field location matches with that of R0 header.
|
||
23:16
|
||
Ignored
|
||
|
||
15
|
||
Barrier Count Enable: Allows the message to reprogram the barrier count.
|
||
If set, the current value of the barrier state is compared to the Barrier Count field
|
||
(below). If these values are equal, the barrier is considered satisfied, barrier responses
|
||
are sent to the waiting thread(s) including the sending thread, and the barrier state is
|
||
reset to 0. If these values are not equal, the barrier state is incremented and the
|
||
sending thread is added to the list of threads waiting on this barrier.
|
||
If clear, the Message Gateway increments the Barrier counter and marks the Barrier
|
||
requester thread. There is no immediate response from the Gateway. When the
|
||
counter value equates Barrier Thread Count, Gateway will send response back to all
|
||
the Barrier requesters.
|
||
Format: Enable
|
||
14:9
|
||
Barrier Count:
|
||
If Barrier Count Enable is set, this field specifies the terminating barrier count.
|
||
Otherwise this field is ignored. All threads that belong to a single barrier must deliver
|
||
the same value for this field for a particular barrier iteration.
|
||
|
||
8:0 Ignored
|
||
M0.1 31:0 Ignored
|
||
M0.0 31:4 Ignored
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 14
|
||
1.1.5.3 Writeback Message to Requester Thread
|
||
The writeback message is only sent if the AckReq bit in the message descriptor is set.
|
||
DWord Bit Description
|
||
W0.7:1 Reserved (not overwritten)
|
||
W0.0 31:20 Reserved
|
||
19:16 Shared Function ID: Contains the message gateway’s shared function ID.
|
||
15:3 Reserved
|
||
2:0
|
||
Error Code
|
||
000: Successful. No Error (Normal)
|
||
001: Error (Barrier is inactive).
|
||
Other encodings are reserved.
|
||
|
||
|
||
1.1.5.4 Broadcast Writeback Message
|
||
When the count for a Barrier reaches Barrier.Count, the Message Gateway sends the notification bit N0
|
||
to each EU/Thread that reached the barrier. A Barrier Return Byte is not sent.
|
||
DWord Bit Description
|
||
W0.7:1 Reserved (not overwritten)
|
||
31:16 Reserved (not overwritten)
|
||
W0.0
|
||
15:8 Reserved (not overwritten)
|
||
7:0
|
||
Reserved (not overwritten)
|
||
|
||
|
||
|
||
1.1.6 MMIOReadWrite Message
|
||
|
||
1.1.6.1 Message Payload
|
||
DWord Bit Description
|
||
M0.7 31:0
|
||
Reserved
|
||
|
||
M0.6 31:0
|
||
Reserved
|
||
|
||
M0.5 31:0 Ignored
|
||
M0.4 31:0 Ignored
|
||
M0.3 31:1 Ignored
|
||
0
|
||
MMIO R/W:
|
||
0 – MMIO Read – a response will be sent to the EU with read data
|
||
1 – MMIO Write – no response is sent to EU (unless acknowledge requested in sideband)
|
||
31:28 Ignored
|
||
M0.2
|
||
22:2
|
||
MMIO Address:
|
||
The MMIO DWord address to be accessed.
|
||
1:0 Ignored
|
||
M0.1 31:0 Ignored
|
||
M0.0 31:0 MMIO Write Data (Only if MMIO R/W = 1, otherwise ignored).
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 15
|
||
1.1.6.2 Writeback Message to Requester Thread (MMIO Read Only)
|
||
DWord Bit Description
|
||
R0.7 31:0 Ignored
|
||
R0.6 31:0 Ignored
|
||
R0.5 31:0 Ignored
|
||
R0.4 31:0 Ignored
|
||
R0.3 31:0 Ignored
|
||
R0.2 31:0 Ignored
|
||
R0.1 31:0 Ignored
|
||
R0.0 31:0
|
||
MMIO Read Data
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 16
|
||
2. Shared Functions - Unified Return
|
||
Buffer (URB)
|
||
The Unified Return Buffer (URB) is a general-purpose buffer used for sending data between different
|
||
threads, and, in some cases, between threads and fixed-function units (or vice-versa). A thread accesses
|
||
the URB by sending messages.
|
||
|
||
|
||
2.1 URB Size
|
||
A URB entry is a logical entity within the URB, referenced by an entry handle and comprised of some
|
||
number of consecutive rows. A row corresponds in size to a 256-bit EU GRF register. Read/write access
|
||
to the URB is generally supported on a row-granular basis.
|
||
URB Size URB Rows URB Rows when SLM Enabled
|
||
128k 4096 2048
|
||
256k 8096 4096
|
||
|
||
|
||
|
||
2.2 URB Access
|
||
The URB can be written by the following agents:
|
||
|
||
Command Stream (CS) can write constant data into Constant URB Entries (CURBEs) as a result of
|
||
processing CONSTANT_BUFFER commands.
|
||
The Video Front End (VFE) fixed-function unit of the Media pipeline can write thread payload data in
|
||
to its URB entries.
|
||
The Vertex Fetch (VF) fixed-function unit of the 3D pipeline can write vertex data into its URB entries
|
||
Threads can write data into URB entries via URB_WRITE messages sent to the URB shared
|
||
function.
|
||
|
||
The URB can be read by the following agents:
|
||
|
||
The Thread Dispatcher (TD) is the main source of URB reads. As a part of spawning a thread,
|
||
pipeline fixed-functions provide the TD with a number of URB handles, read offsets, and lengths.
|
||
The TD reads the specified data from the URB and provide that data in the thread payload pre-
|
||
loaded into GRF registers.
|
||
The Geometry Shader (GS) and Clipper (CLIP) fixed-function units of the 3D pipeline can read
|
||
selected parts of URB entries to extract vertex data required by the pipeline.
|
||
The Windower (WM) FF unit reads back depth coefficients from URB entries written by the Strip/Fan
|
||
unit.
|
||
|
||
Note that the CPU can not read the URB directly.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 17
|
||
2.3 State
|
||
The URB function is stateless, with all information required to perform a function being passed in the write
|
||
message.
|
||
See URB Allocation (Graphics Processing Engine ) for a discussion of how the URB is divided amongst the
|
||
various fixed functions.
|
||
|
||
|
||
2.4 URB Messages
|
||
This section documents the global aspects of the URB messages. The actual data stored in URB entries
|
||
differs for each fixed function – refer to 3D Pipeline and the fixed-function chapters or details on 3D URB
|
||
data formats and Media for media-specific URB data formats.
|
||
URB Handles: Unlike prior products where the URB handle contents was not specified for software use,
|
||
URB handles are now specified as offsets into the URB partition in the L3 cache, in 512-bit units. Thus,
|
||
kernels are now allowed to perform math operations on URB handles.
|
||
|
||
The End of Thread bit in the message descriptor may be set on URB messages only in threads
|
||
dispatched by the vertex shader (VS), hull shader (HS), domain shader (DS), and geometry shader
|
||
(GS). The End of Thread bit cannot be set on URB_READ* or URB_ATOMIC* messages.
|
||
|
||
Execution Mask. The low 8 bits of the execution mask on the send instruction determines which DWords
|
||
from each write data phase are written or which DWords from each read phase are written to the
|
||
destination GRF register. The execution mask is ignored on URB_ATOMIC* messages, since this is a
|
||
scalar operation that is always enabled.
|
||
Out-of-Bounds Accesses. Reads to addresses outside of the URB region allocated in the L3 cache
|
||
return 0. Writes to addresses outside of the URB region are dropped and will not modify any URB data.
|
||
Header Shared Local Memory Stateless Vector
|
||
Message Type Required Support Support Address Modes Width
|
||
URB Read yes N/A N/A 1, 2
|
||
HWORD
|
||
handle + URBoffset
|
||
or
|
||
handle + URBoffset +
|
||
offset
|
||
URB Write yes N/A N/A 1, 2
|
||
HWORD
|
||
handle + URBoffset
|
||
or
|
||
handle + URBoffset +
|
||
offset
|
||
URB Read yes N/A N/A 1, 2
|
||
OWORD
|
||
handle + URBoffset
|
||
or
|
||
handle + URBoffset +
|
||
offset
|
||
URB Write yes N/A N/A 1, 2
|
||
OWORD
|
||
handle + URBoffset
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 18
|
||
Header Shared Local Memory Stateless Vector
|
||
Message Type Required Support Support Address Modes Width
|
||
or
|
||
handle + URBoffset +
|
||
offset
|
||
URB Atomic yes N/A N/A handle + URBoffset 1
|
||
MOV
|
||
URB Atomic INC yes N/A N/A handle + URBoffset 1
|
||
|
||
“offset” is in the message payload, and is per-slot.
|
||
“handle” is the handle address in the message header.
|
||
“URBoffset” is the Global Offset field in the URB message descriptor.
|
||
|
||
|
||
2.4.1 Execution Mask
|
||
The Execution Mask specified in the ‘send’ instruction determines which DWords within each message
|
||
register are read/written to the URB.
|
||
|
||
|
||
2.4.2 Message Descriptor
|
||
Bit Description
|
||
19 Header Present
|
||
This bit must be set to one for all URB messages.
|
||
|
||
18:17 Ignored
|
||
16
|
||
Per Slot offset: If clear, the slot offset fields in the header are ignored.
|
||
|
||
If set the slot offset fields are added to the global offset to obtain the overall offset.
|
||
Programming Notes:
|
||
This bit must be 0 for URB_ATOMIC_* messages.
|
||
|
||
15
|
||
Complete
|
||
|
||
For URB_WRITE*, URB_SIMD8_WRITE and URB_ATOMIC*: This bit is ignored.
|
||
For URB_READ* and URB_SIMD8_READ: If set, this signals that the thread is finished reading from the
|
||
URB entry(s) referenced by the handles(s), causing the entry(s) to be deallocated.
|
||
This bit is strictly control information passed to snooping FF units. The URB shared function
|
||
itself does not use this bit for any purpose.
|
||
14
|
||
Swizzle Control. This field is used to specify which “swizzle” operation is to be performed on the write
|
||
data. It indirectly specifies whether one or two handles are valid.
|
||
0: URB_NOSWIZZLE
|
||
The message accesses a single URB entry (using URB Handle 0).
|
||
|
||
1: URB_INTERLEAVED
|
||
The message accesses two URB entries. The data is interleaved such that the upper DWords (7:4) of
|
||
each 256-bit unit contain data associated with URB Handle 1, and the lower DWords (3:0) contain data
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 19
|
||
Bit Description
|
||
associated with URB Handle 0.
|
||
|
||
13:3
|
||
Global Offset. This field specifies a destination offset (in 256-bit units) from the start of the URB entry(s),
|
||
as referenced by URB Handle n, at which the data (if any) will be written to or read from.
|
||
|
||
When URB_INTERLEAVED is used, this field provides a 256-bit granular offset applied to both
|
||
URB entries.
|
||
If the Per Slot Offset bit is set, this offset is added to the per-slot offsets in the header to obtain the
|
||
overall offset.
|
||
For the URB_*_OWORD messages, this offset is in 128-bit units instead of 256-bit units.
|
||
For the URB_ATOMIC* messages, this offset is in 32-bit units instead of 256-bit units.
|
||
Format = U11
|
||
Range = [0, 1023] for URB_*_HWORD messages.
|
||
Range = [0, 2047] for URB_*_OWORD messages.
|
||
Range = [0, 2047] for URB_ATOMIC* messages.
|
||
2:0
|
||
URB Opcode
|
||
|
||
0: URB_WRITE_HWORD
|
||
1: URB_WRITE_OWORD
|
||
2: URB_READ_HWORD
|
||
3: URB_READ_OWORD
|
||
4: URB_ATOMIC_MOV
|
||
5: URB_ATOMIC_INC
|
||
6-7: Reserved
|
||
|
||
|
||
|
||
2.4.3 URB_WRITE* and URB_READ*
|
||
The URB_WRITE* and URB_READ* messages share the same header definition. URB_WRITE has
|
||
additional payload containing the write data, but has no writeback message. URB_READ has no payload
|
||
beyond the header (message length is always one), but always has a writeback message.
|
||
URB_WRITE_SIMD4x2 has a single-phase payload with the per-slot offsets followed by the write data,
|
||
and has no writeback message. URB_READ_SIMD4x2 has a single phase payload containing the per-
|
||
slot offsets.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 20
|
||
2.4.3.1 Message Header
|
||
M0.5[7:0] bits in message header are used for enabling DWs in cull test, at HDC unit by HS kernel, while
|
||
writing TF data using URB write messages. Cull test is performed on outside TF and HS kernel set the
|
||
appropriate DW enable, which carry the TF for different domain types. When DW is enabled and if cull
|
||
test is positive, HS stage will be informed by HDC unit, to cull the HS handle early at HS stage itself.
|
||
DWord Bits Description
|
||
M0.7 31:0
|
||
Reserved
|
||
|
||
M0.6 31:0
|
||
Reserved
|
||
|
||
M0.5 31:17 Ignored
|
||
16
|
||
High OWORD Enable
|
||
|
||
For URB_READ_OWORD and URB_WRITE_OWORD with
|
||
NOSWIZZLE indicates whether the 128 bits of the GRF
|
||
register is used.
|
||
0: 1 OWord, read into or written from the low 128 bits of the
|
||
GRF register
|
||
1: 1 OWord, read into or written from the high 128 bits of the
|
||
GRF register
|
||
15
|
||
Vertex 1 DATA [3] / Vertex 0 DATA[7] Channel Mask
|
||
When Swizzle Control = URB_INTERLEAVED this bit controls
|
||
Vertex 1 DATA[3], when Swizzle Control = URB_NOSWIZZLE
|
||
this bit controls Vertex 0 DATA[7]. This bit is ANDed with the
|
||
corresponding channel enable to determine the final channel
|
||
enable. For the URB_READ_OWORD &
|
||
URB_READ_HWORD messages, when final channel enable
|
||
is 1 it indicates that Vertex 1 DATA [3] will be included in the
|
||
writeback message. For the URB_WRITE_OWORD &
|
||
URB_WRITE_HWORD messages, when final channel enable
|
||
is 1 it indicates that Vertex 1 DATA [3] will be written to the
|
||
surface.
|
||
0: Vertex 1 DATA [3] / Vertex 0 DATA[7] channel not included
|
||
1: Vertex DATA [3] / Vertex 0 DATA[7] channel included
|
||
14
|
||
Vertex 1 DATA [2] Channel Mask
|
||
|
||
13
|
||
Vertex 1 DATA [1] Channel Mask
|
||
|
||
12
|
||
Vertex 1 DATA [0] Channel Mask
|
||
|
||
11
|
||
Vertex 0 DATA [3] Channel Mask
|
||
|
||
10
|
||
Vertex 0 DATA [2] Channel Mask
|
||
|
||
9
|
||
Vertex 0 DATA [1] Channel Mask
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 21
|
||
DWord Bits Description
|
||
8
|
||
Vertex 0 DATA [0] Channel Mask
|
||
|
||
7:0
|
||
Reserved
|
||
|
||
M0.4 31:0
|
||
Slot 1 Offset. This field, after adding to the Global Offset field in
|
||
the message descriptor, specifies the offset (in 256-bit units)
|
||
from the start of the URB entry, as referenced by URB Handle
|
||
1, at which the data will be accessed. This field is ignored
|
||
unless Swizzle Control is set to URB_INTERLEAVED.
|
||
For the URB_*_OWORD messages, this offset is in 128-bit
|
||
units instead of 256-bit units.
|
||
Format = U32
|
||
Range = [0, 1023] for URB_*_HWORD messages. The range
|
||
of the calculated offset must fall within the range [0, 1023] or
|
||
behavior is undefined.
|
||
Range = [0, 2047] for URB_*_OWORD messages. The range
|
||
of the calculated offset must fall within the range [0, 2047] or
|
||
behavior is undefined.
|
||
M0.3 31:0
|
||
Slot 0 Offset. This field, after adding to the Global Offset field in
|
||
the message descriptor, specifies the offset (in 256-bit units)
|
||
from the start of the URB entry, as referenced by URB Handle
|
||
0, at which the data will be accessed.
|
||
|
||
For the URB_*_OWORD messages, this offset is in 128-bit
|
||
units instead of 256-bit units.
|
||
Format = U32
|
||
Range = [0, 1023] for URB_*_HWORD messages. The range
|
||
of the calculated offset must fall within the range [0, 1023] or
|
||
behavior is undefined.
|
||
Range = [0, 2047] for URB_*_OWORD messages. The range
|
||
of the calculated offset must fall within the range [0, 2047] or
|
||
behavior is undefined.
|
||
31:16
|
||
M0.2 : GS Number of Output Vertices for Slot 1. Indicates the number
|
||
of vertices output for geometry shader slot 1 primitive. This
|
||
field is only defined if end-of-thread is set on the message. It is
|
||
ignored for all messages from non-GS threads.
|
||
Format = U16
|
||
|
||
15:0 : GS Number of Output Vertices for Slot 0. Indicates the number
|
||
of vertices output for geometry shader slot 0 primitive. This
|
||
field is only defined if end-of-thread is set on the message. It is
|
||
ignored for all messages from non-GS threads.
|
||
Format = U16
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 22
|
||
DWord Bits Description
|
||
M0.1 31:16
|
||
: Handle ID 1. This ID is assigned by the fixed function unit and
|
||
links the work in channel 1 to a specific entry within the fixed
|
||
function unit. This field is ignored unless Swizzle Control
|
||
indicates Interleave mode.
|
||
15:0
|
||
URB Handle 1. This is the URB handle where channel 1’s
|
||
results are to be written or read. This field is ignored unless
|
||
Swizzle Control indicates interleave mode.
|
||
|
||
M0.0 31:16
|
||
Handle ID 0. This ID is assigned by the fixed function unit and
|
||
links the work in channel 0 to a specific entry within the fixed
|
||
function unit.
|
||
15:0
|
||
URB Handle 0. This is the URB handle where channel 0’s
|
||
results are to be written or read.
|
||
|
||
|
||
2.4.3.2 URB_WRITE_HWORD Write Data Payload
|
||
For the URB_WRITE_HWORD messages, the message payload will be written to the URB entries
|
||
indicated by the URB return handles in the message header.
|
||
Payload Usage
|
||
URB_NOSWIZZLE
|
||
The message payload contains data to be written to a single URB entry (e.g.,
|
||
one Vertex URB entry). The Swizzle Control field of the message descriptor must
|
||
be set to ‘NoSwizzle’.
|
||
URB_INTERLEAVED
|
||
The message payload contains data to be written to two separate URB entries.
|
||
The payload data is provided in a high/low interleaved fashion. The Swizzle
|
||
Control field of the message descriptor must be set to ‘Interleave’.
|
||
|
||
|
||
2.4.3.2.1 URB_NOSWIZZLE
|
||
URB_NOSWIZZLE is used to simply write data into consecutive URB locations (no data swizzling
|
||
applied).
|
||
Programming Notes:
|
||
|
||
The URB function will use (not ignore) the Channel Enables associated with this message.
|
||
|
||
When URB_NOSWIZZLE is used to write vertex data, the following table shows an example layout of a
|
||
URB_NOSWIZZLE payload containing one (non-interleaved) vertex containing n pairs of 4-DWord vertex
|
||
elements (where for the example, n is >2).
|
||
DWord Bit Description
|
||
M1.7 31:0
|
||
Vertex Data [7]
|
||
|
||
M1.6 31:0
|
||
Vertex Data [6]
|
||
|
||
M1.5 31:0
|
||
Vertex Data [5]
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 23
|
||
DWord Bit Description
|
||
M1.4 31:0
|
||
Vertex Data [4]
|
||
|
||
M1.3 31:0
|
||
Vertex Data [3]
|
||
|
||
M1.2 31:0
|
||
Vertex Data [2]
|
||
|
||
M1.1 31:0
|
||
Vertex Data [1]
|
||
|
||
M1.0 31:0
|
||
Vertex Data [0]
|
||
|
||
M2.7 31:0
|
||
Vertex Data [15]
|
||
|
||
M2.6 31:0
|
||
Vertex Data [14]
|
||
|
||
M2.5 31:0
|
||
Vertex Data [13]
|
||
|
||
M2.4 31:0
|
||
Vertex Data [12]
|
||
|
||
M2.3 31:0
|
||
Vertex Data [11]
|
||
|
||
M2.2 31:0
|
||
Vertex Data [10]
|
||
|
||
M2.1 31:0
|
||
Vertex Data [9]
|
||
|
||
M2.0 31:0
|
||
Vertex Data [8]
|
||
|
||
…
|
||
…
|
||
|
||
Mn.7 31:0
|
||
Vertex Data [8(n-1)+7]
|
||
|
||
Mn.6 31:0
|
||
Vertex Data [8(n-1)+6]
|
||
|
||
Mn.5 31:0
|
||
Vertex Data [8(n-1)+5]
|
||
|
||
Mn.4 31:0
|
||
Vertex Data [8(n-1)+4]
|
||
|
||
Mn.3 31:0
|
||
Vertex Data [8(n-1)+3]
|
||
|
||
Mn.2 31:0
|
||
Vertex Data [8(n-1)+2]
|
||
|
||
Mn.1 31:0
|
||
Vertex Data [8(n-1)+1]
|
||
|
||
Mn.0 31:0
|
||
Vertex Data [8(n-1)+0]
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 24
|
||
2.4.3.2.2 URB_INTERLEAVED
|
||
The following table shows an example layout of a URB_INTERLEAVED payload containing two
|
||
interleaved vertices, each containing n 4-DWord vertex elements (n>1).
|
||
Programming Restrictions:
|
||
|
||
The URB function will use (not ignore) the Channel Enables associated with this message.
|
||
Writes to overlapping addresses of vertex0 and vertex1 will have undefined write ordering.
|
||
DWord Bit Description
|
||
M1.7 31:0
|
||
Vertex 1 Data [3]
|
||
|
||
M1.6 31:0
|
||
Vertex 1 Data [2]
|
||
|
||
M1.5 31:0
|
||
Vertex 1 Data [1]
|
||
|
||
M1.4 31:0
|
||
Vertex 1 Data [0]
|
||
|
||
M1.3 31:0
|
||
Vertex 0 Data [3]
|
||
|
||
M1.2 31:0
|
||
Vertex 0 Data [2]
|
||
|
||
M1.1 31:0
|
||
Vertex 0 Data [1]
|
||
|
||
M1.0 31:0
|
||
Vertex 0 Data [0]
|
||
|
||
M2.7 31:0
|
||
Vertex 1 Data [7]
|
||
|
||
M2.6 31:0
|
||
Vertex 1 Data [6]
|
||
|
||
M2.5 31:0
|
||
Vertex 1 Data [5]
|
||
|
||
M2.4 31:0
|
||
Vertex 1 Data [4]
|
||
|
||
M2.3 31:0
|
||
Vertex 0 Data [7]
|
||
|
||
M2.2 31:0
|
||
Vertex 0 Data [6]
|
||
|
||
M2.1 31:0
|
||
Vertex 0 Data [5]
|
||
|
||
M2.0 31:0
|
||
Vertex 0 Data [4]
|
||
|
||
…
|
||
…
|
||
|
||
Mn.7 31:0
|
||
Vertex 1 Data [4(n-1)+3]
|
||
|
||
Mn.6 31:0
|
||
Vertex 1 Data [4(n-1)+2]
|
||
|
||
Mn.5 31:0
|
||
Vertex 1 Data [4(n-1)+1]
|
||
|
||
Mn.4 31:0
|
||
Vertex 1 Data [4(n-1)+0]
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 25
|
||
DWord Bit Description
|
||
Mn.3 31:0
|
||
Vertex 0 Data [4(n-1)+3]
|
||
|
||
Mn.2 31:0
|
||
Vertex 0 Data [4(n-1)+2]
|
||
|
||
Mn.1 31:0
|
||
Vertex 0 Data [4(n-1)+1]
|
||
|
||
Mn.0 31:0
|
||
Vertex 0 Data [4(n-1)+0]
|
||
|
||
|
||
|
||
2.4.3.3 URB_READ_HWORD Writeback Message
|
||
For the URB_READ_HWORD messages, the URB entries indicated by the URB handles in the message
|
||
header are read and returned in the writeback message. The amount of read data returned is determined
|
||
by the Response Length field.
|
||
While GS threads will read one vertex at a time to the URB, the VS will read two interleaved vertices. The
|
||
description of the URB read messages will refer to the per-vertex DWords described in the Vertex URB
|
||
Entry Formats section of the 3D Overview chapter.
|
||
Payload Usage
|
||
URB_NOSWIZZLE
|
||
The writeback message contains data read from a single URB entry (e.g., one
|
||
Vertex URB entry). The Swizzle Control field of the message descriptor must be
|
||
set to ‘NoSwizzle’.
|
||
URB_INTERLEAVED
|
||
The writeback message contains data read from two separate URB entries. The
|
||
data is provided in a high/low interleaved fashion. The Swizzle Control field of the
|
||
message descriptor must be set to ‘Interleave’.
|
||
|
||
|
||
2.4.3.3.1 URB_NOSWIZZLE
|
||
URB_NOSWIZZLE is used to simply read data into consecutive URB locations (no data interleaving
|
||
applied).
|
||
When URB_NOSWIZZLE is used to read vertex data, the following table shows an example layout of a
|
||
URB_NOSWIZZLE writeback message containing one (non-interleaved) vertex containing n pairs of 4-
|
||
DWord vertex elements (where for the example, n is >2).
|
||
DWord Bit Description
|
||
W0.7 31:0
|
||
Vertex Data [7]
|
||
|
||
W0.6 31:0
|
||
Vertex Data [6]
|
||
|
||
W0.5 31:0
|
||
Vertex Data [5]
|
||
|
||
W0.4 31:0
|
||
Vertex Data [4]
|
||
|
||
W0.3 31:0
|
||
Vertex Data [3]
|
||
|
||
W0.2 31:0
|
||
Vertex Data [2]
|
||
|
||
W0.1 31:0
|
||
Vertex Data [1]
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 26
|
||
DWord Bit Description
|
||
W0.0 31:0
|
||
Vertex Data [0]
|
||
|
||
W1.7 31:0
|
||
Vertex Data [15]
|
||
|
||
W1.6 31:0
|
||
Vertex Data [14]
|
||
|
||
W1.5 31:0
|
||
Vertex Data [13]
|
||
|
||
W1.4 31:0
|
||
Vertex Data [12]
|
||
|
||
W1.3 31:0
|
||
Vertex Data [11]
|
||
|
||
W1.2 31:0
|
||
Vertex Data [10]
|
||
|
||
W1.1 31:0
|
||
Vertex Data [9]
|
||
|
||
W1.0 31:0
|
||
Vertex Data [8]
|
||
|
||
…
|
||
…
|
||
|
||
Wn.7 31:0
|
||
Vertex Data [8n+7]
|
||
|
||
Wn.6 31:0
|
||
Vertex Data [8n+6]
|
||
|
||
Wn.5 31:0
|
||
Vertex Data [8n+5]
|
||
|
||
Wn.4 31:0
|
||
Vertex Data [8n+4]
|
||
|
||
Wn.3 31:0
|
||
Vertex Data [8n+3]
|
||
|
||
Wn.2 31:0
|
||
Vertex Data [8n+2]
|
||
|
||
Wn.1 31:0
|
||
Vertex Data [8n+1]
|
||
|
||
Wn.0 31:0
|
||
Vertex Data [8n+0]
|
||
|
||
|
||
2.4.3.3.2 URB_INTERLEAVED
|
||
The following table shows an example layout of a URB_INTERLEAVED payload containing two
|
||
interleaved vertices, each containing n 4-DWord vertex elements (n>1).
|
||
DWord Bit Description
|
||
W0.7 31:0
|
||
Vertex 1 Data [3]
|
||
|
||
W0.6 31:0
|
||
Vertex 1 Data [2]
|
||
|
||
W0.5 31:0
|
||
Vertex 1 Data [1]
|
||
|
||
W0.4 31:0
|
||
Vertex 1 Data [0]
|
||
|
||
W0.3 31:0
|
||
Vertex 0 Data [3]
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 27
|
||
DWord Bit Description
|
||
W0.2 31:0
|
||
Vertex 0 Data [2]
|
||
|
||
W0.1 31:0
|
||
Vertex 0 Data [1]
|
||
|
||
W0.0 31:0
|
||
Vertex 0 Data [0]
|
||
|
||
W1.7 31:0
|
||
Vertex 1 Data [7]
|
||
|
||
W1.6 31:0
|
||
Vertex 1 Data [6]
|
||
|
||
W1.5 31:0
|
||
Vertex 1 Data [5]
|
||
|
||
W1.4 31:0
|
||
Vertex 1 Data [4]
|
||
|
||
W1.3 31:0
|
||
Vertex 0 Data [7]
|
||
|
||
W1.2 31:0
|
||
Vertex 0 Data [6]
|
||
|
||
W1.1 31:0
|
||
Vertex 0 Data [5]
|
||
|
||
W1.0 31:0
|
||
Vertex 0 Data [4]
|
||
|
||
…
|
||
…
|
||
|
||
Wn.7 31:0
|
||
Vertex 1 Data [4n+3]
|
||
|
||
Wn.6 31:0
|
||
Vertex 1 Data [4n+2]
|
||
|
||
Wn.5 31:0
|
||
Vertex 1 Data [4n+1]
|
||
|
||
Wn.4 31:0
|
||
Vertex 1 Data [4n+0]
|
||
|
||
Wn.3 31:0
|
||
Vertex 0 Data [4n+3]
|
||
|
||
Wn.2 31:0
|
||
Vertex 0 Data [4n+2]
|
||
|
||
Wn.1 31:0
|
||
Vertex 0 Data [4n+1]
|
||
|
||
Wn.0 31:0
|
||
Vertex 0 Data [4n+0]
|
||
|
||
|
||
|
||
2.4.3.4 URB_WRITE_OWORD Write Data Payload
|
||
For the URB_WRITE_OWORD messages, the message payload will be written to the URB entries
|
||
indicated by the URB return handles in the message header.
|
||
Payload Usage
|
||
URB_NOSWIZZLE
|
||
The message payload contains data to be written to a single URB entry (e.g.,
|
||
one Vertex URB entry). The Swizzle Control field of the message descriptor must
|
||
be set to ‘NoSwizzle’.
|
||
URB_INTERLEAVED
|
||
The message payload contains data to be written to two separate URB entries.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 28
|
||
Payload Usage
|
||
The payload data is provided in a high/low interleaved fashion. The Swizzle
|
||
Control field of the message descriptor must be set to ‘Interleave’.
|
||
|
||
|
||
2.4.3.4.1 URB_NOSWIZZLE
|
||
URB_NOSWIZZLE is used to simply write data into a single 128-bit URB location (no data swizzling
|
||
applied).
|
||
Programming Notes:
|
||
|
||
The URB function will use (not ignore) the Channel Enables associated with this message.
|
||
|
||
When URB_NOSWIZZLE is used to write vertex data, the following table shows an example layout of a
|
||
URB_NOSWIZZLE payload containing one (non-interleaved) vertex containing 4-DWord vertex elements
|
||
and HIGH OWORD ENABLE is 0.
|
||
DWord Bit Description
|
||
M1.7 31:0 Ignored
|
||
M1.6 31:0 Ignored
|
||
M1.5 31:0 Ignored
|
||
M1.4 31:0 Ignored
|
||
M1.3 31:0
|
||
Vertex 0 Data [3]
|
||
|
||
M1.2 31:0
|
||
Vertex 0 Data [2]
|
||
|
||
M1.1 31:0
|
||
Vertex 0 Data [1]
|
||
|
||
M1.0 31:0
|
||
Vertex 0 Data [0]
|
||
|
||
When URB_NOSWIZZLE is used to write vertex data, the following table shows an example layout of a
|
||
URB_NOSWIZZLE payload containing one (non-interleaved) vertex containing 4-DWord vertex elements
|
||
and HIGH OWORD ENABLE is 1.
|
||
DWord Bit Description
|
||
M1.7 31:0
|
||
Vertex 0 Data [3]
|
||
|
||
M1.6 31:0
|
||
Vertex 0 Data [2]
|
||
|
||
M1.5 31:0
|
||
Vertex 0 Data [1]
|
||
|
||
M1.4 31:0
|
||
Vertex 0 Data [0]
|
||
|
||
M1.3 31:0 Ignored
|
||
M1.2 31:0 Ignored
|
||
M1.1 31:0 Ignored
|
||
M1.0 31:0 Ignored
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 29
|
||
2.4.3.4.2 URB_INTERLEAVED
|
||
The following table shows an example layout of a URB_INTERLEAVED payload containing two
|
||
interleaved vertices, each containing 4-DWord vertex elements.
|
||
Programming Restrictions:
|
||
|
||
The URB function will use (not ignore) the Channel Enables associated with this message.
|
||
Writes to overlapping addresses of vertex0 and vertex1 will have undefined write ordering.
|
||
DWord Bit Description
|
||
M1.7 31:0
|
||
Vertex 1 Data [3]
|
||
|
||
M1.6 31:0
|
||
Vertex 1 Data [2]
|
||
|
||
M1.5 31:0
|
||
Vertex 1 Data [1]
|
||
|
||
M1.4 31:0
|
||
Vertex 1 Data [0]
|
||
|
||
M1.3 31:0
|
||
Vertex 0 Data [3]
|
||
|
||
M1.2 31:0
|
||
Vertex 0 Data [2]
|
||
|
||
M1.1 31:0
|
||
Vertex 0 Data [1]
|
||
|
||
M1.0 31:0
|
||
Vertex 0 Data [0]
|
||
|
||
|
||
|
||
2.4.3.5 URB_READ_OWORD Writeback Message
|
||
For the URB_READ_HWORD messages, the URB entries indicated by the URB handles in the message
|
||
header are read and returned in the writeback message. The amount of read data returned is determined
|
||
by the Response Length field.
|
||
Programming Restrictions:
|
||
|
||
Response Length must be set to 1.
|
||
|
||
While GS threads will read one vertex at a time to the URB, the VS will read two interleaved vertices. The
|
||
description of the URB read messages will refer to the per-vertex DWords described in the Vertex URB
|
||
Entry Formats section of the 3D Overview chapter.
|
||
Payload Usage
|
||
URB_NOSWIZZLE
|
||
The writeback message contains data read from a single URB entry (e.g., one
|
||
Vertex URB entry). The Swizzle Control field of the message descriptor must be
|
||
set to ‘NoSwizzle’.
|
||
URB_INTERLEAVED
|
||
The writeback message contains data read from two separate URB entries. The
|
||
data is provided in a high/low interleaved fashion. The Swizzle Control field of the
|
||
message descriptor must be set to ‘Interleave’.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 30
|
||
2.4.3.5.1 URB_NOSWIZZLE
|
||
URB_NOSWIZZLE is used to simply read data into consecutive URB locations (no data interleaving
|
||
applied).
|
||
When URB_NOSWIZZLE is used to read vertex data, the following table shows an example layout of a
|
||
URB_NOSWIZZLE writeback message containing one (non-interleaved) vertex containing 4-DWord
|
||
vertex elements and HIGH OWORD ENABLE is 0.
|
||
DWord Bit Description
|
||
W0.7 31:0 Reserved (not written to GRF)
|
||
W0.6 31:0 Reserved (not written to GRF)
|
||
W0.5 31:0 Reserved (not written to GRF)
|
||
W0.4 31:0 Reserved (not written to GRF)
|
||
W0.3 31:0
|
||
Vertex Data [3]
|
||
|
||
W0.2 31:0
|
||
Vertex Data [2]
|
||
|
||
W0.1 31:0
|
||
Vertex Data [1]
|
||
|
||
W0.0 31:0
|
||
Vertex Data [0]
|
||
|
||
When URB_NOSWIZZLE is used to read vertex data, the following table shows an example layout of a
|
||
URB_NOSWIZZLE writeback message containing one (non-interleaved) vertex containing 4-DWord
|
||
vertex elements and HIGH OWORD ENABLE is 1.
|
||
DWord Bit Description
|
||
W0.7 31:0
|
||
Vertex Data [3]
|
||
|
||
W0.6 31:0
|
||
Vertex Data [2]
|
||
|
||
W0.5 31:0
|
||
Vertex Data [1]
|
||
|
||
W0.4 31:0
|
||
Vertex Data [0]
|
||
|
||
W0.3 31:0 Reserved (not written to GRF)
|
||
W0.2 31:0 Reserved (not written to GRF)
|
||
W0.1 31:0 Reserved (not written to GRF)
|
||
W0.0 31:0 Reserved (not written to GRF)
|
||
|
||
|
||
2.4.3.5.2 URB_INTERLEAVED
|
||
The following table shows an example layout of a URB_INTERLEAVED payload containing two
|
||
interleaved vertices, each containing 4-DWord vertex elements.
|
||
DWord Bit Description
|
||
W0.7 31:0
|
||
Vertex 1 Data [3]
|
||
|
||
W0.6 31:0
|
||
Vertex 1 Data [2]
|
||
|
||
W0.5 31:0
|
||
Vertex 1 Data [1]
|
||
|
||
W0.4 31:0
|
||
Vertex 1 Data [0]
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 31
|
||
DWord Bit Description
|
||
W0.3 31:0
|
||
Vertex 0 Data [3]
|
||
|
||
W0.2 31:0
|
||
Vertex 0 Data [2]
|
||
|
||
W0.1 31:0
|
||
Vertex 0 Data [1]
|
||
|
||
W0.0 31:0
|
||
Vertex 0 Data [0]
|
||
|
||
|
||
|
||
2.4.4 URB_ATOMIC*
|
||
The URB_ATOMIC messages implement atomic operations on a single DWord in the URB. The location
|
||
of the DWord within the URB is specified by the single URB handle and the Global Offset field in the
|
||
message descriptor, which for these messages is a DWord offset from the URB handle. The DWord
|
||
selected will be operated on according to the following table:
|
||
|
||
URB Opcode new_dst ret
|
||
URB_ATOMIC_MOV
|
||
src0 none
|
||
|
||
URB_ATOMIC_INC
|
||
old_dst + 1 old_dst
|
||
|
||
|
||
|
||
The previous contents of the DWord are returned in the destination register for the URB_ATOMIC_INC.
|
||
The URB_ATOMIC_MOV opcode does not return data (response length must be zero).
|
||
The URB_ATOMIC* messages consist only of the header. A single URB handle is specified.
|
||
|
||
2.4.4.1 Message Header
|
||
DWord Bit Description
|
||
M0.7 31:0
|
||
M0.6 31:0
|
||
M0.5 31:0 Ignored
|
||
M0.4 31:0 Ignored
|
||
M0.3 31:0 Ignored
|
||
M0.2 31:0
|
||
Source0 Data
|
||
|
||
Specifies the source 0 data for the atomic operation. This field is ignored for the
|
||
URB_ATOMIC_INC message.
|
||
Format = U32
|
||
M0.1 31:0 Ignored
|
||
M0.0 31:16 Ignored
|
||
15:0
|
||
URB Handle. This specifies the URB handle to be accessed.
|
||
|
||
|
||
|
||
2.4.4.2 Writeback Message
|
||
A writeback message is only returned for the URB_ATOMIC_INC message. Only the low 32 bits of the
|
||
destination GRF register are overwritten with the return data.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 32
|
||
DWord Bit Description
|
||
W0.7:1 Reserved (not written to GRF)
|
||
W0.0 31:0
|
||
Return Data
|
||
|
||
Specifies the value of the return data for the atomic operation.
|
||
Format = U32
|
||
|
||
Here is a description of the 3DMark11 usage model (from their func spec):
|
||
4.4.1 Depth of Field
|
||
The effect is computed using the following procedure:
|
||
1. Circle of confusion radius is computed for all screen pixels and stored in a full resolution
|
||
DXGI_FORMAT_R16_FLOAT texture.
|
||
2. Half and quarter resolution versions are made from the radius texture and the original illumination texture.
|
||
3. Positions of out-of-focus pixels whose circle of confusion radius exceeds a predefined threshold are appended to
|
||
a buffer.
|
||
4. The position buffer is used as point primitive vertex data and, utilizing Geometry Shader (GS), image of hexagon-
|
||
shaped bokeh is splatted to positions of these vertices. Splatting is done to a
|
||
DXGI_FORMAT_R16G16B16A16_FLOAT texture. Multiple viewports are used to partition the texture to regions with
|
||
different sizes. First region is screen size and the rest are a series of halved regions down to size 1x1 texels. The
|
||
radius of the splatted bokeh determines the used viewport. The larger the radius the smaller the used viewport.
|
||
5. Steps 3 and 4 are done separately for full, half, and quarter resolution image data with different radius thresholds.
|
||
Larger bokehs are generated from lower resolution image data.
|
||
6. The different regions of the splatting texture are combined by up-scaling the data in the smaller regions to the
|
||
screen size region.
|
||
7. The combined splatted out-of-focus illumination is combined with the original illumination.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 33
|
||
3. Shared Functions – Video Motion
|
||
Estimation
|
||
The Video Motion Estimation (VME) engine is a shared function that provides motion estimation services.
|
||
It includes motion estimation for various block sizes and also standard specific operations such as
|
||
|
||
Motion estimation and mode decision for AVC
|
||
Intra prediction and mode decision for AVC
|
||
Motion estimation and mode decision for MPEG2
|
||
Motion estimation and mode decision for VC1
|
||
|
||
The motion estimation engine may also be used for other coding standards or other video processing
|
||
applications.
|
||
|
||
|
||
3.1 Theory of Operation
|
||
VME performs a sequence of operations to find the best mode for a given macroblock. Each operation
|
||
step can be enabled/disabled through the control of the income message. Early termination, skipping of
|
||
subsequent operation steps, is also supported when certain search criteria are met.
|
||
VME contains the following operation steps:
|
||
1. Skip check
|
||
2. IME: Integer motion estimation
|
||
3. FME: Fractional motion estimation
|
||
4. BME: Bidirectional motion estimation
|
||
5. IPE: Intra prediction estimation (AVC only)
|
||
|
||
|
||
3.1.1 Shape Decision
|
||
As a terminology, we call sub-block shapes: 8x4, 4x8, and 4x4 minor shapes (corresponding to sub-
|
||
partitions of 8x8 sub-macroblock), and 16x16, 16x8, 8x16, and 8x8 major shapes (corresponding to sub-
|
||
macroblocks of a 16x16 macroblock).
|
||
If the maximal allowed number of motion vectors MaxNumMVs (MaxNumMVs =
|
||
MaxNumMVsMinusOne + 1) is less than 4, we will set minor MV flag off: MinorMVsFlag = 0, i.e. no
|
||
minor motion vectors will be generated.
|
||
The reason of having this parameter MaxNumMVs is due to high level AVC conformance restrictions for
|
||
certain profiles: the total number of motion vectors of any two consecutive macroblocks not exceeding 16 (or 32) .
|
||
The mechanism here allows a reasonable degree of user control. In disable cases, MaxNumMVs should
|
||
be set to 32.
|
||
In the coding process of VME, the shape decision is done in multiple locations:
|
||
1) After IME and before FME, intermediate shape decision is performed to reduce the FME searching
|
||
candidates
|
||
2) After FME and before BME, existing shape decision is revised among the remaining candidates and
|
||
to see if there is further reduction.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 34
|
||
3) Final shape decision is done after BME.
|
||
Partition decision before BME uses unidirectional motion vector count to meet MaxNumMVs requirement.
|
||
Adding BME for the partition candidates may exceed MaxNumMVs. As BME is performed on a block by
|
||
block basis using the block order for a given partition, BME step for a given block is skipped and the best
|
||
unidirectional motion vectors are used for the block if the overall motion vector count exceeds
|
||
MaxNumMVs when that particular block is switched to bidirectional. The process continues to the last
|
||
block of the partition.
|
||
Note: This is a sub-optimal solution to simplify the hardware implementation. For some cases,
|
||
bidirectional modes with larger sub-partitions might be better than unidirectional modes with finer sub-
|
||
partitions.
|
||
The VME implementation has the following restriction: Multiple partition candidates are only enabled if
|
||
PartCandidateEn is set. And this only applies to source block of size 16x16.
|
||
If PartCandidateEn is not set, only the best partition is kept in state 1 (after IME) above and carried
|
||
through FME and BME. In other words, FME if enabled only operates on one partition candidate, and
|
||
BME if enabled only operates on one partition candidate. Bidirectional mode check only applies to the
|
||
partition candidates that meet the bidirectional restriction provided by BiSubMbPartMask. For example, if
|
||
a minor partition determined based on best unidirectional cost function is not 8x8 but one of 4x8, 8x4 or
|
||
4x4, VME skips the bidirectional mode check.
|
||
If PartCandidateEn is set, up to two sets of candidates are maintained by VME hardware, if the second
|
||
best partition candidate is within PartToleranceThrhd from the best one. The second best partition is
|
||
selected only from the two major partition candidates based on the unidirectional motion vector count,
|
||
subject to that the major partition is enabled:
|
||
|
||
1MV: The 16x16 partition
|
||
4MV: The 4x(8x8) partition with no minor shape
|
||
|
||
The following partitions are not supported as alternative partition.
|
||
|
||
2MV: The best of 2x(16x8) and 2x(8x16) partitions
|
||
More than 4MV: The best of all 4x(8x8) partitions with at least one 8x8 having minor shape of 8x4,
|
||
4x8 or 4x4
|
||
|
||
3.1.1.1 Minor Shape Decision Prior to FME
|
||
If any minor shapes are selected, we decide the best minor first.
|
||
For each 8x8 sub-block, before performing bidirectional, we reduce code candidates to no more than
|
||
three based on the best unidirectional motion search results (best of the forward and backward):
|
||
0) One MV, i.e. the best in shape of 8x8.
|
||
1) Up to two MVs, i.e. the best in shapes 8x8, 8x4, or 4x8. And
|
||
2) Up to four MVs, i.e. the best for the sub-block 8x8.
|
||
Now for the first and the second sub-blocks, we can merge them into up to six candidates of 2, 3, 4, 5, 6,
|
||
and 8 possible motion vectors.
|
||
Do the same to the third and the fourth sub-blocks, we have similarly up to six candidates.
|
||
Now we further combine these two groups, and find the best solution under the constraint of not
|
||
exceeding the number of motion vectors more than MaxNumMVs. (see pseudo-code below for detail.)
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 35
|
||
Consequently, we have the best combined 8x8 solutions with N motion vectors for some N less or equal
|
||
to MaxNumMVs.
|
||
Assume distA[k][s] is the cost-adjusted distortion of the best forward or backward motion vector mix of
|
||
the k-th 8x8 sub-block of the sub-shape s, where s=0,1,2, and 3 represent shape partitioning 8x8, 8x4,
|
||
4x8, and 4x4 respectively. Assume distA[k][s] is the bidirectional one of the corresponding bus-block
|
||
and sub-shape. And assume some large number, say 128x16=2048 is assigned to the variable, if there
|
||
were no valid corresponding codes. Hence, the following pseudo-code explains the code selection
|
||
algorithm.
|
||
Let’s first explain the case MaxNumMVs is disbled, i.e.MaxNumMVs16:
|
||
void SelectBestCombinedMinors(
|
||
short *distA,
|
||
short*MinorShape,
|
||
short*MinorDisto
|
||
){
|
||
shorts[4], d[4];
|
||
s = ShapeList;
|
||
d = DistoList;
|
||
for(int k=0;k<4;k++){
|
||
s[k] = 0;d[k] = distA[k][0];
|
||
if(distA[k][1])<d[k]){ d[k]=distA[k][1]; s[k]=1; }
|
||
if(distA[k][2])<d[k]){ d[k]=distA[k][3]; s[k]=2; }
|
||
if(distA[k][3])<d[k]){ d[k]=distA[k][3]; s[k]=3; }
|
||
}
|
||
*MinorDisto = d[0]+d[1]+d[2]+d[3];
|
||
*MinorShape = s[0]|(s[1]<<2)|(s[2]<<4)|({s[3]<<6};
|
||
}
|
||
|
||
Now for the case of using MaxNumMVs control:
|
||
void SelectBestCombinedMinors(
|
||
short *distA,
|
||
intMaxNumMVs,
|
||
short*MinorShape,
|
||
short*MinorDisto
|
||
){
|
||
int k, n;
|
||
short dist, best0 = 0, best1 = 0;
|
||
if(MaxNumMVs< 4){ // we reset other parameters
|
||
switch(MaxNumMvs){
|
||
case 0:
|
||
DoIntraInter &= (~DO_INTER); // not do Inter
|
||
break;
|
||
case 1:
|
||
ShapeMask |= (NO_16X8|NO_8X16);
|
||
BidirMask |= NO_16X16;
|
||
case 2: case 3:
|
||
ShapeMask |= (NO_8X8|NO_8X4|NO_4X8|NO_4X4);
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 36
|
||
BidirMask |= (NO_16X8|NO_8X16);
|
||
break;
|
||
}
|
||
}
|
||
if(MaxNumMVs>=16){ // it should use unrestricted code selection
|
||
SelectBestCombinedMinors(DistA,MinorShape,MinorDisto);
|
||
return;
|
||
}
|
||
short*s, ShapeList[18];
|
||
short*d, DistoList[18];
|
||
s = ShapeList;
|
||
d = DistoList;
|
||
for(k=0;k<4;k++){
|
||
s[0] = 0;// 1 mv
|
||
d[0] = distA[k][0];
|
||
s[4] = (distA[k][2]<distA[k][1])+1; // 2 mvs
|
||
d[4] = distA[k][s[1]];
|
||
s[8] = 3;// 4 mvs
|
||
d[8] = distA[k][3];
|
||
s ++, d ++;
|
||
}
|
||
// Merge two:
|
||
s = ShapeList;
|
||
d = DistoList;
|
||
for(k=0;k<2;k++){
|
||
s[16]= 0x33; // 8 mvs
|
||
d[16]= d[8]+d[10];
|
||
s[12]= (d[4]+d[10]<d[6]+d[8])?(s[4]|0x30):(0x03|(s[6]<<4));// 6 mvs
|
||
d[12]= (d[4]+d[10]<d[6]+d[8])?(d[4]+d[10])<(d[6]+d[8]);
|
||
s[10]= (d[0]+d[10]<d[8]+d[2])?0x30:0x03; // 5 mvs
|
||
d[10]= (d[0]+d[10]<d[8]+d[2])?(d[0]+d[10])<(d[8]+d[2]);
|
||
s[8] = s[4]|(s[6]<<4);// 4 mvs
|
||
d[8] = d[4]+d[6];
|
||
s[6] = (d[4]+d[2]<d[0]+d[6])?s[4]:(s[6]<<4); // 3 mvs
|
||
d[6] = (d[4]+d[2]<d[0]+d[6])?(d[4]+d[2])<(d[0]+d[6]);
|
||
s[4] = 0; // 2 mvs
|
||
d[4] = d[0]+d[2];
|
||
if(d[ 6]>d[ 4]) d[ 6] = d[ 4];
|
||
if(d[ 8]>d[ 6]) d[ 8] = d[ 6];
|
||
if(d[10]>d[ 8]) d[10] = d[ 8];
|
||
if(d[12]>d[10]) d[12] = d[10];
|
||
d[14] = d[12];
|
||
if(d[16]>d[12]) d[16] = d[12];
|
||
s ++; d ++;
|
||
}
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 37
|
||
s = ShapeList;
|
||
d = DistoList;
|
||
*MinorDisto = 2048;
|
||
for(k=0;k<8;k++){
|
||
n = MaxNumMVs – k;
|
||
if(n>=2 && n<=8)<2){
|
||
dist = d[(k<<1)+1]+d[n<<1];
|
||
if(dist<*MinorDisto){
|
||
*MinorDisto = dist;
|
||
best0 = (n<<1);
|
||
best1 = (k<<1)+1;
|
||
}
|
||
}
|
||
}
|
||
while(best0>1 && d[best0]==d[best0-2]) best0 -= 2;
|
||
while(best1>1 && d[best1]==d[best1-2]) best1 -= 2;
|
||
*MinorShape = s[best0]|((s[best1]<<2);
|
||
}
|
||
|
||
|
||
3.1.1.2 Major Shape Decision Prior to FME
|
||
Now considering the best of each 8x8 is done, and we have the total cost-adjusted-distortion for this sub-
|
||
block level partition. Now among the four choices: the resulting 8x8 sub-partitioning, one 16x16, two
|
||
16x8, and two 8x16, the one gives the best cost-adjusted-distortion, will determine the final decision of
|
||
partitioning shape. Any among these four, if its cost-adjusted-distortion is within the intermediate
|
||
tolerance (which is a predefined system state) from the best distortion will be marked as candidate
|
||
shapes.
|
||
Notice that, when the intermediate tolerance is set to 0, only the best shape will be selected as the
|
||
candidate. When the intermediate tolerance is large, all four shapes will become candidates.
|
||
Assume we have all the distortions for majors enumerated in DistoMajor[k], where k = 0, 1, 2, 3, 4, and
|
||
5, for 16x16, 16x8, 8x16, the combined minors, 16x8 field, and 8x8 field respectively. Assume BestDisto
|
||
is equal to the minimal of the six values DistoMajor[k], for k = 0, …5. Assume the intermediate
|
||
tolerance is IntTol, the major shape k is a candidate shape if and only if
|
||
DistoMajor[k]<=BestDisto+IntTol.
|
||
|
||
3.1.1.3 Shape Update after FME
|
||
Among all the candidate shapes, we recheck the distortion, if any of them is no longer with in the
|
||
intermediate tolerance DistortionTolerance from the best choice; we drop it for reduced calculation.
|
||
|
||
3.1.1.4 Final Code Decision after BME
|
||
For any given candidate shape, for each motion vector, if we do have improved distortion by switch from
|
||
the single direction to bi-direction, then we do it, unless the increased number of motion vectors hits
|
||
above MaxNumMVs; in this case, we take as many as possible first the ones generate the most
|
||
improvement.
|
||
Then, we choose the best among the improved candidate shapes.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 38
|
||
3.1.2 Integer Motion Estimation
|
||
IME, the integer motion estimation, is the most key part of VME. In our current design, the minimal
|
||
functional block is to do a full search over a search unit. This functional block is then called via two
|
||
distinctive methods:
|
||
1) Via a predefined searching path of search units.
|
||
2) Via a dynamic process based on the previous results.
|
||
This section will describe both.
|
||
|
||
3.1.2.1 Reference Window and Search Units
|
||
The reference window is a rectangular region fetched put in the reference cache for VME. Either one or
|
||
two reference windows are allowed to be loaded into the reference cache. In the case of dual windows,
|
||
both windows follow a common search path or different paths (relative to their corresponding Start
|
||
Center) depending on the dual search path option flag.
|
||
The total reference cache is limited to 2K bytes and only the luma component searching is performed. For
|
||
example, we may select the reference windows to be one of the following sample choices: one 64x32
|
||
area, one 48x40 area, two 40x24 areas, or two 32x32 areas, where the possible reference address will
|
||
cover an area of 48x16, 32x24, 24x8, and 16x16.
|
||
As a convention, we will call the valid reference addressing region the reference region, and its width and
|
||
height are called the reference window width and height respectively. So the reference loading region of
|
||
VME has therefore 16 more columns and 16 more rows.
|
||
It is not efficient for hardware to search one location at a time due to reference cache access bandwidth and
|
||
latency constraints. Thus, possible reference search locations are grouped in a predefined pattern, and all
|
||
locations within the same group must be either all are chosen or all are skipped. These predefined groups
|
||
are called search unit (SU). Reference Window and Search Units shows a sample of grouping search locations
|
||
into searching units. The reference window in the figure has a dimension of 32x20, and assuming the
|
||
source block is 8x8, the dark dots indicate all legitimate reference locations for motion searching. It shows
|
||
a partitioning of SUs of 16 locations.
|
||
In general, the indices of SUs are given by counting rows and units within the row.
|
||
|
||
|
||
|
||
|
||
Example of Search Units in a reference window
|
||
Given a fixed reference cache access latency, SU size is determined solely based on the source block
|
||
size as shown in Reference Window and Search Units. Note that SU sizes for both 16x8 and 8x16 source
|
||
blocks are both 8x4, which gives a preference for motions along horizontal direction.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 39
|
||
Determination of Search Unit size based on Source Block dimension
|
||
Source Block Dimension Search Unit (SU) Size (X x Y) GT Support
|
||
16x16 4x4 Y
|
||
16x8 8x4 Y
|
||
8x16 8x4 N
|
||
8x8 8x8 Y
|
||
|
||
To keep tracking on whether a SU has been searched or not, an equivalent hardware process is
|
||
implemented performing as a search record that marks whether any search units being searched is a bit-
|
||
plan of the bit-length equal to the maximal index of SUs. Before searching starts, the search record must
|
||
be reset which sets the value 0 (= yet-to-be-searched) to all legitimate SU indices, and the value 1 (= no
|
||
longer available) for other SUs that are not intended to be searched.
|
||
Given a search window, unique indices are assigned to all SUs. A search path (SP), is a sequence of such
|
||
indices. The number of SUs in a SP is called the length of the walker (denoted by LenSP here), which shall be
|
||
a number more than one. Instead of storing the absolute indices of a search path, relative search unit deltas
|
||
are sent instead. In the current VME a search unit delta is a 8 bit index consisting of a pair of 4-bit signed
|
||
integers in [-8,8).
|
||
|
||
Given start center in a pair of 4-bit unsigned integer (sx, sy), and denote a search path described in SU deltas
|
||
(dx[i],dy[i]). The first search unit SU[0] will be the search unit which has the first reference address (sx*4,
|
||
sy*4) in integer-pel relative to the reference origin., i.e.
|
||
|
||
SU[0].x = sx*4, and SU[0].y = sy*4.
|
||
|
||
The second search unit SU[1] is derived by adding (dx[0],dy[0]):
|
||
|
||
SU[1].x = SU[0].x + dx[0]*4, and SU[1].y = SU[0].y + dy[0]*4.
|
||
In general, we have:
|
||
SU[i+1].x = SU[i].x + dx[i]*4, and SU[i+1].y = SU[i].y + dy[i]*4.
|
||
|
||
When SU[i] is out of range, it is either always skipped or always wrapped depending on the SU wrapping flag.
|
||
When the SU wrapping flag is on, it is equivalent to as we perform
|
||
SU[i].x = SU[i].x(mod ref_win_width), and
|
||
|
||
SU[i].y = SU[i].y(mod ref_win_height),
|
||
As a convention, a NULL delta marks the end of the search path.
|
||
|
||
3.1.2.2 Fixed and Adaptive Search Paths
|
||
A fixed pattern motion search algorithm is an algorithm following some predefined SP with the designated
|
||
MaxNumSU (maximal number of search units) less or equal to LenSP (the fixed search path length). This is
|
||
referred to as fixed pattern searching or predetermined searching.
|
||
When MaxNumSU > LenSP, (the maximal number of SU is more than what are given by the SP), the
|
||
searching continues unless reaching a local minimum, which is called dynamic searching or adaptive
|
||
searching or gradient searching. In this case, the current best result is used. If it is located in some SU
|
||
boundary, the neighborhood SUs are checked and any one of them that is yet-to-be-searched will be the
|
||
next SU to be searched. If all neighbor SU’s are done, the process of IME is done. Fixed and Adaptive
|
||
Search paths illustrates on how neighbor SUs are defined for dynamic search.
|
||
|
||
Hardware maintains one scoreboard per reference to keep track of the state of SUs, whether being
|
||
searched or yet-to-be-searched. When dual records are enabled on a single reference, both records will
|
||
share the same scoreboard for the reference.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 40
|
||
Sample neighborhood SUs in a dynamic search
|
||
|
||
|
||
Fixed and Adaptive Search paths shows the algorithm of this integrated solution. In order to hide the decision
|
||
logic of dynamic walking, the one-step-delayed-queue is implemented. So when searching the current
|
||
SU, the next SU will be put in the queue. If there are more SUs yet to be searched in the current SP, the
|
||
next SU will be the next SU according to SP; if there is no more SU from SP, the first unsearched
|
||
neighbor SU (in some predefined order) based on the current best result will be put instead, and if there is
|
||
no more unsearched neighbor SU, the integer searching terminates.
|
||
To reduce the one-step-delay, and to support bidirectional, we create the dual mode that allows the
|
||
above algorithm to be ping-pong-ed between two search paths. Fixed and Adaptive Search paths illustrates
|
||
this case.
|
||
In both figures, the best MVs refer to the best resulting motion vectors so far. There are potentially total
|
||
41 motion vectors (1 for 16x16, 2 for 16x8, 2 for 8x16, 4 for 8x8, and 32 more for 8x4, 4x8 and 4x4
|
||
cases). The current hardware implementation only considers the four 8x8 MVs.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 41
|
||
VME in single SP mode
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 42
|
||
VME in Dual SP mode
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 43
|
||
3.1.3 Fractional Motion Estimation
|
||
Instead of following the exact interpolation as specified by the individual video standards, 4 tap
|
||
interpolation is used for the Fractional Motion Estimation (FME) step in the VME engine. It is expected to
|
||
be adjusted according to different standards.
|
||
|
||
3.1.3.1 Interpolations
|
||
Instead of following the exact interpolation as specified by the individual video standards, fixed 4 tap
|
||
interpolation is used in the VME engine, as defined below:
|
||
1) (-1,5,5,-1)/8 for ½-pel, i.e. s = (P1+P2*5+P3*5P4+4)/8 and
|
||
|
||
2) (-1,13,5,-1)/16 for ¼-pel position, i.e. c = (P1+P2*13+P3*5P4+8)/16.
|
||
|
||
|
||
|
||
|
||
Fractional pixel locations
|
||
The quarter-pels are actually the averages of its nearest integer and half pixel values.
|
||
It is not hard to see our suggested interpolation formulas are very much the good approximations of the
|
||
formulas from various standards
|
||
For AVC, they should be the following 6-tap formulas in theory:
|
||
1) (1, -5,20,20,-5,1)/32 for ½-pel, i.e. s = ((P2+P3)*20(P1+P4)*5+(F0+F6), and
|
||
2) (1,-5,52,20-5,-1)/64 for ¼-pel position.. n.
|
||
For VC-1, the 4-tap filters are precisely defined:
|
||
1) (-1,9,9,-1)/16 for ½-pel, and
|
||
2) (-4,53,18,-3)/64 for ¼-pel position.
|
||
In general, bilinear interpolation is accepted too:
|
||
3) (0,1,1,0)/2 for ½-pel (as used in MPEG2), and
|
||
4) (0,3,1,0)/4 for ¼-pel position.
|
||
After IME is done, if the best Inter result is too bad, we may decide to stop the Inter-search to not waste
|
||
the effort further computationally. If we decided to continue, we have the option to decide shape first to
|
||
cut down FME calculation or to perform FME for all possible configurations.
|
||
VME performs the sub-block level intermediate shape decision first (see Shape Decision section for detail),
|
||
then perform FME only for the reduced candidate shapes. In this way, the computation is reduced
|
||
significantly with tunable small quality hit.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 44
|
||
3.1.3.2 8+8 vs. 7x7
|
||
With a given sub-block of motion vector search, we also have multiple options to pursue the searching.
|
||
Name two common extremes: 7x7 and 8+8.
|
||
Given an integer motion vector location, surrounding it there are 48 surrounding quarter-pel locations, and
|
||
among them there are 8 are in half-pel grids. So we may check all 48, which covers the 7x7 region, for
|
||
the best, or we may adopt a two-step approach by considering the half-pel grids first then followed by the
|
||
second step of the quarter-pel refinement.
|
||
The one step method is named as 7x7, and the two step method called 8+8 as only 16 block comparisons
|
||
are performed as shown in the next figure.
|
||
VME hardware follows the 8+8 approach.
|
||
|
||
|
||
|
||
|
||
7x7 8+8
|
||
|
||
|
||
7x7 vs. 8+8, whereas the 8+8 method is used by VME
|
||
|
||
3.1.3.3 Partitioning Refinement
|
||
When the partitioning refinement is enabled, the FME refinement results will be propagated to or sub-
|
||
blocks as well, and a shape partitioning will be redone after the completion of both half-pel and quarter-
|
||
pel searching for a possible better choice.
|
||
In the case when alternative candidate is enabled, both half-pel refinements are done in parallel, and then
|
||
records are combined. Then, both quarter-pel refinements are done again in parallel, and combined again
|
||
prior to the final repartitioning. In HW implementation, we do the coarser on first, and the finer one later to
|
||
achieve the above equivalence.
|
||
|
||
|
||
3.1.4 BME and Weighted Prediction
|
||
Bidirectional searching is performed to all candidate shapes.
|
||
A weighted bidirectional search is supported particularly for AVC implicit weighted prediction. Only a
|
||
common subset of frame relations, which falls into linear interpolation with positive weight, is
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 45
|
||
implemented. The weight between forward and backward is approximated into 5 cases only: 16 (quarter
|
||
distance like Rf B X X Rb), 21 (one third distance like Rf B X Rb), 32 (half distance like Rf B Rb), 43 (two
|
||
third distance like Rf X B Rb), and 48 (three quarter distance like RXXBR). Here the notation is for
|
||
bidirectional prediction with display picture order, whereas Rf stands for forward reference, Rb for
|
||
backward reference, B for the current bidirectional predicted picture and X is another picture in the
|
||
sequence.
|
||
So if the forward prediction is {Ref0[i]}, and the corresponding backward reference is {Ref1[i]}, then
|
||
the combined bidirectional motion prediction is calculated as the following:
|
||
Ref[i] = ((64-alpha)*Ref0[i] + alpha*Ref1[0] + 32)>>6;
|
||
where, alpha is one of the 5 weighting numbers mentioned above.
|
||
|
||
|
||
3.1.5 Skip Check
|
||
There are two SKIP modes:
|
||
|
||
SKIP_1MVP – one MV pair for 16x16 macroblock, and
|
||
SKIP_4MVP – four MV pairs for four 8x8 subblocks.
|
||
|
||
Otherwise, when Skip Check is enabled and the skip MV number does not exceed MaxMumMV, VME will
|
||
first perform the fractional motion estimation at the skip centers provided by the motion vector pairs as
|
||
specified by the corresponding mode. In this case the following distortions will be calculated:
|
||
1. RawSkipDist – (intended for AVC PB_Skip) the raw SAD/HAAR distortion calculated from the
|
||
skip motion vectors with no costing added.
|
||
2. NonSkipDist – (intended for AVC B_Direct16x16) the adjusted non-skip distortion is defined by
|
||
adding optionally the zero motion vector cost and 16x16 Inter mode penalty to RawSkipDist.
|
||
And
|
||
3. NonSkip8x8Dist[4] – (intended for AVC B_Direct8x8) the four adjusted non-skip distortions for
|
||
four individual 8x8 subblocks with the ZMV cost and 8x8q Inter mode penalty optionally added.
|
||
(Note: This case may produce partitions with 8x8 subblock even if the 8x8 subblock shape is
|
||
disabled.)
|
||
“Optional” implies whether add or not is purely depende on two enabling input bits: NonSkipModeAdded
|
||
and NonSkipMvAdded. It should be also noted that MODE_INTER_BWD is not added to NonSkipDist
|
||
or NonSkip8x8Dist[] even though a skip center contains backward motion vector (this is for a direct
|
||
mode, whether the motion vector for a block is forward, backward or bidirection is derived from its spatial
|
||
or temporal predictor and there is no coding cost).
|
||
If RawSkipDist is less than or equal to EarlySkipSuccess threshold, MinDist will be set to RawSkipDist
|
||
if the skip MV number does not exceed MaxMumMV.
|
||
|
||
If EarlySuccessEn flag is on, VME exits immediately afer setting MbSkipFlag on, and
|
||
Direct8x8Pattern = Fh.
|
||
If EarlySuccessEn flag is off, VME continue the IME, FME, BME, and Direct8x8 searching
|
||
after setting MbSkipFlag on and Direct8x8Pattern = Fh. VME will choose the skip output
|
||
unless another better choice of code with less adjusted distortion is found.
|
||
|
||
If RawSkipDist is greater than EarlySkipThreshold, MinDist will be set to NonSkipDist if the skip MV
|
||
number does not exceed MaxMumMV. MbSkipFlag will be always set to off. VME continue the IME,
|
||
FME, BME, and Direct8x8 searchings. VME will still choose the skip output (with MbSkipFlag off) unless
|
||
another better choice of code with less adjusted distortion is found.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 46
|
||
3.1.5.1 Direct 8x8 Search
|
||
Direct8x8 Searching and then possible replacement is performed ONLY for 16x16 source block.
|
||
Direct8x8 Searching is performed only for Skip_4MVP mode when skip check is on to candidates of
|
||
MbType in a partition that is in the Inter shape of 8x8 or minors, after IME, FME, and BME searchings.
|
||
For each candidate in 8x8 or smaller partition, and for each 8x8 sub-block, the corresponding codes will
|
||
be replaced by the skip motion vector (pair) of the same 8x8 subblock, if all of the following requirements
|
||
are satisfied:
|
||
|
||
The non-skip 8x8 distortion NonSkip8x8Dist[k] is less than or equal to the adjusted 8x8
|
||
distortion of the corresponding codes.
|
||
The merge does not violate uni-mix and bi-mix rules (the violating cases are skipped).
|
||
The number of MVs used for the cadidate adding the number of subblocks of the shape 8x8
|
||
must be less than or equal to MaxNumMV. Or otherwise it does not replace a uni-directional
|
||
8x8 MV with a true bi-directional skip MV pair.
|
||
|
||
Note that, during all of the above comparisons, we skip the process whenever the MV numbers
|
||
exceeding the MaxNumMV.
|
||
If either UniMixDisable or BiMixDis is set, then there would be no direct8x8 block level replacement.
|
||
|
||
3.1.5.2 Skip Check Only Mode
|
||
VME supports the skip check only mode, when Intra is set off, Inter and Skip are enabled, and all 7 inter
|
||
shapes (SubMbPartMask): 16x16, 16x8, 8x16, 8x8, 8x4, 4x8, and 4x4 are set to 1 (all sub partitions are
|
||
turned off). That indicates that none of the partition and sub partitions are valid for IME. Therefore IME is
|
||
not performed, and no subsequent FME/BME is performed. This is another performance optimization
|
||
choice if the intended usage is to check the skip centers only.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 47
|
||
3.1.6 Intra Prediction Estimation
|
||
Intra Prediction Estimation state supports all Intra16x16, Intra8x8, and Intra4x4 modes. All predictions are
|
||
based on original frame pixels for quick performance, as widely adopted in HW industry. There is a known
|
||
quality drop.
|
||
For supporting AVS as well as providing finer knobs for AVC, five enabling flags are defined:
|
||
|
||
Enable Intra16x16: whether Intra16x16 shall be performed.
|
||
Enable Intra8x8: Enable all Intra8x8 modes, and the next flag determines which ones are actually
|
||
performed.
|
||
AVS Intra8x8 Flag: whether should perform the subset of 5 AVS modes or perform the super set of 8
|
||
AVC modes.
|
||
Enable Intra4x4: Enable all Intra4x4 modes, and the next flag determines which ones are actually
|
||
performed.
|
||
AVS Intra4x4 Flag: whether should perform the subset of 5 AVS modes or perform the super set of 8
|
||
AVC modes.
|
||
|
||
|
||
3.1.7 Transform Adjusted SAD
|
||
A simple Wavelet transform, Haar transform, is used to refine the cost function measure of SAD. The per
|
||
pixel difference goes through a 4x4 Haar transform. Then the SAD is replaced by the sum of the absolute
|
||
values the transform domain coefficients (L1 norm) in the cost function. Haar transform here is used as a
|
||
coarse estimation of the integer transform.
|
||
Assume the a 4x4 block Blk is given in the following order:
|
||
0 1 2 3
|
||
4 5 6 7
|
||
8 9 10 11
|
||
12 13 14 15
|
||
|
||
The 4x4 Haar transform is performed using cascaded 2x2 Haar filters of the following steps:
|
||
|
||
Four 4-tap row filter
|
||
Two 4-tap column filter
|
||
Two 2-tap row filter
|
||
Two 2-tap column filter
|
||
|
||
Where the 2x2 Haar transform is give as
|
||
1 1
|
||
1 -1
|
||
|
||
x00 x01 x02 x03 1 0 1 0
|
||
x10 x11 x12 x13 1 0 -1 0
|
||
x20 x21 x22 x23 0 1 0 1
|
||
x30 x31 x32 x33 0 1 0 -1
|
||
|
||
1 1 0 0 t00 t01 h08 h09
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 48
|
||
0 0 1 1 t02 t03 h10 h11
|
||
1 -1 0 0 t04t05 h12 h13
|
||
0 0 1 -1 t06t07 h14 h15
|
||
|
||
t00 t01 1 1
|
||
1 -1
|
||
t02 t03
|
||
h04 h05
|
||
h06 h07
|
||
|
||
1 1 t00 h02
|
||
1 -1
|
||
t01 h03
|
||
|
||
h00
|
||
h01
|
||
|
||
This is equivalent to the following pseudo codes:
|
||
void Haar(short Blk4x4[16], short Haar4x4[16])
|
||
{
|
||
shortTmp[16];
|
||
//First level 4-element horizontal Haar for 4 rows
|
||
For(int i=0;i<8;i++) {
|
||
Haar4x4[8+i] = (Blk4x4[i*2]-Blk4x4[i*2+1]);
|
||
// Storing LP 2x4 in scan order
|
||
Tmp[i] = (Blk4x4[i*2]+Blk4x4[i*2+1]));
|
||
}
|
||
//First level 4-element vertical Haar for 2 columns
|
||
Haar4x4[4] = (Tmp[0]-Tmp[2]);
|
||
Haar4x4[5] = (Tmp[1]-Tmp[3]);
|
||
Haar4x4[6] = (Tmp[4]-Tmp[6]);
|
||
Haar4x4[7] = (Tmp[5]-Tmp[7]);
|
||
Tmp[0] = (Tmp[0]+Tmp[2]); //Storing LP 2x2 in scan order
|
||
Tmp[1] = (Tmp[1]+Tmp[3]);
|
||
Tmp[2] = (Tmp[4]+Tmp[6]);
|
||
Tmp[3] = (Tmp[5]+Tmp[7]);
|
||
//Second level 2-element horizontal Haar for 2 columns
|
||
Haar4x4[3] = (Tmp[0]-Tmp[1]);
|
||
Haar4x4[2] = (Tmp[2]-Tmp[3]);
|
||
Tmp[0] = (Tmp[0]+Tmp[2]); //Storing LP 1x2
|
||
Tmp[1] = (Tmp[1]+Tmp[3]);
|
||
//Second level 2-element vertical Haar
|
||
Haar4x4[1] = (Tmp[0]-Tmp[1]);
|
||
Haar4x4[0] = (Tmp[0]+Tmp[1]);
|
||
}
|
||
int AdjustedSAD(BYTE Src[16], BYTE Ref[16]){
|
||
short diff[16], diffH[16];
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 49
|
||
for(int i=0;i<16;i++) diff[i] = r[i]-s[i];
|
||
Haar(diff,diffH);
|
||
intasad = 0;
|
||
for(int i=0;i<16;i++) asad += (diff[i]<0?-diff[i]:diff[i]);
|
||
asad >>= (12-DISTBIT4X4);
|
||
return (asad);
|
||
}
|
||
|
||
Thus instead of calculating the SAD of the actual pixel values, now we apply SAD to the after
|
||
transformation values.
|
||
As the Haar transform basis vectors have a magnitude of ½, instead of the normalized Haar of 1/sqrt(2),
|
||
the resulting transformed coefficients maintain the same bit precision as the input. Thus the sum tree has
|
||
the same precision as without the transform adjustment. However, this version of Haar transform has low
|
||
weightings on the DC and low AC terms, which may not be optimal as a motion-search cost function.
|
||
|
||
|
||
3.1.8 Early Decisions
|
||
There are 5 programmable early decision states are available for fine control of the VME process. All
|
||
stored in one byte of U4U4 format to representing a value of (B<<S), (where B, called base, is the 4-LSB
|
||
of the byte and S, called shift, is the 4-MSB of the byte,) they are the following:
|
||
a) ESS: EarlySkipSuccess = Early successful return after Skip is checked
|
||
b) EIS: EarlyImeStop = Early IME stop when a good match is found inside of IME process.
|
||
b) ITG: ImeTooGood = Early successful return after IME is done when a good enough match is found.
|
||
a) ITB: ImeTooBad = Early termination do skip fractional and bidirectional refinement after IME is done
|
||
with a hopelessly bad match as the best result.
|
||
c) EFS: EarlyFmeSuccess = Early Success after Fractional ME to skip bidirectional search.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 50
|
||
Note. For any reason, if all possible code types are not chosen, VME will return Intra16x16 type with all
|
||
modes set to 0, and the MinDist is set to 0x3FFF.
|
||
|
||
|
||
3.1.9 Performance Information
|
||
VME makes many internal decisions such as whether or not early exits occurred. Additionally, the number
|
||
of search units processed and the total clocks spent per message are valuable to software for real-time
|
||
adjustments or testing and statistical analysis. VME output message contains such information to fulfill
|
||
this basic feature.
|
||
The output message for VME contains fields to encode decision and performance counters. This includes
|
||
performed sub-functions (IME, FME, BME, etc), the early exit conditions, and other internal decisions.
|
||
Of the “other” internal decisions, there are fields for whether or not FME or BME improved the primary
|
||
candidate. These bits will be set when FME or BME modifies the best mv decision. If the “alternate
|
||
partition” or “extra candidate” results in a lower cost at the end of VME, a bit will be used to represent that
|
||
the alternate beat the original best. Lastly, 1 bit will be used to indicate partitioning was constrained by
|
||
MaxMV. For example, if 16x16 was the lowest sad+cost and MaxMV was set to 10, the partitioning was
|
||
not constrained. However, if 8x8 was the lowest sad+cost and MaxMV was set to 1, partitioning was
|
||
constrained by MaxMV and this bit would be set.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 51
|
||
There are also 3 counter values. One is to report the total number of search units processed by the back-
|
||
end (max is 48). Another is to report the total time the front-end is starved due to cache misses, counted
|
||
in divisions of 16 clocks (max is 1024*16 clocks). This will most likely be active at the beginning of a VME
|
||
request, however, even after processing has begun, if any front-end stalls occur this counter should
|
||
resume counting. Hence, when the VME request has finished, this counter will have the total time the
|
||
front-end is stalled. The third field is used to report the total time the back-end consumed for computation,
|
||
also counted in divisions of 16 clocks (max is 256*16 clocks) [Note: this should include any bubbles in the
|
||
pipe, simply put, if front-end is not stalled, this counter should be free-running]. Thus, by adding total
|
||
front-end starved time with total back-end computation time, the exact total VME message time can be
|
||
obtained.
|
||
|
||
|
||
3.1.10 VME Changes
|
||
VME remains fundamentally unchanged (same sub-functions, etc). However there are a few features
|
||
being added:
|
||
|
||
Bilinear interpolation,
|
||
AVC Intra mode mask,
|
||
Native multi-call support,
|
||
Expanded MV cost distance),
|
||
Motion vector, Skip center, and Cost center redefinitions to be relative to source MB,
|
||
Removal of a skip motion vector restriction that required skip centers must be contained within
|
||
the search window.
|
||
|
||
These have a non-trivial impact to the input & output message format and it is cleaner to describe a new
|
||
message for, which can be found in section 6.5 and 6.6 along with further details.
|
||
|
||
|
||
3.2 Surfaces
|
||
The data elements accessed by VME are called “surfaces”. Surfaces are accessed using the surface
|
||
state model.
|
||
VME uses the binding table to bind indices to surface state, using the same mechanism used by the
|
||
sampling engine. A Binding Table Index (specified in the message descriptor) of less than 255 is used to
|
||
index into the binding table, and the binding table entry contains a pointer to the SURFACE_STATE.
|
||
SURFACE_STATE contains the parameters defining the surface to be accessed, including its location,
|
||
format, and size.
|
||
|
||
|
||
3.3 State
|
||
|
||
3.3.1 BINDING_TABLE_STATE
|
||
VME uses the binding table to retrieve surface state. Refer to Sampling Engine for the definition of this
|
||
state.
|
||
|
||
|
||
3.3.2 SURFACE_STATE
|
||
VME uses the surface state for current and reference surfaces. Refer to Sampling Engine for the definition
|
||
of this state.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 52
|
||
3.3.3 VME_STATE
|
||
This state structure contains the state used by the VME engine for data processing. VME state contains
|
||
the motion search path location tables and rate-distortion weight look-up-tables. As the two sets of tables
|
||
are fairly large, they are accessed as two separate states via state indexing mechanism so that
|
||
applications can inter-mix the use of the search path tables and RDLUT tables.
|
||
Even though VME engine has its unique shared function ID (see Target Function ID field in the SEND
|
||
instruction), the VME state is delivered through the Sampler State Pointer. When the General Purpose
|
||
Pipe is used, the Sampler State Pointer is programmed in the
|
||
MEDIA_INTERFACE_DESCRIPTOR_LOAD command and delivered directly to Sampler/VME by
|
||
hardware. This posts one usage limitation. As the VME state is overloaded on top of the Sampler State
|
||
Pointer, VME messages cannot be intermixed with other Sampler messages.
|
||
Each VME state may contain up to 8 VME_SEARCH_PATH_LUT_STATE. When multiple
|
||
VME_SEARCH_PATH_LUT_STATE are used, they need to be stored in memory contiguously. Each
|
||
VME_SEARCH_PATH_LUT_STATE contains 32 dwords in comparison of 4 dwords of a Sampler State.
|
||
When enabling sampler state pre-fetch (programming the Sampler Count field in the
|
||
MEDIA_INTERFACE_DESCRIPTOR_LOAD command), one VME_SEARCH_PATH_LUT_STATE is
|
||
equivalent to 8 Samplers. Hardware may support up to two VME_SEARCH_PATH_LUT_STATE to be
|
||
pre-fetched (See vol2b Media chapter for more details).
|
||
|
||
3.3.3.1 VME_SEARCH_PATH_LUT_STATE
|
||
Up to eight VME_SEARCH_PATH_LUT_STATE allowed for a message to select. Each state contains
|
||
one set of search path locations, and four sets of rate distortion cost function LUT for various modes and
|
||
rate distortion cost function LUT for motion vectors (relative to ‘cost center’). Motion vector cost function is
|
||
provided as a piece-wise-linear curve with only the values of the power-of-2 positions provided.
|
||
DWord Bit Description
|
||
0:13 Search Path
|
||
|
||
0 31:24 Search Path Location [3] (X, Y) – Relative distance from location [2]
|
||
|
||
23:16 Search Path Location [2] (X, Y) – Relative distance from location [1]
|
||
|
||
15:8 Search Path Location [1] (X, Y) – Relative distance from location [0]
|
||
|
||
7:4 Search Path location [0] (Y) – specifies relative Y distance of the next walk from the starting position
|
||
in unit of Search Unit (SU) in U4
|
||
Format = U4, (e.g. 0x3 + 0xE = 0x1)
|
||
|
||
3:0 Search Path Distance [0] (X) – specifies relative X distance of the next walk from the starting position
|
||
in unit of SU.
|
||
Format = U4
|
||
|
||
1:13 Search Path Location [4 – 55] (X, Y)
|
||
|
||
14:31 RD LUT SET 0-4
|
||
|
||
14 31:24
|
||
LUT_MbMode [9] for Set 1
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 53
|
||
DWord Bit Description
|
||
23:16
|
||
LUT_MbMode [8] for Set 1
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
15:8
|
||
LUT_MbMode [9] for Set 0
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
|
||
7:0
|
||
LUT_MbMode [8] for Set 0
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
15 31:24
|
||
LUT_MbMode [9] for Set 3
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
23:16
|
||
LUT_MbMode [8] for Set 3
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
15:8
|
||
LUT_MbMode [9] for Set 2
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
|
||
7:0
|
||
LUT_MbMode [8] for Set 2
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
16 31:24
|
||
LUT_MbMode [3] for Set 0
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
23:16
|
||
LUT_MbMode [2] for Set 0
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
|
||
15:8
|
||
LUT_MbMode [1] for Set 0
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
7:0
|
||
LUT_MbMode [0] for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
17 31:24
|
||
LUT_MbMode [7] for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
23:16
|
||
LUT_MbMode [6] for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
|
||
15:8
|
||
LUT_MbMode [5] for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
7:0
|
||
LUT_MbMode [4] for Set 0
|
||
Format = U4U4 (encoded value must fit in 12-bits)
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 54
|
||
DWord Bit Description
|
||
18 31:24
|
||
LUT_MV [3] – For MV = 4 for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
23:16
|
||
LUT_MV [2] – For MV = 2 for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
|
||
15:8
|
||
LUT_MV [1] – For MV = 1 for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
7:0
|
||
LUT_MV [0] – For MV = 0 for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
19 31:24
|
||
LUT_MV [7] – For MV = 64 for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
23:16
|
||
LUT_MV [6] – For MV = 32 for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
|
||
15:8
|
||
LUT_MV [5] – For MV = 16 for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
7:0
|
||
LUT_MV [4] – For MV = 8 for Set 0
|
||
Format = U4U4 (encoded value must fit in 10-bits)
|
||
|
||
20-23 Finish RD LUT SET 1
|
||
|
||
24-27 Finish RD LUT SET 2
|
||
|
||
28-31 Finish RD LUT SET 3
|
||
|
||
The assignment of LUT_MbMode entries is according to the MbTypeEx definition:
|
||
The value of each byte of the LUTs will be viewed as a pair of 4-bit units: (shift, base), and constructed as
|
||
base << shift.
|
||
For example, an entry 0x4A represents the value (0xA<<0x4) = 10*16 = 160. Encoded value must fit in
|
||
12-bits (unsigned number); otherwise, the hardware behavior is undefined.
|
||
The only exception is for Index of 9, MODE_INTER_BWD, which is used as a bias for the two search
|
||
directions. It is a signed number instead, in the form of (SU3U4) = (sign, shift, base). The sign bit
|
||
indicates whether the bias is added to the forward (if sign = 1) or the backward (if sign = 0). The bias has
|
||
a magnitude of (base << shift), which has 11-bits precision. It should be noted that the number is always
|
||
added, there is no subtraction.
|
||
Intra Modes only apply to AVC standard. The mode penalty doesn’t apply to Skip Mode Checking. Note
|
||
that while other mode penalty applies to a fixed macroblock partition, MODE_INTRA_NONPRED applies
|
||
to all three intra modes. It is a constant cost adder for intra-mode coding regardless of the block size.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 55
|
||
For source block that is less than 16x16 (like a 16x8 source block), the proper mode penalty that is stated
|
||
as “added per 16x16 macroblock” is added once to the source block (like MODE_INTER_16x8 is added
|
||
once to a 16x8 source block). It will not be divided by the source block size.
|
||
The LUT_MV is added to all motion vector coordinate deltas in quarter-pel unit except for the SKIP mode,
|
||
which no costing penalty applies. Given motion vector coordinate, e.g. mvx, which is in quarter-pel
|
||
precision (S5.2), the mv delta is defined to be its difference from the given costing center, e.g. ccx, and
|
||
the costing penalty is applied to dx = |mvx-ccx|. The cost penalty is a piecewise linear interpolation from
|
||
the LUT_MV table whereas the values on power-of-2 integer samples are provided. The piecewise linear
|
||
interpolation is performed using quarter-pel precision, while the LUT_MV are only provided for the given
|
||
power-of-2 integer positions. The maximum distance provided in the table is 64 pixels. A linear ramp with
|
||
gradient of 1 on integer distance is applied for bigger distances with maximum penalty capped to 0x3FF
|
||
(10 bits). Thus,
|
||
Costing_penalty_x = LUT_MV[int(dx)], if dx < 3 and dx = int(dx);
|
||
|
||
Costing_penalty_x = LUT_MV[p+1], else if dx = 2p, for any p6;.
|
||
Costing_penalty_x = LUT_MV[p+1] + ((LUT_MV[p+2] – LUT_MV[p+1])*k)>>p, else if dx = 2p+k, for
|
||
any p<6 and k<.2p, and
|
||
Costing_penalty_x = min (LUT_MV[7] + int(dx)– 64, 255), else if dx > 64.
|
||
|
||
The total costing penalty for a motion vector is
|
||
Costing_penalty = Costing_penalty_x + Costing_penalty_y
|
||
As a convention, a (0,0) relative search path distance (meaning a repeat search path location) is treated
|
||
as the ending of the search path. Or the search path may also end when Max Predetermined Search
|
||
Path Length is reached, or one of the Early Success conditions is reached.
|
||
Software must program the search path to terminate with at least one (0,0).
|
||
|
||
|
||
3.4 Change Details
|
||
|
||
3.4.1 Record Stream-out and Stream-in
|
||
|
||
3.4.1.1 Overview
|
||
VME internally keeps track of the best motion vectors for all shapes and sub-shapes, totaling 41 for each
|
||
record of the two records (forward and backward). Once IME is finished, each record is mined for the best
|
||
combination of shapes (i.e. the combination of the least distortion). The return message from VME to the
|
||
EU contains only the best shape combination and the remainder of the record is discarded.
|
||
For cases when the user wants to search beyond the VME window limits (64x32 for single reference,
|
||
32x32 for dual reference) the user must call VME multiple times. Since only partial information is returned
|
||
to the kernel, extracting the best shape combination across multiple calls is impossible. The best
|
||
workarounds require the kernel to limit the types of shapes VME is allowed to return and then the kernel
|
||
will manually merge shapes from multiple calls, cumbersome and suboptimal with respect to quality.
|
||
By returning more of the record to the kernel and allowing the kernel to feed in that information on
|
||
subsequent calls as initialization information, the process of searching beyond VME size limitations is
|
||
vastly improved. Now the merging of best shapes will occur inside VME and the global best shape
|
||
combination is more optimized.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 56
|
||
If both records are returned in their entirety, this would require 16 additional message phases (each
|
||
shape requires 3 DWs, total of 82 shapes) for both input and output messages. A compromise to reduce
|
||
this burden yet still gain the bulk of the improvement is to stream-out only the best major shapes (9
|
||
shapes, one 16x16, two 16x8, two 8x16, and four 8x8) for both records. This adds only 4 additional
|
||
message phases (when under search control == 111b, otherwise 2 additional phases) and carries the
|
||
most important shape data across multiple calls.
|
||
|
||
3.4.1.2 Implementation Details
|
||
In essence this feature creates 2 types of records inside VME, a local and a global record. The local
|
||
record contains the best shapes within a single call to VME, i.e. the current call only. The global record is
|
||
carried via stream-in and stream-out, containing the best major shapes.
|
||
VME should only consider the local record during IME and FME, finding the local call’s optimal shapes
|
||
independent of the global record. For purposes of partitioning, the merging of the global record’s shapes
|
||
into the local record should occur after FME is finished on the current call and prior to repartitioning.
|
||
Otherwise local shapes identified during IME might not be considered for FME if the global shape was
|
||
superior to the IME result.
|
||
There is a new stage immediately following FME where the local record major shapes are compared to the
|
||
stream-in data, replacing the local record’s major shapes with the stream-in shape if it has a lower distortion.
|
||
Steps following this (repartitioning, BME, final mode decision) proceed like the previous generation.
|
||
As a part of the final stage, the stream-out record is generated simply taking the 9 major shapes out of
|
||
the local record (which was merged with local record earlier).
|
||
The merging of global and local motion vectors prior to BME could allow the winning shape combination
|
||
to not have all of its corresponding pixels in the SC (since the SC would only have local motion vector
|
||
pixels). Hence, a simple check is required prior to performing BME that ensures the motion vectors are
|
||
from the local call only, passing cases will perform BME and failing cases will not (test is applied on a per-
|
||
shape basis).
|
||
No native support within VME for multi-reference unidirectional surface mixing, the kernel can implement
|
||
a workaround if required, but there is no justification for such feature in the HW at this time.
|
||
|
||
|
||
3.4.2 MV Definitions and Precision
|
||
|
||
3.4.2.1 Overview
|
||
Given that VME is trying to natively support larger search windows with stream-in, due to both necessity
|
||
and general improvements a number of input and output vectors (aka centers) must grow in precision. At
|
||
the same time, the points from which they are relative to are also being redefined. In most cases for the
|
||
previous generation (motion vectors, skip centers, cost centers) were defined relative to the reference
|
||
window origin, requiring the kernel to calculate the necessary offsets from the source MB location. Now
|
||
all vectors are defined relative to the source MB location (and the source MB is defined relative to the
|
||
picture origin).
|
||
|
||
3.4.2.2 Implementation Details
|
||
The following diagrams provide details regarding the precision, range, and origin of all input (4 types),
|
||
output (1 type), and internal vectors (first shown all together, then individually). Many vectors are
|
||
composed from input or other internal vectors (via addition or subtract) and those equations are present.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 57
|
||
3.4.3 Expanded MV Costs
|
||
|
||
3.4.3.1 Overview
|
||
Given that VME will be searching larger areas with the Record Stream-out feature, it is also necessary
|
||
that we revisit our MV costing methodology. Given this is calculated in terms of quarter-pel units, this
|
||
allows the user to provide variable costing penalty for a maximum distance of 16 pixels away from the
|
||
cost center.
|
||
We would like to expand this range by implementing a variable scaling factor (i.e. right shift, binary divide) of
|
||
the MV distance prior to comparison to the user-defined intervals (where VME previously looked at the lsbs
|
||
only). This will be provided to VME as a 2 bit value, specifying the shift amount (0: qpel, 1: hpel, 2:
|
||
single-pel, 3: two-pel). For instance, if the user a selects the MV cost scaling to be “3”, this expands the
|
||
maximum MV costing interval to a distance of 128 pixels.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 58
|
||
3.4.4 Remove Skip MV Restriction
|
||
|
||
3.4.4.1 Overview
|
||
We will remove this restriction and allow the 8 skip centers to be located anywhere within the legal AVC
|
||
motion vector definitions (“Horizontal motion vector range does not exceed the range of -2048 to 2047.75,
|
||
inclusive, in units of luma samples.” And “Vertical MV component range MaxVmvR (luma frame samples) = [-512,
|
||
+511.75]”).
|
||
|
||
This restriction was originally imposed to reduce the complexity and cost of the hardware for processing
|
||
skips and directs require pixels beyond that of the reference window used for IME, FME and BME.
|
||
|
||
3.4.4.2 Implementation Details
|
||
Skips must still be associated with the same surface state as their corresponding reference window (4
|
||
skip centers are for ref0, 4 are for ref1).
|
||
Skip centers are still bound as pairs. Hence, if the fwd x-component was 0xff, that meant this skip center
|
||
pair was unidirectional and only in the bwd direction. If neither x-component are 0xff, then this is a
|
||
bidirectional pair.
|
||
However, mv.x = 0xff is now a legal motion vector value and thus we cannot overload this field to control the
|
||
skip center pair’s type.We will incorporate a new 8b field, “Skip Center Enables” (M1-DW7-31:24), to
|
||
control which of the 8 skip center pairs is valid. At least 1 of the skip centers for each pair must be valid
|
||
when in 4MVP mode (in 1MVP mode only 1 of the skip centers for the 1st pair must be valid).
|
||
|
||
|
||
3.4.5 Bilinear Interpolation
|
||
|
||
3.4.5.1 Overview
|
||
Since MPEG2 only allows for half-pel interpolation, implementation of this bilinear filter is required only for
|
||
half-pel mode. However, if there are no HW concerns implementing bilinear for quarter-pel also, please
|
||
go ahead as there could be users who prefer it over our general purpose filter.
|
||
|
||
|
||
3.4.6 AVC Intra Mode Mask
|
||
|
||
3.4.6.1 Overview
|
||
AVC has 9 different intra modes for both 4x4 and 8x8 transforms and 4 modes for 16x16 transform. For a
|
||
mask will be feed into VME (9b+9b+4b), telling it which modes cannot be selected as output candidates. This
|
||
will be a 9 bit field, disabling a given mode for the entire macroblock.
|
||
|
||
|
||
|
||
3.5 Messages
|
||
Request message bearing SFID of VME is routed to VME engine.
|
||
Programming Note:
|
||
|
||
Use of any message to the Video Motion Estimation function with the End of Thread bit set in the
|
||
message descriptor is not allowed.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 59
|
||
3.5.1 VME Motion Search Request
|
||
Restrictions:
|
||
|
||
the only surface type allowed is SURFTYPE_BUFFER.
|
||
the surface format is ignored, data is returned from the constant buffer to the GRF without format
|
||
conversion.
|
||
Applications:
|
||
|
||
Motion search for video encoding
|
||
Motion search for video processing such as deinterlace, frame rate conversion, etc.
|
||
Execution Mask. The execution mask is ignored.
|
||
Out-of-Bounds Accesses. Pixel replication is invoked for reads to areas outside of the surface.
|
||
|
||
|
||
3.5.2 Message Descriptor
|
||
Same as Prev.
|
||
Bit Description Gen?
|
||
19 yes
|
||
Header Present. If set, indicates that the message includes the header. This bit
|
||
must be set to one for all VME messages
|
||
Format = Enable
|
||
Reserved: MBZ
|
||
18:17 yes
|
||
16 no
|
||
Stream-in Enable. If set, additional message phases of record stream-in will be
|
||
present with the input: 4 additional phases only when search control (M0.3 10:8)
|
||
is 111b (dual reference & dual record) and 2 additional phases otherwise.
|
||
Format = Enable
|
||
15 no
|
||
Stream-out Enable. If set, additional message phases of record stream-out will
|
||
be present with the output: 4 additional phases only when search control (M0.3
|
||
10:8) is 111b (dual reference & dual record) and 2 additional phases otherwise.
|
||
Format = Enable
|
||
|
||
14:13 yes
|
||
Message Type
|
||
00: Reserved
|
||
01: Inter-search only
|
||
10: Intra-search only
|
||
11: Inter- and intra-search enabled
|
||
12:11 yes
|
||
LUT_SUBINDEX. Specifies the index into the RDLUT state table.
|
||
|
||
10:8 yes
|
||
VME_SEARCH_PATH_LUT State Index. Specifies the index into the
|
||
VME_SEARCH_PATH_LUT state table. When dual records are used, both
|
||
records share the same predetermined search path.
|
||
7:0 yes
|
||
Binding Table Index. Specifies the index into the binding table for the current
|
||
surface.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 60
|
||
Same as Prev.
|
||
Bit Description Gen?
|
||
Forward reference surface is implied as [Binding Table Index + 1] and
|
||
the backward reference surface is implied as [Binding Table Index + 2]
|
||
Format = U8
|
||
Range = [0,254]
|
||
|
||
|
||
|
||
3.5.3 Input Message
|
||
|
||
3.5.3.1 Message Header and Payload
|
||
The message header and payload size is determined based on the Message Type:
|
||
Message Type Mnemonic Message Length Response Length
|
||
01 Inter-search only 5 + (stream-in) 6 + (stream-out)
|
||
10 Intra-search only 5 1
|
||
11 Inter- and intra-search enabled 5 + (stream-in) 6 + (stream-out)
|
||
|
||
When stream-in is enabled:
|
||
|
||
If (search control == 111b), the message length is +4 for total of 9 phases.
|
||
Else (search control != 111b), the message length is +2 for total of 7 phases.
|
||
|
||
When stream-out is enabled:
|
||
|
||
If (search control == 111b), the response length is +4 for total of 10 phases.
|
||
Else (search control != 111b), the response length is +2 for total of 8 phases.
|
||
|
||
For Message Type of 01, the VME request message contains the following two phases:
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
M0.7 31:0 yes
|
||
Reserved
|
||
|
||
M0.6 31:0 yes
|
||
Reserved
|
||
|
||
M0.5 31:24 yes
|
||
Reference Region Height (RefHeight): This field specifies the reference region
|
||
height in pixels. When bidirectional search is enabled, this applies to both search
|
||
regions. Minus 16 provides the number of search point in vertical direction.
|
||
The value must be a multiple of 4.
|
||
Format = U8
|
||
Range = [20, 64]
|
||
|
||
23:16 yes
|
||
Reference Region Width (RefWidth): This field specifies the search region width
|
||
in pixels. When bidirectional search is enabled, this applies to both search
|
||
regions. Minus 16 provides the number of search point in horizontal direction.
|
||
The value must be a multiple of 4.
|
||
Format = U8
|
||
Range = [20, 64]
|
||
Note: Please make sure the reference windows are not completely outside of the
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 61
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
video frame, in that case, VME behavior is undefined.
|
||
|
||
Ignored
|
||
15:8 yes
|
||
7:0 yes
|
||
Dispatch ID. This ID is assigned by the fixed function unit and is a unique
|
||
identifier for the thread. It is used to free up resources used by the thread upon
|
||
thread completion.
|
||
M0.4
|
||
31:0 Ignored yes
|
||
M0.3
|
||
31 Reserved : MBZ yes
|
||
(for Bidirectional Mirror mode, which is used for AVS mode. 0: disable for non-
|
||
AVS mode; 1: enabled: the best forward and the best backward MV will be
|
||
mirrored for AVS bidirectional search. Notice that, the mv cost penalty shall be
|
||
applied only for one set of mvs in this case.)
|
||
|
||
30:24 yes
|
||
Sub-Macroblock Sub-Partition Mask (SubMbPartMask): This field defines the
|
||
bit-mask for disabling sub-partition and sub-macroblock modes.
|
||
The lower 4 bits are for the major partitions (sub-macroblock) and the higher 3
|
||
bits for minor partitions (with sub-partition for 4x(8x8) sub-macroblocks.
|
||
xxxxxx1 : 16x16 sub-macroblock disabled
|
||
xxxxx1x : 2x(16x8) sub-macroblock within 16x16 disabled
|
||
xxxx1xx : 2x(8x16) sub-macroblock within 16x16 disabled
|
||
xxx1xxx : 1x(8x8) sub-partition for 4x(8x8) within 16x16 disabled
|
||
xx1xxxx : 2x(8x4) sub-partition for 4x(8x8) within 16x16 disabled
|
||
x1xxxxx : 2x(4x8) sub-partition for 4x(8x8) within 16x16 disabled
|
||
1xxxxxx : 4x(4x4) sub-partition for 4x(8x8) within 16x16 disabled
|
||
Usage note: one example usage of only enabling 4x(4x4) sub-partition while all
|
||
other partitions are disabled is for video processing, whereas parallel motion
|
||
searches are performed for 16 4x4 blocks. For that no further block combination
|
||
(into larger sub-partitions/sub-macroblocks) is needed.
|
||
|
||
23:22 yes
|
||
Intra SAD Measure Adjustment (IntraSAD): This field specifies distortion
|
||
measure adjustments used for the motion search SAD comparison.
|
||
This field must be set to 00 if Source Block Field Mode is 1 (interleaved).
|
||
00 : none
|
||
01 : Reserved
|
||
Better set to 00 if Source Block Field Mode is 1 (interleaved).
|
||
21:20 yes
|
||
Inter SAD Measure Adjustment (InterSAD): This field specifies distortion
|
||
measure adjustments used for the motion search SAD comparison.
|
||
00 : none
|
||
01 : Reserved
|
||
10 : Haar transform adjusted
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 62
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
11 : Reserved
|
||
Better set to 00 if Source Block Field Mode is 1 (interleaved).
|
||
|
||
M0.3 19 yes
|
||
Block-Based Skip Enabled: when this field is set on the skip thresholding
|
||
passing criterion will be based on the maximal distortion of individual blocks
|
||
(8x8’s or 4x4’s) instead of their sum (i.e. the distortion of 16x16). The block size is
|
||
8x8 if and only if the Transform 8x8 Flag is set to ON and the source size is
|
||
16x16..
|
||
18 no
|
||
Not implemented.
|
||
Reserved: MBZ
|
||
17 yes
|
||
Disable Aligned VME Source Fetch: This field, when set disables the VMEunit
|
||
functionality that aligns source data requests to 16 pixels. (This bit is ignored if
|
||
SrcX and SrcSize are such that requests for source data cannot be aligned to 16
|
||
pixels. The source data requests will be misaligned in these cases)
|
||
16 yes
|
||
Disable Aligned VME Reference Fetch: This field, when set disables the
|
||
VMEunit functionality that fragments reference data requests which are not
|
||
aligned to 16 pixels into 16 pixel aligned requests. This may be used when the
|
||
surface is not a multiple of 16 pixels and a portion of the reference data is outside
|
||
the surface.
|
||
|
||
15 yes
|
||
Disable Field Cache Allocation: This field, when set to 1, disables the optimized
|
||
field cache line method in the Sampler Cache for reference block data when
|
||
RefAccess is 1 (field based). It is ignored by hardware if RefAccess is 0.
|
||
0 – frame cache lines
|
||
1 – field cache lines
|
||
14 yes
|
||
Skip Mode Type (SkipType):
|
||
For B_DIRECT_16x16, both motion vectors of the skip center pair 0 are used.
|
||
For B_DIRECT_8x8s, all four skip center pairs are fully used (VME will never try
|
||
to combine them with non-skip shapes from IME, FME or BME).
|
||
0 : SKIP_1MVP – one MV pair for 16x16
|
||
1 : SKIP_4MVP – Four MV pairs for 8x8s ( in this case and only this case,
|
||
SkipCenter Delta 1-3 will be used)
|
||
Note: SkipTypeMode should be programmed to 1MVP for non-16x16 Source size
|
||
13:12 yes
|
||
Sub-Pel Mode (SubPelMode):This field defines the half/quarter pel modes. The
|
||
mode is inclusive, ie., higher precision mode samples lower precision locations.
|
||
00 : integer mode searching
|
||
01 : half-pel mode searching
|
||
10 : reserved
|
||
11 : quarter-pel mode searching
|
||
11 yes
|
||
Dual Search Path Option: Used only for dual record cases, this field flags
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 63
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
whether two searching records uses the same or the different paths.
|
||
0: use the same path as specified by the Search Path Location array
|
||
1: use the different paths, the first one uses the even entries of the Search Path
|
||
Location array and the second one uses the odd entries of the Search Path
|
||
Location array.
|
||
|
||
10:8 yes
|
||
Search Control (SearchCtrl): This field specifies how the motion search is
|
||
performed.
|
||
The following table shows the valid encodings. Other encodings are reserved.
|
||
|
||
Code Mode
|
||
000
|
||
Single reference, single record
|
||
and single start.
|
||
Search is performed only on
|
||
reference 0; only cost center 0 and
|
||
start 0 are used. There is only one
|
||
record. Adaptive search is also
|
||
allowed. However, when
|
||
AdaptiveEn is on, LenSU must be
|
||
at least 2 as the adaptive search in
|
||
VME is one-step delayed.
|
||
This is the common single
|
||
directional motion search mode.
|
||
001
|
||
Single reference, single record
|
||
and dual start.
|
||
Search is performed only on
|
||
reference 0; only cost center 0 is
|
||
used. There is only one record.
|
||
Search performs first on start 0
|
||
and then on start 1. Then if LenSP
|
||
is not reached, the predetermined
|
||
search path will start on start 1
|
||
with increment added to start 1
|
||
location. It then is followed by
|
||
adaptive search.
|
||
This is used for single direction
|
||
adaptive search.
|
||
|
||
011
|
||
Single reference, dual record
|
||
(and implied dual start).
|
||
Search is performed only on
|
||
reference 0; both cost center 0
|
||
and 1 and start 0 and 1 are used.
|
||
Two records are used for both
|
||
paths during IME.
|
||
When integer search is complete,
|
||
the two records are combined to
|
||
find the best search. Sub-pel
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 64
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
refinement is only performed from
|
||
the best one.
|
||
This may be used for search for
|
||
multiple motion search
|
||
candidates/predicators.
|
||
111
|
||
Dual reference, dual record (and
|
||
implied dual start).
|
||
Search is performed on references
|
||
0/1 with both cost centers 0/1 and
|
||
starts 0/1. Two records are used
|
||
for both paths during IME.
|
||
When integer search is complete,
|
||
and then sub-pel refinement is
|
||
also performed separately, the two
|
||
records are combined to find the
|
||
best search on a subblock basis.
|
||
This may be used for bidirectional
|
||
motion search, or multi-reference
|
||
P search. Whether bidirectional is
|
||
enabled or not depends on the
|
||
bidirection sub-macroblock mask.
|
||
If BiSubMbPartMask is set to
|
||
1111’b, bidirectional search is
|
||
disabled. VME will output only the
|
||
best unidirectional search results.
|
||
Otherwise, BME will be performed.
|
||
Note that bidirectional search
|
||
and sub-pel refinement are
|
||
orthogonal features that can be
|
||
enabled indepdently.
|
||
7 yes
|
||
Reference Access (RefAccess): This field defines how the reference blocks are
|
||
accessed from the reference frames. It indicates if the source picture is a frame
|
||
picture or a field picture.
|
||
Programming Note: For all known video coding standards, reference
|
||
pictures always have the same picture type as the source picture.
|
||
Therefore, this field should be programmed to be the same as SrcAccess.
|
||
0 : frame based
|
||
1 : field based
|
||
|
||
6 yes
|
||
Source Access (SrcAccess): This field defines how the source block is
|
||
accessed from the source frame. It indicates if the source picture is a frame
|
||
picture or a field picture. It is similar to the Picture Type used in video standards.
|
||
0 : frame based
|
||
1 : field based
|
||
5:4 yes
|
||
Inter MbType Remap (MbTypeRemap): This field controls the mapping of the
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 65
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
output MbType when the VME output is an Inter (IntraMbFlag = INTER). The
|
||
intended usage, for example, is for two forward (or backward) references or for
|
||
two search regions from the same reference picture in one VME call. Hardware
|
||
ignores this field if the VME output is an intra type (IntraMbFlag = INTRA).
|
||
00 : no remapping
|
||
01 : remapping MbType to forward only (1-3 mapped to 1, even numbers in [4-
|
||
14h] mapped to 4, odd numbers in [5-15h] mapped to 5, and 16h is unchanged)
|
||
10 : remapping MbType to backward only (1-3 mapped to 2, even numbers in [4-
|
||
14h] mapped to 6, odd numbers in [5-15h] mapped to 7, and 16h is unchanged)
|
||
11 : reserved
|
||
|
||
3 yes
|
||
Reserved: MBZ
|
||
|
||
2 yes
|
||
Reserved : MBZ
|
||
|
||
1:0 yes
|
||
Source Block Size (SrcSize): This field defines how the 16x16 source block is
|
||
formed. When Source Block Size is less than 16x16, SU larger than 4x4 will be
|
||
used.
|
||
00: 16x16
|
||
01: 16x8
|
||
10: Reserved (for 8x16)
|
||
11: 8x8
|
||
M0.2 31:16 no
|
||
Source Y (SrcY): This field defines the vertical position (of the block’s upper-left
|
||
pixel) in unit of pixels for the source block in the source picture (relative to picture
|
||
origin, not frame origin).
|
||
For field source (SrcAccess=1), the SrcFieldPolarity (M1.7-19), is required by
|
||
hardware to identify if this is top or bottom field of an interleaved memory surface.
|
||
The resulting Y address in the reference picture must be in even line aligned
|
||
within the reference picture. Specifically, if the reference picture is a frame picture.
|
||
the resulting Y address must be 2-line aligned; if the reference picture is a field
|
||
picture within a frame storage, and the resulting Y address must be 2-line aligned
|
||
within the field. i.e. it must be an even number for the frame case, and must be
|
||
equal to 0 or 1 modulo 4 for the field case.
|
||
Format = U16
|
||
|
||
15;0 yes
|
||
Source X (SrcX): This field defines the horizontal position (of the block’s upper-
|
||
left pixel) in unit of pixels for the source block in the source picture.
|
||
The source block must be within the source picture starting at any integer grid.
|
||
Format = U16
|
||
M0.1 31:16 no
|
||
Reference 1 Y Delta (Ref1Y): This field defines the vertical position (of the
|
||
upper-left corner of the reference region) in unit of pixels for Reference 1 region
|
||
relative to the source MB Y value on its respective picture.
|
||
For field reference (RefAccess=1), the Ref1FieldPolarity (M1.7-21), is required by
|
||
hardware to identify if this is top or bottom field of an interleaved memory surface.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 66
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
The resulting Y address in the reference picture must be in even line aligned
|
||
within the reference picture. Specifically, if the reference picture is a frame picture.
|
||
the resulting Y address must be 2-line aligned; if the reference picture is a field
|
||
picture within a frame storage, and the resulting Y address must be 2-line aligned
|
||
within the field. i.e. it must be an even number for the frame case, and must be
|
||
equal to 0 or 1 modulo 4 for the field case.
|
||
Note: For search control=3, this must equal Ref0Y.
|
||
Format = S15
|
||
Hardware Range: [-2048 to 2047]
|
||
|
||
15;0 no
|
||
Reference 1 X Delta (Ref1X): This field defines the horizontal position (of the
|
||
upper-left corner of the reference region) in unit of pixels for Reference 1 region
|
||
relative to the source MB X value on its respective picture.
|
||
The resulting reference region is allowed to be outside the picture. Pixel
|
||
replication is applied to generate out of bound reference pixels.
|
||
This field is only valid when dual reference mode is selected
|
||
Note: For search control=3, this must equal Ref0X.
|
||
Format = S15
|
||
Hardware Range: [-2048 to 2047]
|
||
M0.0 31:16 no
|
||
Reference 0 Y Delta (Ref0Y): This field defines the vertical position (of the
|
||
upper-left corner of the reference region) in unit of pixels for Reference 0 region
|
||
relative to the source MB Y value on its respective picture.
|
||
For field reference (RefAccess=1), the Ref0FieldPolarity (M1.7-20), is required by
|
||
hardware to identify if this is top or bottom field of an interleaved memory surface.
|
||
The resulting Y address in the reference picture must be in even line aligned
|
||
within the reference picture. Specifically, if the reference picture is a frame picture.
|
||
the resulting Y address must be 2-line aligned; if the reference picture is a field
|
||
picture within a frame storage, and the resulting Y address must be 2-line aligned
|
||
within the field. i.e. it must be an even number for the frame case, and must be
|
||
equal to 0 or 1 modulo 4 for the field case.
|
||
Format = S15
|
||
Hardware Range: [-2048 to 2047]
|
||
15;0 no
|
||
Reference 0 X Delta (Ref0X): This field defines the horizontal position (of the
|
||
upper-left corner of the reference region) in unit of pixels for Reference 0 region
|
||
relative to the source MB X value on its respective picture.
|
||
The resulting reference region is allowed to be outside the picture. Pixel
|
||
replication is applied to generate out of bound reference pixels.
|
||
Format = S15
|
||
Hardware Range: [-2048 to 2047]
|
||
|
||
31:24 no
|
||
M1.7 Skip Center Enable Mask (SkipCenterMask):
|
||
[bit 31…24]
|
||
xxxx xxx1: Ref0 Skip Center 0 is enabled [corresponds to M2.0]
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 67
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
xxxx xx1x: Ref1 Skip Center 0 is enabled [corresponds to M2.1]
|
||
xxxx x1xx: Ref0 Skip Center 1 is enabled [corresponds to M2.2]
|
||
xxxx 1xxx: Ref1 Skip Center 1 is enabled [corresponds to M2.3]
|
||
xxx1 xxxx: Ref0 Skip Center 2 is enabled [corresponds to M2.4]
|
||
xx1x xxxx: Ref1 Skip Center 2 is enabled [corresponds to M2.5]
|
||
x1xx xxxx: Ref0 Skip Center 3 is enabled [corresponds to M2.6]
|
||
1xxx xxxx: Ref1 Skip Center 3 is enabled [corresponds to M2.7]
|
||
Illegal cases:
|
||
Disable both Ref0 and Ref1 Skip Center 0 in case of Skip_1MVP.
|
||
Disable both Ref0 and Ref1 for any Skip Center pair in case of Skip_4MVP.
|
||
|
||
Reserved: MBZ
|
||
23:22 yes
|
||
21 no
|
||
Reference1 Field Polarity Select (Ref1FieldPolarity):
|
||
If RefAccess = 1 (M0.3-7), meaning field based, than the hardware requires this
|
||
value is to derive the correct location on the reference surface in memory to fetch
|
||
pixels. This is because the reference is stored as a frame picture with both fields
|
||
interleaved in memory and the Ref1Y (M0.1-31:16) is relative to the SrcY location
|
||
on a field picture.
|
||
Hence, the starting y-pixel coordinate that will be fetched from the memory will be:
|
||
(SrcY+Ref1Y) * 2 + Ref1FieldPolarity
|
||
Else, this field is ignored by the hardware.
|
||
Format = U1
|
||
20 no
|
||
Reference0 Field Polarity Select (Ref0FieldPolarity):
|
||
If RefAccess = 1 (M0.3-7), meaning field based, than the hardware requires this
|
||
value is to derive the correct location on the reference surface in memory to fetch
|
||
pixels. This is because the reference is stored as a frame picture with both fields
|
||
interleaved in memory and the Ref0Y (M0.0-31:16) is relative to the SrcY location
|
||
on a field picture.
|
||
Hence, the starting y-pixel coordinate that will be fetched from the memory will be:
|
||
(SrcY+Ref0Y) * 2 + Ref0FieldPolarity
|
||
Else, this field is ignored by the hardware.
|
||
Format = U1
|
||
19 no
|
||
Source Field Polarity Select (SrcFieldPolarity):
|
||
If SrcAccess = 1 (M0.3-6), meaning field based, than the hardware requires this
|
||
value is to derive the correct location on the source surface in memory to fetch
|
||
pixels. This is because the source is stored as a frame picture with both fields
|
||
interleaved in memory and the SrcY value (M0.2-31:16) is the location on the field
|
||
picture (in other words, it does not convey the field polarity).
|
||
Hence, the starting y-pixel coordinate that will be fetched from the memory will be:
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 68
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
SrcY* 2 + SrcFieldPolarity
|
||
Else, this field is ignored by the hardware.
|
||
Format = U1
|
||
|
||
18 no
|
||
Bilinear Filter Enable (BilinearEnable):
|
||
If set, the fractional filter will implement a simple bilinear interpolation filter instead
|
||
of the 4-tap filter. Note: this is supported for both hpel and qpel interpolation.
|
||
Format = Enable
|
||
17:16 no
|
||
MV Cost Scaling Factor (MVCostScaleFactor):
|
||
This term allows the user to redefine the precision of the lookup into the LUT_MV
|
||
based on the MV cost difference from the cost center. The piecewise linear cost
|
||
function is defined from 0 to 64 in powers of 2 intervals, and the precision of the
|
||
difference is set by this field. There are 4 precision choices:
|
||
00: qpel [Qpel difference between MV and cost center: eff cost range 0-15pel]
|
||
01: hpel [Hpel difference between MV and cost center: eff cost range 0-31pel]
|
||
10: pel [Pel difference between MV and cost center: eff cost range 0-63pel]
|
||
11: 2pel [2Pel difference between MV and cost center: eff cost range 0-127pel]
|
||
Format = U2
|
||
15:8 yes
|
||
Macroblock Intra Structure (MbIntraStruct): This is a bitmask specifies
|
||
neighbor macroblock availability. This allows software to constrain intra prediction
|
||
mode search.
|
||
Note: user must set Bit6=Bit5.
|
||
Bits MotionVerticalFieldSelect Index
|
||
7
|
||
Reserved : MBZ
|
||
|
||
6
|
||
Reserved : MBZ
|
||
|
||
5
|
||
IntraPredAvailFlagE/A – A (Left
|
||
neighbor or Left bottom half)
|
||
|
||
4
|
||
IntraPredAvailFlagB – B (Upper
|
||
neighbor)
|
||
3
|
||
IntraPredAvailFlagC – C (Upper
|
||
left neighbor)
|
||
2
|
||
IntraPredAvailFlagD – D (Upper
|
||
right neighbor)
|
||
1:0
|
||
Reserved : MBZ
|
||
|
||
7 yes
|
||
Luma Intra Source Corner Swap (IntraCornerSwap): This field specifies the
|
||
format of the intra luma neighbor pixel format in the message.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 69
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
0: top neighbors are in sequential order
|
||
1: Left-top corner is swapped with the last left-edge neighbor
|
||
|
||
6 yes
|
||
Non Skip MB Mode Cost Added (NonSkipModeAdded): This field indicates
|
||
that the distortion of the survived motion vectors will become non-skip, and the
|
||
MB mode cost will be added to its distortion.
|
||
5 yes
|
||
Non Skip Zero MV Cost Added (NonSkipZMvAdded): This field indicates that
|
||
the distortion of the survived motion vectors will become non-skip, and the zero
|
||
MV component costs will be added to its distortion.
|
||
4:0 yes
|
||
Luma Intra Partition Mask (IntraPartMask): This field specifies which Luma
|
||
Intra partition is enabled/disabled for intra mode decision.
|
||
xxxx1 : luma_intra_16x16 disabled
|
||
xxx1x : luma_intra_8x8 disabled
|
||
xx1xx : luma_intra_4x4 disabled
|
||
Bits [4:3] MBZ
|
||
M1.6 Reserved: MBZ
|
||
31:0 no
|
||
|
||
31:16 no
|
||
M1.5 CostCenter 1 Delta Y (CostCenter0Y): This field defines the Y value for the
|
||
second cost center (associated with the second start) relative to the picture
|
||
source MB Y value.
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-512.00 to 511.75]
|
||
15:0 no
|
||
CostCenter 1 Delta X (CostCenter1X): This field defines the X value for the
|
||
second cost center (associated with the second start) relative to the picture
|
||
source MB X value.
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-2048.00 to 2047.75]
|
||
31:16 no
|
||
M1.4 CostCenter 0 Delta Y (CostCenter0Y): This field defines the Y value for the first
|
||
cost center (associated with the first start) relative to the picture source MB Y
|
||
value.
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-512.00 to 511.75]
|
||
15:0 no
|
||
CostCenter 0 Delta X (CostCenter0X): This field defines the X value for the first
|
||
cost center (associated with the first start) relative to the picture source MB X
|
||
value.
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-2048.00 to 2047.75]
|
||
|
||
M1.3 31:24 yes
|
||
IME Success & FME/BME Bypass Threshold (ImeTooGood): This field
|
||
specifies the threshold value for the ME distortion computes above which sub-pel
|
||
refinement search and bidirectional search are skipped (as the integer-pel
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 70
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
distortion is deemed to be good enough).
|
||
This value, if used, should be set to be greater than Early Success Threshold.
|
||
Format = U4U4 (encoded value should fit in 14-bits)
|
||
|
||
23:16 yes
|
||
Quit Inter Search Threshold (ImeTooBad): This field specifies the threshold
|
||
value for the ME distortion computes above which sub-pel refinement search and
|
||
bidirectional search are skipped (as the integer-pel distortion is deemed to be too
|
||
bad).
|
||
This value, if used, should be set to be greater than Early Success Threshold.
|
||
Format = U4U4 (encoded value should fit in 14-bits)
|
||
15:8 yes
|
||
Partition Distortion Tolerance Threshold (PartToleranceThrhd): defines the
|
||
distortion tolerance used in the intermediate shape decision. (See Shape Decision
|
||
for more detail).
|
||
This field is only valid when PartCandidateEn is set.
|
||
Format = U4U4 (encoded value should fit in 14-bits)
|
||
7:0 no
|
||
FME/BME Pruning Tolerance Threshold (FBPrunThrhd): This field specifies
|
||
the threshold when a normalized absolute difference of the two uni-directional
|
||
distortions is bigger than that, FME is skipped for the losing direction and BME is
|
||
skipped as well if bidirectional is enabled. The difference is normalized by the
|
||
number of 4x4 pixels in the tested partition. For example, for an 8x8 partition, the
|
||
absolute difference of the distortions is divided by 4 (right shifted by 2); and for a
|
||
16x16 partition, it is right shifted by 4. With the unsigned byte, this field provides a
|
||
control of per pixel distortion difference with a large range from 1/16 to 16.
|
||
This field is only valid when FBPrunEn is set to 1 (and for Search Control set to
|
||
111 - dual reference and dual record).
|
||
Format = U4U4 (encoded value should fit in 14-bits)
|
||
|
||
M1.2 31:28 yes
|
||
Start Center 1 Y (Start1Y): This field defines the Y position of Search Path 1
|
||
relative to the reference Y location. It is in unit of SU.
|
||
Format = U4
|
||
|
||
27:24 yes
|
||
StartCenter 1 (Start1X): This field defines the X position of Search Path 1
|
||
relative to the reference X location. It is in unit of SU.
|
||
The corresponding reference block must be fully within the reference region.
|
||
Format = U4
|
||
23:20 yes
|
||
Start Center 0 Y (Start0Y): This field defines the Y position of Search Path 1
|
||
relative to the reference Y location. It is in unit of SU.
|
||
Format = U4
|
||
19:16 yes
|
||
StartCenter 0 X (Start0X): This field defines the X position of Search Path 1
|
||
relative to the reference X location. It is in unit of SU.
|
||
The corresponding reference block must be fully within the reference region.
|
||
Format = U4
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 71
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
15:8 yes
|
||
Maximum Search Path Length (MaxNumSU): This field defines the maximum
|
||
number of SUs per reference including the predetermined SUs and the adaptively
|
||
generated SUs.
|
||
Note: every SU in fixed path will be counted (including the out-bound ones and
|
||
repeated ones), and in addition for adaptive SUs only the ones actually searched
|
||
will be added.
|
||
Format = U8, with valid range of [1,63]
|
||
|
||
7:0 yes
|
||
Max Fixed Search Path Length (LenSP): This field defines the maximum
|
||
number of SUs per reference which are evaluated by the predetermined SUs.
|
||
When adaptive walk is enabled, adaptive walk starts when this number is
|
||
reached.
|
||
Note: every SU in fixed path will be counted (including the out-bound ones and
|
||
repeated ones)
|
||
Format = U8, with valid range of [1,63]
|
||
M1.1 31 yes
|
||
Extented FME Repartition Enable (RepartEn): This field specifies whether the
|
||
repartitioning after FME as described in 6.1.3.3 is enabled.
|
||
0 : disable
|
||
1 : enable
|
||
30 no
|
||
FME/BME Pruning Enable (FBPrunEn): This field specifies whether FME/BME
|
||
pruning is enabled. This is used to speedup the VME operation with low quality
|
||
impact.
|
||
This field is only valid for dual reference case (when Search Control is 111).
|
||
Otherwise, it must be set to zero.
|
||
0 : disable
|
||
1 : enable
|
||
Reserved: MBZ
|
||
29 yes
|
||
AdaptiveValidationControl: if it is on, during adaptive IME searching, VME will
|
||
not pipeline SUs. In other words, VME will have only 1 SU in-flight and will wait
|
||
until all results are updated prior to deciding which SU to move to next. When this
|
||
is off (non-validation mode), VME’s pipeline will have at most 2 SUs in-flight to
|
||
enhance performance, but the out-of-order SU completion behavior will make
|
||
validation efforts exceedingly complex.
|
||
|
||
28 yes
|
||
Unidirectional Mix Disable (UniMixDisable): if it is on, all unidirectional resulting
|
||
motion vectors must share the same direction, i.e. either all are forward, or all are
|
||
backward. If this field is off, each partition, down to 8x8 subblock, may have a
|
||
different mix of forward and backward motion vectors. (Within each 8x8 subblock,
|
||
only one common choice is allowed.)
|
||
This field is MBZ except for cases of Search Control = 111’b (e.g. 7, dual
|
||
reference).
|
||
27:24 yes
|
||
Bidirectional Sub-Macroblock and Sub-Partition Mask (BiSubMbPartMask):
|
||
This field defines the bit-mask for disabling sub-macroblock and sub-partition
|
||
modes. The enabled ones must be a subset of that enabled by SubMbPartMask.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 72
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
Note that 16x8 and 8x16 share the same bit and all sub-partitions share the same
|
||
bit.
|
||
xxx1 : 16x16 disabled
|
||
xx1x : 2x(16x8) and 2x(8x16) within 16x16 disabled
|
||
x1xx : 4x(8x8) within 16x16 disabled
|
||
1xxx: sub-partitions 2x(8x4) and 2x(4x8) and 4x(4x4) within 8x8 are disabled
|
||
|
||
23:22 Reserved: MBZ yes
|
||
21:16 yes
|
||
Bidirectional Weight (BiWeight): This field defines the weighting for the
|
||
backward and forward terms to generate the bidirectional term. This field is only
|
||
valid for bidirectional search (SearchCtrl = 111).
|
||
Format = U6
|
||
Valid Values: [16, 21, 32, 43, 48]
|
||
|
||
15:6 Reserved: MBZ yes
|
||
5:0 yes
|
||
Maximum Number of Motion Vectors (MaxNumMVs): This field specifies the
|
||
maximum number of motion vectors allowed for the current macroblock. This field
|
||
affects the macroblock partition decision. VME will return the best partition with
|
||
MvQuantity not exceeding MaxNumMVs. MaxNumMVs = 0 will only allow skip
|
||
as a valid Inter mode.
|
||
Note: This value is used ONLY for 16x16 source MB mode.
|
||
Usage Example: Certain profiles/levels for AVC standard have restriction
|
||
for the maximum number of motion vectors allowed for two consecutive
|
||
macroblocks (MaxMvsPer2Mb may be 16 or 32).
|
||
Format = U6
|
||
Note: When skip is enabled, MaxNumMVs must be greater or equal to the
|
||
number of skip MVs.
|
||
M1.0 31:24 yes
|
||
Early IME Successful Stop Threshold (EarlyImeStop): This field specifies the
|
||
threshold value for the IME distortion computes of single 16x16 mode below
|
||
which no more search will be performed within the IME unit.
|
||
This field only takes effect if EarlyImeSuccessEn is set.
|
||
Note: Early IME exit only looks at ref0, and uses 8x8 for source 8x8 and 16x8 0
|
||
for source 16x8.
|
||
Format = U4U4 (encoded value should fit in 14-bits)
|
||
23:16 yes
|
||
Early Fme Success Threshold (EarlyFmeSuccess): Applying after fractional
|
||
ME, this field defines the threshold value for the ME distortion computes below
|
||
which the search process will exit early.
|
||
This field only takes effect if EarlySuccessEn is set.
|
||
This field only looks at primary candidate
|
||
Format = U4U4 (encoded value should fit in 14-bits)
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 73
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
15:8 yes
|
||
Skip Success Threshold (SkipSuccess): Applying after skip mode checking (if
|
||
enabled), this field defines the threshold value for the ME distortion computes
|
||
below which the search process will exit early.
|
||
This threshold is always used for setting MbSkipFlag, when the corresponding
|
||
raw distortion is less than or equal to the threshold.
|
||
This field causes early VME termination only if EarlySuccessEn is set to 1.
|
||
Format = U4U4 (encoded value should fit in 14-bits)
|
||
|
||
7 yes
|
||
Transform 8x8 Flag For Inter Enable (T8x8FlagForInterEn): This field specifies
|
||
whether Transform8x8Flag is updated for inter mode according the resulting inter-
|
||
mode sub-partition size.
|
||
0 : disable
|
||
1 : enable
|
||
6 yes
|
||
Quit Inter Search Enable (QuitInterEn): This field specifies whether the inter
|
||
search may be prematurely terminated after IME when the IME distortion is worse
|
||
than the predetermined threshold QuitInterThrhd. When this field is not set, if
|
||
early out does occur on full-pel location, hardware switches to local sub-pel
|
||
refinement search. When this field is set, however, the local sub-pel refinement
|
||
step is skipped.
|
||
This field takes effect independent of EarlySuccessEn.
|
||
0 : disable
|
||
1 : enable
|
||
5 yes
|
||
Early IME Success Enable (EarlyImeSuccessEn): This field specifies whether
|
||
the Early Success may terminate on full-pel precision. When this field is not set, if
|
||
early out does occur on full-pel location, hardware continues to local sub-pel
|
||
refinement search and so on. When this field is set, however, the local sub-pel
|
||
refinement step is skipped and intra search is also skipped.
|
||
This field only takes effect if EarlySuccessEn is set.
|
||
Usage example: This may be used for cases with large static area where
|
||
(0,0) motion vector delivers very good results that no FME refinement is
|
||
needed and also intra check is also skipped. This may also be used in
|
||
place of Skip Mode Checking when the skip center(s) happens to be an
|
||
integer location inside the SU of the Start Center(s).
|
||
0 : disable
|
||
1 : enable
|
||
|
||
4 yes
|
||
Early Success Enable (EarlySuccessEn): This field enables Early Success of
|
||
the motion search when the ME distortion is below EarlySuccessThrhd. Early
|
||
Success may occur during skip mode check, integer search and sub-pel search
|
||
stages. Termination directly out of integer search is controlled by the
|
||
EarlySuccessImeEn field.
|
||
0 : disable
|
||
1 : enable
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 74
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
3 yes
|
||
Partition Candidates Enable (PartCandidateEn): This field enables multiple
|
||
partition candidates (VME hardware supports only up to two candidates). When it
|
||
is set, a second partition candidate that is within PartToleranceThrhd from the
|
||
best partition is kept for subsequent inter-search operations.
|
||
This field is only allowed to be set to 1 if SrcSize is 16x16.
|
||
0: a single partition is determined by IME
|
||
1: multiple partition candidates are allowed
|
||
|
||
2 yes
|
||
Bidirectional Mix Disable (BiMixDis): if it is on, all resulting motion vectors must
|
||
share the same direction, i.e. either all are unidirectional (i.e. forward or
|
||
backward), or all bidirectional. If this field is off, each partition may have different
|
||
search direction (forward, backward or bidirectional).
|
||
Usage Example: MPEG2 bidirectional decision is at whole macroblock level,
|
||
while AVC decision is at subblock level.
|
||
0: bidirectional decision on subblock level that bidirectional mode is enabled
|
||
1: bidirectional decision on whole macroblock
|
||
1 yes
|
||
Adaptive Search Enable (AdaptiveEn): This field defines whether adaptive
|
||
searching is enabled for IME. When Adaptive Search is enabled, there must be at
|
||
least two search steps preceded. It is either from a single start with step of >=2 or
|
||
from a dual-start.
|
||
0 : disable
|
||
1 : enable
|
||
0 yes
|
||
Skip Mode Enable (SkipModeEn): This field specifies whether the skip mode
|
||
checking is performed before the motion search. If this field is set, Skip Center,
|
||
which may have a sub-pel precision, is first tested before IME.
|
||
0 : disable
|
||
1 : enable
|
||
Note: It must be 0 if Inter is not ON in Message Type or if SrcType!=00 (less
|
||
than 16x16)
|
||
M2.7 31:0 no
|
||
Ref1 SkipCenter 3 Delta XY (for definition see M2.0)
|
||
|
||
M2.6 31:0 no
|
||
Ref0 SkipCenter 3 Delta XY (for definition see M2.0)
|
||
|
||
M2.5 31:0 no
|
||
Ref1 SkipCenter 2 Delta XY (for definition see M2.0)
|
||
|
||
M2.4 31:0 no
|
||
Ref0 SkipCenter 2 Delta XY (for definition see M2.0)
|
||
|
||
M2.3 31:0 no
|
||
Ref1 SkipCenter 1 Delta XY (for definition see M2.0)
|
||
|
||
M2.2 31:0 no
|
||
Ref0 SkipCenter 1 Delta XY (for definition see M2.0)
|
||
|
||
M2.1 31:0 no
|
||
Ref1 SkipCenter 0 Delta XY (for definition see M2.0)
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 75
|
||
Same as
|
||
DWord Bit Description Prev. Gen?
|
||
31:16 no
|
||
M2.0 Ref0 Skip Center 0 Delta Y:
|
||
This field defines the Y value for the forward skip center relative to the 8x8 block
|
||
offset from the source MB Y location in quarter-pel precision associated with
|
||
Ref0.
|
||
To match the relative 8x8 block location, the HW will add fixed offsets to the 4
|
||
skip centers in each direction to generate the correct pixel location to fetch the
|
||
data.
|
||
For SkipCenter 0: VME will add 0 to the user-input Y value.
|
||
For SkipCenter 1: VME will add 0 to the user-input Y value.
|
||
For SkipCenter 2: VME will add 32 to the user-input Y value.
|
||
For SkipCenter 3: VME will add 32 to the user-input Y value.
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-512.00 to 511.75]
|
||
|
||
15:0 no
|
||
Ref0 SkipCenter 0 Delta X:
|
||
This field defines the X value for the forward skip center relative to the 8x8 block
|
||
offset from the source MB X location in quarter-pel precision associated with
|
||
Ref0.
|
||
To match the relative 8x8 block location, the HW will add fixed offsets to the 4
|
||
skip centers in each direction to generate the correct pixel location to fetch the
|
||
data.
|
||
For SkipCenter 0: VME will add 0 to the user-input X value.
|
||
For SkipCenter 1: VME will add 32 to the user-input X value.
|
||
For SkipCenter 2: VME will add 0 to the user-input X value.
|
||
For SkipCenter 3: VME will add 32 to the user-input X value.
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-2048.00 to 2047.75]
|
||
|
||
For Message Type of 10 and 11, the VME request message has additional two phases to deliver the
|
||
neighbor macroblock pixels for intra prediction. Here the neighbor pixel location [x, y] is relative to the
|
||
current 16x16 macroblock, with [x,y] = [-1, -1] for the upper-left corner edge pixel in neighbor D, [-1,
|
||
0…15] for the left edge pixels in neighbor A, and [0…15…23, -1] for the upper and upper-right edge
|
||
pixels in neighbors B and C.
|
||
Note that for Message Type of 10, which is intra-search only mode, the fields regarding reference
|
||
windows and inter-prediction control in the command are ignored by hardware (and no pixels are fetched
|
||
from the reference window(s)).
|
||
To help with vector data access in software, horizontal neighbor pixels from D, B, and C are stored in
|
||
one register in raster order with 8 pixel alignment. Vertical neighbor pixels from A are stored in a separate
|
||
register.
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 76
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
M3.7 31:0 yes, but
|
||
Neighbor pixel Luma value [23, -1] to [20, -1]. Upper-right pixels from neighbor
|
||
was M2
|
||
macroblock C
|
||
M3.6 31:0 yes, but
|
||
Neighbor pixel Luma value [19, -1] to [16, -1]. Upper-right edge pixels from
|
||
was M2
|
||
neighbor macroblock C
|
||
M3.5 31:0 yes, but
|
||
Neighbor pixel Luma value [15, -1] to [12, -1]. Top edge pixels from neighbor
|
||
was M2
|
||
macroblock B
|
||
M3.4 31:0 yes, but
|
||
Neighbor pixel Luma value [11, -1] to [8, -1]. Top edge pixels from neighbor
|
||
was M2
|
||
macroblock B
|
||
|
||
M3.3 31:0 yes, but
|
||
Neighbor pixel Luma value [7, -1] to [4, -1]. Top edge pixels from neighbor
|
||
was M2
|
||
macroblock B
|
||
M3.2 31:24 yes, but
|
||
Neighbor pixel Luma value [3, -1]. Fourth top edge pixel from neighbor macroblock
|
||
was M2
|
||
B
|
||
23:16 yes, but
|
||
Neighbor pixel Luma value [2, -1]. Third top edge pixel from neighbor macroblock
|
||
was M2
|
||
B
|
||
15:8 yes, but
|
||
Neighbor pixel Luma value [1, -1]. Second top edge pixel from neighbor
|
||
was M2
|
||
macroblock B
|
||
|
||
7:0 yes, but
|
||
Neighbor pixel Luma value [0, -1]. First top edge pixel from neighbor macroblock B
|
||
was M2
|
||
31:24 yes, but
|
||
M3.1 Corner Neighbor pixel 0. Its content depends on IntraCornerSwap field. It swaps
|
||
was M2
|
||
with Corner Neighbor pixel 1.
|
||
Neighbor pixel Luma value [-1, -1]. The one upper-left edge pixel from neighbor
|
||
macroblock D, which is the right most edge pixel of D, if IntraCornerSwap field is 0.
|
||
Or
|
||
Neighbor pixel Luma value [-1, 15]. The last left edge pixel from neighbor
|
||
macroblock A, which is the left most edge pixel of D, if IntraCornerSwap field is 1.
|
||
|
||
Reserved: MBZ (Hardware ignores this field)
|
||
23:4 no
|
||
3:0 no
|
||
AVC Intra 16x16 Mode Mask (Intra16x16ModeMask):
|
||
Disables given intra mode as follows.
|
||
xxx1:
|
||
xx1x:
|
||
x1xx:
|
||
1xxx:
|
||
|
||
Reserved: MBZ (Hardware ignores this field)
|
||
M3.0 31:25 no
|
||
24:16 no
|
||
AVC Intra 8x8 Mode Mask (Intra16x16ModeMask):
|
||
Disables given intra mode as follows.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 77
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
x xxxx xxx1:
|
||
x xxxx xx1x:
|
||
x xxxx x1xx:
|
||
x xxxx 1xxx:
|
||
x xxx1 xxxx:
|
||
x xx1x xxxx:
|
||
x x1xx xxxx:
|
||
x 1xxx xxxx:
|
||
1 xxxx xxxx:
|
||
Reserved: MBZ (Hardware ignores this field)
|
||
15:9 no
|
||
8:0 no
|
||
AVC Intra 4x4 Mode Mask (Intra16x16ModeMask):
|
||
Disables given intra mode as follows.
|
||
x xxxx xxx1:
|
||
x xxxx xx1x:
|
||
x xxxx x1xx:
|
||
x xxxx 1xxx:
|
||
x xxx1 xxxx:
|
||
x xx1x xxxx:
|
||
x x1xx xxxx:
|
||
x 1xxx xxxx:
|
||
1 xxxx xxxx:
|
||
M4.7 Reserved: MBZ
|
||
31:0 no
|
||
|
||
M4.6 Reserved: MBZ
|
||
31:0 no
|
||
M4.5 Reserved: MBZ
|
||
31:0 no
|
||
M4.4 31:28 yes, but
|
||
Intra Predictor Mode for Neighbor B15 (IntraMxMPredModeB15): This field
|
||
was M3
|
||
carries the intra prediction mode of the fourth bottom 4x4 block (Block 15 in
|
||
Numbers of Block4x4 in a 16x16 region) of the top neighbor macroblock B. Definition
|
||
of the term is according to Sections 8.3.1 and 8.3.2 of the AVC specification.
|
||
27:24 yes, but
|
||
Intra Predictor Mode for Neighbor B14 (IntraMxMPredModeB14): This field
|
||
was M3
|
||
carries the intra prediction mode of the third bottom 4x4 block (Block 14 in Numbers
|
||
of Block4x4 in a 16x16 region) of the top neighbor macroblock B. Definition of the
|
||
term is according to Sections 8.3.1 and 8.3.2 of the AVC specification.
|
||
|
||
23:20 yes, but
|
||
Intra Predictor Mode for Neighbor B11 (IntraMxMPredModeB11): This field
|
||
was M3
|
||
carries the intra prediction mode of the second bottom 4x4 block (Block 11 in
|
||
Numbers of Block4x4 in a 16x16 region) of the top neighbor macroblock B. Definition
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 78
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
of the term is according to Sections 8.3.1 and 8.3.2 of the AVC specification.
|
||
19:16 yes, but
|
||
Intra Predictor Mode for Neighbor B10 (IntraMxMPredModeB10): This field
|
||
was M3
|
||
carries the intra prediction mode of the first bottom 4x4 block (Block 10 in Numbers
|
||
of Block4x4 in a 16x16 region)of the top neighbor macroblock B. Definition of the
|
||
term is according to Sections 8.3.1 and 8.3.2 of the AVC specification.
|
||
15:12 yes, but
|
||
Intra Predictor Mode for Neighbor A15 (IntraMxMPredModeA15): This field
|
||
was M3
|
||
carries the intra prediction mode of the fourth rightmost 4x4 block (Block 15 in
|
||
Numbers of Block4x4 in a 16x16 region) of the left neighbor A. Definition of the term
|
||
is according to Sections 8.3.1 and 8.3.2 of the AVC specification.
|
||
11:8 yes, but
|
||
Intra Predictor Mode for Neighbor A13 (IntraMxMPredModeA13): This field
|
||
was M3
|
||
carries the intra prediction mode of the third rightmost 4x4 block (Block 13 in
|
||
Numbers of Block4x4 in a 16x16 region) of the left neighbor A. Definition of the term
|
||
is according to Sections 8.3.1 and 8.3.2 of the AVC specification.
|
||
|
||
7:4 yes, but
|
||
Intra Predictor Mode for Neighbor A7 (IntraMxMPredModeA7): This field carries
|
||
was M3
|
||
the intra prediction mode of the second rightmost 4x4 block (Block 7 in Numbers of
|
||
Block4x4 in a 16x16 region) of the left neighbor A.
|
||
3:0 yes, but
|
||
Intra Predictor Mode for Neighbor A5 (IntraMxMPredModeA5): This field carries
|
||
was M3
|
||
the intra prediction mode of the first rightmost 4x4 block (Block 5 in Numbers of
|
||
Block4x4 in a 16x16 region) of the left neighbor A. Definition of the term is according
|
||
to Sections 8.3.1 and 8.3.2 of the AVC specification.
|
||
Intra Predictor Modes for Neighbor A and B are only used if
|
||
MODE_INTRA_NOPRED is not zero.
|
||
For intra mode selection, bias is applied to the predicted mode if a predictor is
|
||
present for a partition. This is achieved by applying a penalty term
|
||
MODE_INTRA_NONPRED defined in the VME state to the cost functions for non-
|
||
predicted modes.
|
||
The predictor for a given partition is from its left neighbor and top neighbor. The intra
|
||
decision for a partition serves as the predictor for the next partition in the partition
|
||
order as defined in Numbers of Block4x4 in a 16x16 region and Numbers of
|
||
Block4x4 in an 8x8 region or numbers of Block8x8 in a 16x16 region.
|
||
This set of intra predictor mode for neighbor macroblocks are only used for
|
||
INTRA8x8 and INTRA4x4 modes.
|
||
Format : U4 (The value of this field is defined in Definition of Intra4x4PredMode
|
||
which is the same as that in Definition of Intra8x8PredMode.)
|
||
M4.3 31:24 yes, but
|
||
Corner Neighbor pixel 1. Its content depends on IntraCornerSwap field. It swaps
|
||
was M3
|
||
with Corner Neighbor pixel 0.
|
||
Neighbor pixel Luma value [-1, -1]. The one upper-left edge pixel from neighbor
|
||
macroblock D, which is the right most edge pixel of D, if IntraCornerSwap field is 1.
|
||
Or
|
||
Neighbor pixel Luma value [-1, 15]. The last left edge pixel from neighbor
|
||
macroblock A, which is the left most edge pixel of D, if IntraCornerSwap field is 0.
|
||
|
||
23:0 yes, but
|
||
Neighbor pixel Luma value [-1, 14] to [-1, 12]. Left edge pixels from neighbor
|
||
was M3
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 79
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
macroblock A
|
||
M4.2 31:0 yes, but
|
||
Neighbor pixel Luma value [-1, 11] to [-1, 8]. Left edge pixels from neighbor
|
||
was M3
|
||
macroblock A
|
||
M4.1 31:0 yes, but
|
||
Neighbor pixel Luma value [-1, 7] to [-1, 4]. Left edge pixels from neighbor
|
||
was M3
|
||
macroblock A
|
||
M4.0 31:24 yes, but
|
||
Neighbor pixel Luma value [-1, 3]. Fourth left edge pixel from neighbor macroblock
|
||
was M3
|
||
A
|
||
|
||
23:16 yes, but
|
||
Neighbor pixel Luma value [-1, 2]. Third left edge pixel from neighbor macroblock
|
||
was M3
|
||
A
|
||
15:8 yes, but
|
||
Neighbor pixel Luma value [-1, 1]. Second left edge pixel from neighbor
|
||
was M3
|
||
macroblock A
|
||
7:0 yes, but
|
||
Neighbor pixel Luma value [-1, 0]. First left edge pixel from neighbor macroblock A
|
||
was M3
|
||
|
||
|
||
3.5.4 Writeback Message
|
||
In order to minimize kernel software overhead, the PLACEMENTS of the bit-fields as well as the
|
||
words/dwords are specifically designed to match with the inline data of the MFC_PAK_OBJECT
|
||
command of MFX.
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
W0.7 31:28 yes
|
||
VME Decisions – Other: These 4 bits are used to expose internal behavior of VME to
|
||
the kernel, specifically whether or not FME or BME had a positive impact, whether or
|
||
not the ExtraCandidate adds any value to be checked, and whether or not the MaxMV
|
||
value limited partitioning to a larger shape decision.
|
||
xxx1: After FME, the primary candidate’s distortion was improved.
|
||
xx1x: After BME, the primary candidate’s distortion was improved.
|
||
x1xx: When VME concludes, the ExtraCandidate ends up beating the initial
|
||
primary candidate.
|
||
1xxx: The MaxMV value restricted the final partition decision (VME would have
|
||
picked a more detailed shape, but couldn’t due to motion vector constraint). ).
|
||
This field only applies to the final partition decision of the main partitioning or
|
||
candidate and not the alternate candidate. It is only valid incase of SrcSize 16x16.
|
||
Otherwise it is MBZ.
|
||
27:23 yes
|
||
VME Decisions – Early Exit Conditions: These 5 bits expose to the kernel that VME
|
||
finished prior to completing all subfunctions and for what early exit criteria this
|
||
occurred. Note, these values are only set when the VmeFlag “EarlySuccess” is
|
||
enabled.
|
||
xxxx1: EarlySkipExit Occurred
|
||
xxx1x: EarlyImeStop Occurred
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 80
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
xx1xx: ImeTooGood Occurred
|
||
x1xxx: ImeTooBad Occurred
|
||
1xxxx: EarlyFmeExit Occurred
|
||
22:16 yes
|
||
VME Decisions – Sub-Functions Performed: These 7 bits expose to the kernel
|
||
which sub-functions VME performed. Also, each sub-function is explicitly listed for
|
||
primary or extra candidate for FME and BME. There is some redundancy with respect
|
||
to Skipcheck and Intra based on input state to VME.
|
||
xxxxxx1: Performed Skipcheck
|
||
xxxxx1x: Performed IME
|
||
xxxx1xx: Performed FME on primary
|
||
xxx1xxx: Performed FME on extra candidate
|
||
xx1xxxx: Performed BME on primary
|
||
x1xxxxx: Performed BME on extra candidate
|
||
15:8 yes
|
||
Sub-Macroblock Prediction Mode (SubMbPredMode): If InterMbMode is
|
||
INTER8x8, this field describes the prediction mode of the sub-partitions in the four 8x8
|
||
sub-macroblock. It contains four subfields each with 2-bits, corresponding to the four
|
||
8x8 sub-macroblocks in sequential order.
|
||
This field is derived from sub_mb_type for a BP_8x8 macroblock.
|
||
This field is derived from MbType for a non-BP_8x8 inter macroblock, and carries
|
||
redundant information as MbType).
|
||
If InterMbMode is INTER16x16, INTER16x8 or INTER8x16, this field carries the
|
||
prediction modes of the sub macroblock (one 16x16, two 16x8 or two 8x16). The
|
||
unused bits are set to zero.
|
||
Bits [1:0]: SubMbPredMode[0]
|
||
Bits [3:2]: SubMbPredMode[1]
|
||
Bits [5:4]: SubMbPredMode[2]
|
||
Bits [7:6]: SubMbPredMode[3]
|
||
7:0 yes
|
||
Sub-Macroblock Shape (SubMbShape): This field describes the subdivision of the
|
||
four 8x8 sub-macroblocks. It contains four subfields each with 2-bits, corresponding to
|
||
the four 8x8 sub macroblocks in sequential order.
|
||
This field is derived from sub_mb_type for a BP_8x8 or equivalent macroblock.
|
||
This field is forced to 0 for a non-BP_8x8 inter macroblock, and effectively carries
|
||
redundant information as MbType).
|
||
This field is only valid If InterMbMode is INTER8x8, Otherwise, it is set to zero.
|
||
Bits [1:0]: SubMbShape[0]
|
||
Bits [3:2]: SubMbShape[1]
|
||
Bits [5:4]: SubMbShape[2]
|
||
Bits [7:6]: SubMbShape[3]
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 81
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
W0.6 31:26 yes
|
||
Alternate Search Path Length: Counts the number of unique search units computed
|
||
by VME for the alternate search path for dual reference or dual search path. If the
|
||
search path would return to a previously processed SU, it would not be reprocessed
|
||
and hence not recounted. The value of [W0.1 15:8] is the overall total search units
|
||
processed from both paths whereas this value is the contribution only from the second
|
||
search path. Note: Whenever VME is in a mode that processes only a single search
|
||
path, this field will be 0x0.
|
||
Format: U6, Range of 0-48
|
||
25:16 yes
|
||
Total VME Stalled Clocks by 16: Counts the number of clocks VME is
|
||
stalled\starved while processing this request, due to cache misses. The result is
|
||
returned in units of 16 clock intervals. If the maximum value is returned, the full range
|
||
was exceeded and the value clipped to the max (this is very unlikely).
|
||
Format: U10, Range of 0-1023 [logical range of 0-16383 in 16 clock intervals]
|
||
|
||
15:8 yes
|
||
Total VME Compute Clocks by 16: Counts the number of clocks VME is processing
|
||
this request, but not stalled\starved as a result of cache misses. The result is returned
|
||
in units of 16 clock intervals. If the maximum value is returned, the full range was
|
||
exceeded and the value clipped to the max (this is very unlikely).
|
||
7:0 yes
|
||
Macroblock Intra Structure (MbIntraStruct): This is a bitmask specifies neighbor
|
||
macroblock availability. This allows software to constrain intra prediction mode search.
|
||
This field is simply copied from the input message (to reduce software overhead of
|
||
forming the output message to PAK).
|
||
Bits MotionVerticalFieldSelect Index
|
||
7
|
||
Reserved : MBZ (for
|
||
IntraPredAvailFlagF – F (pixel[-
|
||
1,7] available for MbAff)
|
||
6
|
||
Reserved : MBZ (for
|
||
IntraPredAvailFlagA/E – A (left
|
||
neighbor top half for MbAff)
|
||
5
|
||
IntraPredAvailFlagE/A – A (Left
|
||
neighbor or Left bottom half)
|
||
4
|
||
IntraPredAvailFlagB – B (Upper
|
||
neighbor)
|
||
3
|
||
IntraPredAvailFlagC – C (Upper
|
||
left neighbor)
|
||
2
|
||
IntraPredAvailFlagD – D (Upper
|
||
right neighbor)
|
||
|
||
1:0
|
||
Reserved : MBZ (for
|
||
ChromaIntraPredMode)
|
||
|
||
W0.5 31:16 yes
|
||
LumaIntraPredModes[3]
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 82
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
Specifies the Luma Intra Prediction mode for four 4x4 sub-block of a MB, 4-bit each.
|
||
15:0 yes
|
||
LumaIntraPredModes[2]
|
||
Specifies the Luma Intra Prediction mode for four 4x4 sub-block of a MB, 4-bit each.
|
||
W0.4 31:16 yes
|
||
LumaIntraPredModes[1]
|
||
Specifies the Luma Intra Prediction mode for four 4x4 sub-block of a MB, 4-bit each.
|
||
15:0 yes
|
||
LumaIntraPredModes[0]
|
||
Specifies the Luma Intra Prediction mode for four 4x4 sub-block, four 8x8 block or one
|
||
intra16x16 of a MB.
|
||
4-bit per 4x4 sub-block (Transform8x8Flag=0, Mbtype=0 and intraMbFlag=1) or 8x8
|
||
block (Transform8x8Flag=1, Mbtype=0, MbFlag=1), since there are 9 intra modes.
|
||
4-bit for intra16x16 MB (Transform8x8Flag=0, Mbtype=1 to 24 and intraMbFlag=1),
|
||
but only the LSBit[1:0] is valid, since there are only 4 intra modes.
|
||
|
||
W0.3 yes
|
||
31:28 Direct8x8Pattern
|
||
This field indicates whether each of the four 8x8 sub macroblocks is using the
|
||
predicted MVs and will not be explicitly coded in the bitstream (the sub macroblock will
|
||
be coded as direct mode). It contains four 1-bit subfields, corresponding to the 4 sub
|
||
macroblocks in sequential order. The whole macroblock may be actually coded as
|
||
B_Direct_16x16 or B_Skip, according to the macroblock type conversion rules
|
||
described in a later sub section.
|
||
This field is only valid for a B slice. It is ignored by hardware for a P slice.
|
||
0 in a bit – Corresponding MVs are sent in the bitstream
|
||
1 in a bit – Corresponding MVs are not sent in the bitstream
|
||
Reserved: MBZ
|
||
27:14 yes
|
||
13:0 yes
|
||
BestIntraDistortion
|
||
The IntraMbMode will indicate if this is a 16x16/8x8/4x4 distortion.
|
||
Format = U14
|
||
W0.2 Reserved: MBZ
|
||
31 yes
|
||
|
||
30 yes
|
||
SkipRawDistortionInvalid
|
||
Format = U14
|
||
29:16 yes
|
||
SkipRawDistortion
|
||
Format = U14
|
||
Reserved: MBZ
|
||
15:14 yes
|
||
13:0 yes
|
||
InterDistortion
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 83
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
Format = U14
|
||
W0.1 Reserved: MBZ
|
||
31:30 yes
|
||
29:16 yes
|
||
Minimal Distortion: This field contains the overall distortion for the source block
|
||
associated with the winning MbType, which could be one of intra or inter modes.
|
||
Format = U14
|
||
15:8 yes
|
||
Search Path Length: This field returns the number of SU it takes in the integer
|
||
search. It includes predetermined search path and dynamic search path.
|
||
Format: U8
|
||
|
||
7:4 yes
|
||
Reference 1 border reached: bitmask indicating whether any border of reference 1 is
|
||
reached by one or more motion vectors in the winning inter mode.
|
||
xxx1: left border reached
|
||
xx1x: right border reached
|
||
x1xx: top border reached
|
||
1xxx: bottom border reached
|
||
3:0 yes
|
||
Reference 0 border reached: bitmask indicating whether any border of reference 0 is
|
||
reached by one or more motion vectors in the winning inter mode.
|
||
xxx1: left border reached
|
||
xx1x: right border reached
|
||
x1xx: top border reached
|
||
1xxx: bottom border reached
|
||
W0.0
|
||
31 ExtendedForm (IVB only) yes
|
||
This field specifies that LumaIntraMode’s are fully replicated in 4x4 sub-blocks
|
||
respectively. And motion vectors must be in unpacked form as well. This non-DXVA
|
||
form is used for optimal kernel performance.
|
||
|
||
30:29 Reserved: MBZ
|
||
28:24 yes
|
||
MvQuantity
|
||
Specify the number of MVs in packed format (in unit of motion vectors).
|
||
Note: this field is provided to help with software to meet conformance requirements
|
||
such as maximum number of motion vectors for two consecutive macroblocks.
|
||
Format: U5, valid from 0 to 32
|
||
|
||
23 Reserved : MBZ yes
|
||
(reserved for ExternalMvBufFlag. It is always 0 in this case, since MV’s are
|
||
included)
|
||
22:20 yes
|
||
MvSize (Motion Vector Size). This field specifies the size and format of the output
|
||
motion vectors.
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 84
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
This field is reserved (MBZ) when the output signal IntraMbFlag = 1.
|
||
The valid encodings are:
|
||
000 = 0: No motion vector
|
||
100 = 8MV: Four 8x8 motion vector pairs
|
||
110 = 32MV: 16 4x4 motion vector pairs
|
||
Others are reserved.
|
||
(The following encodings are intended for future usages:
|
||
001 = 1MV: one 16x16 motion vector
|
||
010 = 2MV: One 16x16 motion vector pair
|
||
011 = 4MV: Four 8x8 motion vectors
|
||
101 = 16MV: 16 4x4 motion vectors
|
||
111 = Packed, number of MVs is given by MvQuantity.)
|
||
19 yes
|
||
DcBlockCodedYFlag. This field specifies if the Luma DC sub-block is coded.
|
||
1 – the 4x4 DC-only Luma sub-block of the Intra16x16 coded MB is present; it is still
|
||
possible that all DC coefficients are zero.
|
||
0 – no 4x4 DC-only Luma sub-block is present; either not in Intra16x16 MB mode or
|
||
all DC coefficients are zero.
|
||
VME hardware forces this output to be 1.
|
||
18 yes
|
||
DcBlockCodedCbFlag. This field specifies if the Chroma Cb DC sub-block is coded.
|
||
1 – the 2x2 DC-only Chroma Cb sub-block of all coded MB (any type) is present; it is
|
||
still possible that all DC coefficients are zero.
|
||
0 – no 2x2 DC-only Chroma Cb sub-block is present; all DC coefficients are zero.
|
||
VME hardware forces this output to be 1.
|
||
17 yes
|
||
DcBlockCodedCrFlag. This field specifies if the Chroma Cb DC sub-block is coded.
|
||
1 – the 2x2 DC-only Chroma Cr sub-block of all coded MB (any type) is present; it is
|
||
still possible that all DC coefficients are zero.
|
||
0 – no 2x2 DC-only Chroma Cr sub-block is present; all DC coefficients are zero.
|
||
VME hardware forces this output to be 1.
|
||
|
||
Reserved: MBZ
|
||
16 yes
|
||
15 yes
|
||
Transform8x8Flag (Transform 8x8 Flag)
|
||
This field indicates that 8x8 transform is recommended.
|
||
It is set to 1 if IntraMbFlag = INTRA and IntraMbMode = INTRA_8x8.
|
||
For IntraMbFlag = INTER. If T8x8FlagForInterEn = 0, this field is set to 0 by VME
|
||
hardware. If T8x8FlagForInterEn = 1, this field is set to 1 if there is no sub
|
||
macroblock size less than 8x8 (noSubMbPartSizeLessThan8x8Flag = 1).
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 85
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
0: 4x4 integer transform
|
||
1: 8x8 integer transform
|
||
Note: This bit will be always 0 for non-16x16 source block cases.
|
||
14 yes
|
||
FieldMbFlag
|
||
This field indicates the inter prediction result is field or frame.
|
||
It is always set to SrcAccess.
|
||
0: frame macroblock
|
||
1: field macroblock
|
||
13 yes
|
||
IntraMbFlag
|
||
This field specifies whether the current macroblock is an Intra (I) macroblock. Even
|
||
though I_PCM is considered as Intra MB, VME hardware cannot generate I_PCM
|
||
output.
|
||
For I-picture MB (IntraPicFlag =1), this field must be set to 1.
|
||
This flag must be set in consistent with the interpretation of MbType (inter or intra
|
||
modes).
|
||
0: INTER (inter macroblock)
|
||
1: INTRA (intra macroblock)
|
||
12:8 yes
|
||
MbType
|
||
This field is encoded to match with the best macroblock type determined as described
|
||
in the next section. It follows an unified encoding for inter and intra macroblocks
|
||
according to AVC Spec.
|
||
|
||
7 yes
|
||
FieldMbPolarityFlag
|
||
This field indicates the field polarity of the current macroblock.
|
||
Unique for AVC standard, within an MbAff frame picture, this field may be different per
|
||
macroblock and is set to 1 only for the second macroblock in an MbAff pair if
|
||
FieldMbFlag is set. Otherwise, it is set to 0.
|
||
Within a field picture in most coding standard, this field is a constant for the whole field
|
||
picture. It is set to 1 if the current picture is the bottom field picture. Otherwise, it is set
|
||
to 0.
|
||
This field is reserved and MBZ for a progressive frame picture.
|
||
VME hardware set this field to 1 if the source block is a field block from the bottom
|
||
field and otherwise sets it to 0. This is accomplished by the following equation using
|
||
input signals SrcAccess and SrcY: SrcAccess && (bit0(SrcY) ==1).
|
||
0 = Current macroblock is a field macroblock from the top field
|
||
1 = Current macroblock is a field macroblock from the bottom field
|
||
|
||
Reserved: MBZ
|
||
6 yes
|
||
5:4 yes
|
||
IntraMbMode
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 86
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
This field is provided to carry redundant information as that in MbType. The full
|
||
extended definition of this field allows kernel software to help update the MbType field
|
||
when outputting controls to the MFX PAK encoding.
|
||
VME outputs this field regardless of MbIntraFlag value if intra mode is enabled.
|
||
Reserved: MBZ
|
||
3 yes
|
||
2 yes
|
||
MbSkipFlag
|
||
As an output of VME, this bit indicates whether one skip center (possibly of several
|
||
skip centers for each partition) is the winning motion vector position.
|
||
VME outputs this field regardless of MbIntraFlag value.
|
||
Note that the meaning of this field in VME is not the same as that used in PAK.
|
||
|
||
yes
|
||
1:0 InterMbMode
|
||
This field is provided to carry redundant information as that in MbType. The full
|
||
extended definition of this field allows kernel software to help update the MbType field
|
||
when outputting controls to the MFX PAK encoding.
|
||
VME outputs this field regardless of MbIntraFlag value if inter mode is enabled.
|
||
|
||
W1.7 to 31:0 no
|
||
MVb[3] to MVb[1]. Motion vectors 3 to 1 for Reference 1, and
|
||
W1.2 Each
|
||
MVa[3] to MVa[1]. Motion vectors 3 to 1 for Reference 0
|
||
|
||
31:16 no
|
||
W1.1 MVb[0].y: returning the y-coordinate of Motion Vector 0 for Reference 1, relative to
|
||
source MB location.
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-512.00 to 511.75]
|
||
15:0 no
|
||
MVb[0].x: returning the x-coordinate of Motion Vector 0 (co-located w/
|
||
sublbock_4x4_0) for Reference 1, relative to source MB location. Its meaning is
|
||
determined by MbType.
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-2048.00 to 2047.75]
|
||
31:16 no
|
||
W1.0 MVa[0].y: returning the y-coordinate of Motion Vector 0 for Reference 0, relative to
|
||
source MB location.
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-512.00 to 511.75]
|
||
|
||
15:0 no
|
||
MVa[0].x: returning the x-coordinate of Motion Vector 0 (co-located w/
|
||
sublbock_4x4_0) for Reference 0, relative to source MB location. Its meaning is
|
||
determined by MbType.
|
||
The returned motion vectors are placed in a fixed data format, with up to 16 motion
|
||
vectors for one reference and the motion vectors from reference 0 and 1 interleaved.
|
||
Format = S13.2 (2’s comp)
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 87
|
||
Same as
|
||
Prev.
|
||
DWord Bit Description Gen?
|
||
Hardware Range: [-2048.00 to 2047.75]
|
||
W2.7 to 31:0 no
|
||
MVb[7] to MVb[4]. Motion vectors 7 to 4 for Reference 1, and
|
||
W2.0 Each
|
||
MVa[7] to MVa[4]. Motion vectors 7 to 4 for Reference 0
|
||
|
||
W3.7 to 31:0 no
|
||
MVb[11] to MVb[8]. Motion vectors 11 to 8 for Reference 1, and
|
||
W3.0 Each
|
||
MVa[11] to MVa[8]. Motion vectors 11 to 8 for Reference 0
|
||
|
||
W4.7 to 31:0 no
|
||
MVb[15] to MVb[12]. Motion vectors 15 to 12 for Reference 1, and
|
||
W4.0 Each
|
||
MVa[15] to MVa[12]. Motion vectors 15 to 12 for Reference 0
|
||
|
||
W5.7 to yes, but
|
||
31:0 InterDistortion[15] to InterDistortion[2]. Inter-prediction-distortion associated with
|
||
W5.1 was M3
|
||
motion vector 15 to 2. Its meaning is determined by sub-shape.
|
||
Each
|
||
W5.0 Reserved: MBZ
|
||
31:30 yes, but
|
||
was M3
|
||
29:16 yes, but
|
||
InterDistortion[1]. Inter-prediction-distortion with motion vector 1 (co-located with
|
||
was M3
|
||
subblock_4x4_1). Its meaning is determined by sub-shape.
|
||
Format = U14
|
||
Reserved: MBZ
|
||
15:14 yes, but
|
||
was M3
|
||
|
||
13:0 yes, but
|
||
InterDistortion[0]. Inter-prediction-distortion associated with motion vector 0 (co-
|
||
was M3
|
||
located with subblock_4x4_0). Its meaning is determined by sub-shape. It must be
|
||
zero if the corresponding sub-shape is not chosen.
|
||
This field may be associated with MVa[0] and/or MVb[0], depending on the resulting
|
||
prediction mode for the sub-block. If the corresponding MV field is created by
|
||
“duplication”, this field must be zero.
|
||
Format = U14
|
||
|
||
1. mv_format_pic = vin_mv_format * vin_codec_select
|
||
2. Change vin_mvunpackenable to (vin_mvunpackenable + mv_format_pic) on all location.
|
||
3. extended_form_pic = vin_extended_form * vin_codec_select
|
||
4. (vctrl_it_Transform8x8Flag * !extended_form_pic) ? “h000” &
|
||
vctrl_it_lumaintrapredmode0[15:12] & “h000” & vctrl_it_lumaintrapredmode0[11:8] & “h000” &
|
||
vctrl_it_lumaintrapredmode0[7:4] & “h000” & vctrl_it_lumaintrapredmode0[3:0] :
|
||
vctrl_it_lumaintrapredmode3[15:0] & vctrl_it_lumaintrapredmode2
|
||
MV Fub:
|
||
|
||
Mux Output Table
|
||
ref_index_rep_size[3:0]
|
||
Select:
|
||
|
||
Value Output Input Description
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 88
|
||
0001 enc_refidx_L0addr_B0_int[4:0] enc_mode_bind_fwd_B0[4:0]
|
||
0001 enc_refidx_L0addr_B1_int[4:0] enc_mode_bind_fwd_B1[4:0]
|
||
0001 enc_refidx_L0addr_B2_int[4:0] enc_mode_bind_fwd_B2[4:0]
|
||
0001 enc_refidx_L0addr_B3_int[4:0] enc_mode_bind_fwd_B3[4:0]
|
||
0001 enc_refidx_L1addr_B0_int[4:0] enc_mode_bind_bkd_B0[4:0]
|
||
0001 enc_refidx_L1addr_B1_int[4:0] enc_mode_bind_bkd_B1[4:0]
|
||
0001 enc_refidx_L1addr_B2_int[4:0] enc_mode_bind_bkd_B2[4:0]
|
||
0001 enc_refidx_L1addr_B3_int[4:0] enc_mode_bind_bkd_B3[4:0]
|
||
0010 enc_refidx_L0addr_B0_int[4:0] enc_mode_bind_fwd_B0[4:0]
|
||
0010 enc_refidx_L0addr_B1_int[4:0] enc_mode_bind_fwd_B1[4:0]
|
||
0010 enc_refidx_L0addr_B2_int[4:0] enc_mode_bind_fwd_B0[4:0]
|
||
0010 enc_refidx_L0addr_B3_int[4:0] enc_mode_bind_fwd_B1[4:0]
|
||
0010 enc_refidx_L1addr_B0_int[4:0] enc_mode_bind_bkd_B0[4:0]
|
||
0010 enc_refidx_L1addr_B1_int[4:0] enc_mode_bind_bkd_B1[4:0]
|
||
0010 enc_refidx_L1addr_B2_int[4:0] enc_mode_bind_bkd_B0[4:0]
|
||
0010 enc_refidx_L1addr_B3_int[4:0] enc_mode_bind_bkd_B1[4:0]
|
||
0100 enc_refidx_L0addr_B0_int[4:0] enc_mode_bind_fwd_B0_ext[4:0]
|
||
0100 enc_refidx_L0addr_B1_int[4:0] enc_mode_bind_fwd_B0_ext[4:0]
|
||
0100 enc_refidx_L0addr_B2_int[4:0] enc_mode_bind_fwd_B1_ext[4:0]
|
||
0100 enc_refidx_L0addr_B3_int[4:0] enc_mode_bind_fwd_B1_ext[4:0]
|
||
0100 enc_refidx_L1addr_B0_int[4:0] enc_mode_bind_bkd_B0_ext[4:0]
|
||
0100 enc_refidx_L1addr_B1_int[4:0] enc_mode_bind_bkd_B0_ext[4:0]
|
||
0100 enc_refidx_L1addr_B2_int[4:0] enc_mode_bind_bkd_B1_ext[4:0]
|
||
0100 enc_refidx_L1addr_B3_int[4:0] enc_mode_bind_bkd_B1_ext[4:0]
|
||
1000 enc_refidx_L0addr_B0_int[4:0] enc_mode_bind_fwd_B0[4:0]
|
||
1000 enc_refidx_L0addr_B1_int[4:0] enc_mode_bind_fwd_B0[4:0]
|
||
1000 enc_refidx_L0addr_B2_int[4:0] enc_mode_bind_fwd_B0[4:0]
|
||
1000 enc_refidx_L0addr_B3_int[4:0] enc_mode_bind_fwd_B0[4:0]
|
||
1000 enc_refidx_L1addr_B0_int[4:0] enc_mode_bind_bkd_B0[4:0]
|
||
1000 enc_refidx_L1addr_B1_int[4:0] enc_mode_bind_bkd_B0[4:0]
|
||
1000 enc_refidx_L1addr_B2_int[4:0] enc_mode_bind_bkd_B0[4:0]
|
||
1000 enc_refidx_L1addr_B3_int[4:0] enc_mode_bind_bkd_B0[4:0]
|
||
|
||
Combinatorial Signals Table
|
||
Signal Equation
|
||
extended_form_pic vin_extended_form * vin_codec_selectR
|
||
enc_mode_bind_fwd_B0_ext[4:0]
|
||
extended_form_pic?
|
||
enc_mode_bind_fwd_B0[4:0] : enc_mode_bind_fwd_B0[4:0]
|
||
|
||
enc_mode_bind_fwd_B1_ext[4:0]
|
||
extended_form_pic?
|
||
enc_mode_bind_fwd_B2[4:0] : enc_mode_bind_fwd_B1[4:0]
|
||
enc_mode_bind_bkd_B0_ext[4:0]
|
||
extended_form_pic?
|
||
enc_mode_bind_bkd_B0[4:0] : enc_mode_bind_bkd_B0[4:0]
|
||
enc_mode_bind_bkd_B1_ext[4:0]
|
||
extended_form_pic?
|
||
enc_mode_bind_bkd_B2[4:0] : enc_mode_bind_bkd_B1[4:0]
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 89
|
||
3.5.5 Stream-in\Stream-out Message
|
||
Each reference will require 2 message phases when performing multi-call. These phases will be added
|
||
onto the basic input or output message. Hence, the first stream-in or stream-out message phase
|
||
location is variable and represented below by M(X+?), where X equals the number of phases present in
|
||
the input or output message, respectively.
|
||
When both records are being streamed in or out, phases M+0 and M+1 will contain record0 (associated
|
||
with RefA) and M+2 and M+3 will contain record1 (associated with RefB). If there is only one reference
|
||
being searched (SearchControl != 111b) then only one record will be streamed in or out, specifically, only
|
||
M+0 and M+1 will be present.
|
||
DWord Bit Description
|
||
M(X+0).7 Reserved MBZ
|
||
31:0
|
||
|
||
M(X+0).6 Reserved MBZ
|
||
31:0
|
||
31:16
|
||
M(X+0).5 Rec0 Shape 16x16 Y (relative to source MB)
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-512.00 to 511.75]
|
||
15:0
|
||
Rec0 Shape 16x16 X (relative to source MB)
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-2048.00 to 2047.75]
|
||
Reserved MBZ
|
||
M(X+0).4 31:16
|
||
|
||
Reserved MBZ
|
||
15:14
|
||
13:0
|
||
Rec0 Shape 16x16 Distortion
|
||
Format = U14
|
||
31:16
|
||
M(X+0).3 Rec0 Shape 8x8_3 Distortion
|
||
Hardware only uses 14 bits. Upper bits ignored (True for all 8x8_X Distortions).
|
||
15:0 Rec0 Shape 8x8_2 Distortion
|
||
31:16 Rec0 Shape 8x8_1 Distortion
|
||
M(X+0).2
|
||
15:0 Rec0 Shape 8x8_0 Distortion
|
||
31:16
|
||
M(X+0).1 Rec0 Shape 8x16_1 Distortion
|
||
Hardware only uses 15 bits. Upper bits ignored (True for all 8x16_X Distortions).
|
||
|
||
15:0 Rec0 Shape 8x16_0 Distortion
|
||
31:16
|
||
M(X+0).0 Rec0 Shape 16x8_1 Distortion
|
||
Hardware only uses 15 bits. Upper bits ignored (True for all 16x8_X Distortions).
|
||
15:0 Rec0 Shape 16x8_0 Distortion
|
||
31:16 Rec0 Shape 8x8_3 Y (relative to source MB)
|
||
M(X+1).7
|
||
15:0 Rec0 Shape 8x8_3 X (relative to source MB)
|
||
31:16 Rec0 Shape 8x8_2 Y (relative to source MB)
|
||
M(X+1).6
|
||
15:0 Rec0 Shape 8x8_2 X (relative to source MB)
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 90
|
||
DWord Bit Description
|
||
31:16 Rec0 Shape 8x8_1 Y (relative to source MB)
|
||
M(X+1).5
|
||
15:0 Rec0 Shape 8x8_1 X (relative to source MB)
|
||
31:16 Rec0 Shape 8x8_0 Y (relative to source MB)
|
||
M(X+1).4
|
||
15:0 Rec0 Shape 8x8_0 X (relative to source MB)
|
||
31:16 Rec0 Shape 8x16_1 Y (relative to source MB)
|
||
M(X+1).3
|
||
15:0 Rec0 Shape 8x16_1 X (relative to source MB)
|
||
31:16 Rec0 Shape 8x16_0 Y (relative to source MB)
|
||
M(X+1).2
|
||
15:0 Rec0 Shape 8x16_0 X (relative to source MB)
|
||
31:16 Rec0 Shape 16x8_1 Y (relative to source MB)
|
||
M(X+1).1
|
||
15:0 Rec0 Shape 16x8_1 X (relative to source MB)
|
||
31:16 Rec0 Shape 16x8_0 Y (relative to source MB)
|
||
M(X+1).0
|
||
15:0 Rec0 Shape 16x8_0 X (relative to source MB)
|
||
M(X+2).7 Reserved MBZ
|
||
31:0
|
||
M(X+2).6 Reserved MBZ
|
||
31:0
|
||
|
||
31:16
|
||
M(X+2).5 Rec1 Shape 16x16 Y (relative to source MB)
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-512.00 to 511.75]
|
||
15:0
|
||
Rec1 Shape 16x16 X (relative to source MB)
|
||
Format = S13.2 (2’s comp)
|
||
Hardware Range: [-2048.00 to 2047.75]
|
||
Reserved MBZ
|
||
M(X+2).4 31:16
|
||
Reserved MBZ
|
||
15:14
|
||
|
||
13:0
|
||
Rec1 Shape 16x16 Distortion
|
||
Format = U14
|
||
M(X+2).3 31:16
|
||
Rec1 Shape 8x8_3 Distortion
|
||
Hardware only uses 14 bits. Upper bits ignored (True for all 8x8_X Distortions).
|
||
15:0 Rec1 Shape 8x8_2 Distortion
|
||
M(X+2).2 31:16 Rec1 Shape 8x8_1 Distortion
|
||
15:0 Rec1 Shape 8x8_0 Distortion
|
||
M(X+2).1 31:16
|
||
Rec1 Shape 8x16_1
|
||
Hardware only uses 15 bits. Upper bits ignored (True for all 8x16_X Distortions).
|
||
15:0 Rec1 Shape 8x16_0 Distortion
|
||
M(X+2).0 31:16
|
||
Rec1 Shape 16x8_1 Distortion
|
||
Hardware only uses 15 bits. Upper bits ignored (True for all 16x8_X Distortions).
|
||
|
||
15:0 Rec1 Shape 16x8_0 Distortion
|
||
M(X+3).7 31:16 Rec1 Shape 8x8_3 Y (relative to source MB)
|
||
15:0 Rec1 Shape 8x8_3 X (relative to source MB)
|
||
M(X+3).6 31:16 Rec1 Shape 8x8_2 Y (relative to source MB)
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 91
|
||
DWord Bit Description
|
||
15:0 Rec1 Shape 8x8_2 X (relative to source MB)
|
||
M(X+3).5 31:16 Rec1 Shape 8x8_1 Y (relative to source MB)
|
||
15:0 Rec1 Shape 8x8_1 X (relative to source MB)
|
||
M(X+3).4 31:16 Rec1 Shape 8x8_0 Y (relative to source MB)
|
||
15:0 Rec1 Shape 8x8_0 X (relative to source MB)
|
||
M(X+3).3 31:16 Rec1 Shape 8x16_1 Y (relative to source MB)
|
||
15:0 Rec1 Shape 8x16_1 X (relative to source MB)
|
||
M(X+3).2 31:16 Rec1 Shape 8x16_0 Y (relative to source MB)
|
||
15:0 Rec1 Shape 8x16_0 X (relative to source MB)
|
||
M(X+3).1 31:16 Rec1 Shape 16x8_1 Y (relative to source MB)
|
||
15:0 Rec1 Shape 16x8_1 X (relative to source MB)
|
||
M(X+3).0 31:16 Rec1 Shape 16x8_0 Y (relative to source MB)
|
||
15:0 Rec1 Shape 16x8_0 X (relative to source MB)
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 92
|
||
4. Shared Functions Pixel Interpolater
|
||
The Pixel Interpolator provides barycentric parameters at various offsets relative to the pixel location.
|
||
These barycentric parameters are in the same format and layout as those received in the pixel shader
|
||
dispatch. Please refer to the “Windower” chapter in the “3D Pipeline” volume for more details on
|
||
barycentric parameters.
|
||
Barycentric parameters delivered in the pixel shader payload are at pre-defined positions based on
|
||
Barycentric Interpolation Mode bits selected in 3DSTATE_WM. The pixel interpolator allows
|
||
barycentric parameters to be computed at additional locations.
|
||
|
||
|
||
4.1 Messages
|
||
The following is the message definition for the Pixel Interpolator shared function.
|
||
Restrictions:
|
||
|
||
Pixel Interpolator messages can only be delivered by pixel shader kernels.
|
||
[ivbgt2 pre-K0] Hang possible if linear PI message when Barycentric Interpolation mode has any
|
||
perspective bits set, or Pixel Shader Uses Source W is set.
|
||
[ivbgt2 pre-K0] Hang possible if perspective PI message when Barycentric Interpolation mode has
|
||
any non-perspective bits set.
|
||
|
||
Execution Mask. Each bit in the execution mask enables the corresponding slot’s barycentric parameter
|
||
return to the destination registers.
|
||
|
||
|
||
4.1.1 Initiating Message
|
||
|
||
4.1.1.1 Message Descriptor
|
||
|
||
Bit Description
|
||
19
|
||
Header Present: Specifies whether the message includes a header phase. Must be zero for all
|
||
Pixel Interpolator messages.
|
||
|
||
Format = Enable
|
||
18:17 Ignored
|
||
16
|
||
SIMD Mode. Specifies the SIMD mode of the message being sent.
|
||
|
||
Format = U1
|
||
0: SIMD8 mode
|
||
1: SIMD16 mode
|
||
15 Ignored
|
||
14
|
||
Interpolation Mode. Specifies which interpolation mode is to be used.
|
||
|
||
Format = U1
|
||
0: Perspective Interpolation
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 93
|
||
Bit Description
|
||
1: Linear Interpolation
|
||
Programming Notes:
|
||
This field cannot be set to “Linear Interpolation” unless Non-Perspective Barycentric Enable in
|
||
3DSTATE_CLIP is enabled.
|
||
|
||
13:12
|
||
Message Type. Specifies the type of message being sent.
|
||
|
||
Format = U2
|
||
0: Per Message Offset (eval_snapped with immediate offset)
|
||
1: Sample Position Offset (eval_sindex)
|
||
2: Centroid Position Offset (eval_centroid)
|
||
3: Per Slot Offset (eval_snapped with register offset)
|
||
11
|
||
Slot Group Select. This field selects whether slots 15:0 or slots 31:16 are used for bypassed
|
||
data.
|
||
Bypassed data includes the X/Y addresses and centroid position. For 8- and 16-pixel
|
||
dispatches, SLOTGRP_LO must be selected on every message. For 32-pixel dispatches, this
|
||
field must be set correctly for each message based on which slots are currently being
|
||
processed.
|
||
0: SLOTGRP_LO:choose bypassed data for slots 15:0
|
||
1: SLOTGRP_HI:choose bypassed data for slots 31:16
|
||
Programming Notes:
|
||
This field must be set to SLOTGRP_LO for SIMD8 messages. SIMD8 messages always use bypassed data
|
||
for slots 7:0.
|
||
|
||
10:8 Ignored
|
||
7:0
|
||
Message Specific Control. Refer to the sections below for the definition of these bits based on
|
||
Message Type.
|
||
|
||
|
||
4.1.1.1.1 “Per Message Offset” Message Descriptor
|
||
Bit Description
|
||
7:4
|
||
Per Message Y Pixel Offset
|
||
|
||
Specifies the Y Pixel Offset that applies to all slots.
|
||
Format = S4 2’s complement representing units of 1/16 pixel.
|
||
Range = [-8/16, +7/16]
|
||
3:0
|
||
Per Message X Pixel Offset
|
||
|
||
Specifies the X Pixel Offset that applies to all slots.
|
||
Format = S4 2’s complement representing units of 1/16 pixel.
|
||
Range = [-8/16, +7/16]
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 94
|
||
4.1.1.1.2 “Sample Position Offset” Message Descriptor
|
||
Bit Description
|
||
7:4
|
||
Sample Index
|
||
|
||
Specifies the sample index that applies to all slots.
|
||
Format = U4
|
||
Range = [0,7
|
||
3:0 Ignored
|
||
|
||
|
||
4.1.1.1.3 “Centroid Position” and “Per Slot Offset” Message Descriptor
|
||
Bit Description
|
||
7:0 Ignored
|
||
|
||
|
||
4.1.1.2 Message Payload for most messages
|
||
This message payload applies to the following message types:
|
||
|
||
Per Message Offset
|
||
Sample Position Offset
|
||
Centroid Position Offset
|
||
DWord Bit Description
|
||
M0.7:0 Ignored
|
||
|
||
|
||
4.1.1.3 SIMD8 Per Slot Offset Message Payload
|
||
This message payload applies only to the SIMD8 Per Slot Offset message type. The message length is 2.
|
||
DWord Bit Description
|
||
M0.7 31:0
|
||
Slot 7 X Pixel Offset
|
||
|
||
Specifies the X pixel offset for slot 7.
|
||
Format = S4 2’s complement representing units of 1/16 pixel. The upper 28 bits are
|
||
ignored.
|
||
Range = [-8/16, +7/16]
|
||
M0.6 31:0
|
||
Slot 6 X Pixel Offset
|
||
|
||
M0.5 31:0
|
||
Slot 5 X Pixel Offset
|
||
|
||
M0.4 31:0
|
||
Slot 4 X Pixel Offset
|
||
|
||
M0.3 31:0
|
||
Slot 3 X Pixel Offset
|
||
|
||
M0.2 31:0
|
||
Slot 2 X Pixel Offset
|
||
|
||
M0.1 31:0
|
||
Slot 1 X Pixel Offset
|
||
|
||
M0.0 31:0
|
||
Slot 0 X Pixel Offset
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 95
|
||
DWord Bit Description
|
||
M1.7 31:0
|
||
Slot 7 Y Pixel Offset
|
||
|
||
Specifies the Y pixel offset for slot 7.
|
||
Format = S4 2’s complement representing units of 1/16 pixel. The upper 28 bits are
|
||
ignored.
|
||
Range = [-8/16, +7/16]
|
||
M1.6 31:0
|
||
Slot 6 Y Pixel Offset
|
||
|
||
M1.5 31:0
|
||
Slot 5 Y Pixel Offset
|
||
|
||
M1.4 31:0
|
||
Slot 4 Y Pixel Offset
|
||
|
||
M1.3 31:0
|
||
Slot 3 Y Pixel Offset
|
||
|
||
M1.2 31:0
|
||
Slot 2 Y Pixel Offset
|
||
|
||
M1.1 31:0
|
||
Slot 1 Y Pixel Offset
|
||
|
||
M1.0 31:0
|
||
Slot 0 Y Pixel Offset
|
||
|
||
|
||
|
||
4.1.1.4 SIMD16 Per Slot Offset Message Payload
|
||
This message payload applies only to the SIMD16 Per Slot Offset message type. The message length is
|
||
4.
|
||
DWord Bit Description
|
||
M0.7 31:0
|
||
Slot 7 X Pixel Offset
|
||
|
||
Specifies the X pixel offset for slot 7.
|
||
Format = S4 2’s complement representing units of 1/16 pixel. The upper 28 bits are
|
||
ignored.
|
||
Range = [-8/16, +7/16]
|
||
M0.6 31:0
|
||
Slot 6 X Pixel Offset
|
||
|
||
M0.5 31:0
|
||
Slot 5 X Pixel Offset
|
||
|
||
M0.4 31:0
|
||
Slot 4 X Pixel Offset
|
||
|
||
M0.3 31:0
|
||
Slot 3 X Pixel Offset
|
||
|
||
M0.2 31:0
|
||
Slot 2 X Pixel Offset
|
||
|
||
M0.1 31:0
|
||
Slot 1 X Pixel Offset
|
||
|
||
M0.0 31:0
|
||
Slot 0 X Pixel Offset
|
||
|
||
M1.7 31:0
|
||
Slot 15 X Pixel Offset
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 96
|
||
DWord Bit Description
|
||
M1.6 31:0
|
||
Slot 14 X Pixel Offset
|
||
|
||
M1.5 31:0
|
||
Slot 13 X Pixel Offset
|
||
|
||
M1.4 31:0
|
||
Slot 12 X Pixel Offset
|
||
|
||
M1.3 31:0
|
||
Slot 11 X Pixel Offset
|
||
|
||
M1.2 31:0
|
||
Slot 10 X Pixel Offset
|
||
|
||
M1.1 31:0
|
||
Slot 9 X Pixel Offset
|
||
|
||
M1.0 31:0
|
||
Slot 8 X Pixel Offset
|
||
|
||
M2.7 31:0
|
||
Slot 7 Y Pixel Offset
|
||
|
||
Specifies the Y pixel offset for slot 7.
|
||
Format = S4 2’s complement representing units of 1/16 pixel. The upper 28 bits are
|
||
ignored.
|
||
Range = [-8/16, +7/16]
|
||
M2.6 31:0
|
||
Slot 6 Y Pixel Offset
|
||
|
||
M2.5 31:0
|
||
Slot 5 Y Pixel Offset
|
||
|
||
M2.4 31:0
|
||
Slot 4 Y Pixel Offset
|
||
|
||
M2.3 31:0
|
||
Slot 3 Y Pixel Offset
|
||
|
||
M2.2 31:0
|
||
Slot 2 Y Pixel Offset
|
||
|
||
M2.1 31:0
|
||
Slot 1 Y Pixel Offset
|
||
|
||
M2.0 31:0
|
||
Slot 0 Y Pixel Offset
|
||
|
||
M3.7 31:0
|
||
Slot 15 Y Pixel Offset
|
||
|
||
M3.6 31:0
|
||
Slot 14 Y Pixel Offset
|
||
|
||
M3.5 31:0
|
||
Slot 13 Y Pixel Offset
|
||
|
||
M3.4 31:0
|
||
Slot 12 Y Pixel Offset
|
||
|
||
M3.3 31:0
|
||
Slot 11 Y Pixel Offset
|
||
|
||
M3.2 31:0
|
||
Slot 10 Y Pixel Offset
|
||
|
||
M3.1 31:0
|
||
Slot 9 Y Pixel Offset
|
||
|
||
M3.0 31:0
|
||
Slot 8 Y Pixel Offset
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 97
|
||
4.1.2 Writeback Message
|
||
|
||
4.1.2.1 SIMD8
|
||
The response length for all SIMD8 messages is 2. The data for each slot is written only if its
|
||
corresponding execution mask bit is set.
|
||
DWord Bit Description
|
||
31:0
|
||
W0.7 Barycentric[1] for Slot 7
|
||
|
||
Format = IEEE_Float
|
||
31:0
|
||
W0.6 Barycentric[1] for Slot 6
|
||
|
||
31:0
|
||
W0.5 Barycentric[1] for Slot 5
|
||
|
||
31:0
|
||
W0.4 Barycentric[1] for Slot 4
|
||
|
||
31:0
|
||
W0.3 Barycentric[1] for Slot 3
|
||
|
||
31:0
|
||
W0.2 Barycentric[1] for Slot 2
|
||
|
||
31:0
|
||
W0.1 Barycentric[1] for Slot 1
|
||
|
||
31:0
|
||
W0.0 Barycentric[1] for Slot 0
|
||
|
||
31:0
|
||
W1.7 Barycentric[2] for Slot 7
|
||
|
||
Format = IEEE_Float
|
||
31:0
|
||
W1.6 Barycentric[2] for Slot 6
|
||
|
||
31:0
|
||
W1.5 Barycentric[2] for Slot 5
|
||
|
||
31:0
|
||
W1.4 Barycentric[2] for Slot 4
|
||
|
||
31:0
|
||
W1.3 Barycentric[2] for Slot 3
|
||
|
||
31:0
|
||
W1.2 Barycentric[2] for Slot 2
|
||
|
||
31:0
|
||
W1.1 Barycentric[2] for Slot 1
|
||
|
||
31:0
|
||
W1.0 Barycentric[2] for Slot 0
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 98
|
||
4.1.2.2 SIMD16
|
||
The response length for all SIMD16 messages is 4. The data for each slot is written only if its
|
||
corresponding execution mask bit is set.
|
||
DWord Bit Description
|
||
31:0
|
||
W0.7 Barycentric[1] for Slot 7
|
||
|
||
Format = IEEE_Float
|
||
31:0
|
||
W0.6 Barycentric[1] for Slot 6
|
||
|
||
31:0
|
||
W0.5 Barycentric[1] for Slot 5
|
||
|
||
31:0
|
||
W0.4 Barycentric[1] for Slot 4
|
||
|
||
31:0
|
||
W0.3 Barycentric[1] for Slot 3
|
||
|
||
31:0
|
||
W0.2 Barycentric[1] for Slot 2
|
||
|
||
31:0
|
||
W0.1 Barycentric[1] for Slot 1
|
||
|
||
31:0
|
||
W0.0 Barycentric[1] for Slot 0
|
||
|
||
31:0
|
||
W1.7 Barycentric[2] for Slot 7
|
||
|
||
Format = IEEE_Float
|
||
31:0
|
||
W1.6 Barycentric[2] for Slot 6
|
||
|
||
31:0
|
||
W1.5 Barycentric[2] for Slot 5
|
||
|
||
31:0
|
||
W1.4 Barycentric[2] for Slot 4
|
||
|
||
31:0
|
||
W1.3 Barycentric[2] for Slot 3
|
||
|
||
31:0
|
||
W1.2 Barycentric[2] for Slot 2
|
||
|
||
31:0
|
||
W1.1 Barycentric[2] for Slot 1
|
||
|
||
31:0
|
||
W1.0 Barycentric[2] for Slot 0
|
||
|
||
Format = IEEE_Float
|
||
31:0
|
||
W2.7 Barycentric[1] for Slot 15
|
||
|
||
31:0
|
||
W2.6 Barycentric[1] for Slot 14
|
||
|
||
31:0
|
||
W2.5 Barycentric[1] for Slot 13
|
||
|
||
31:0
|
||
W2.4 Barycentric[1] for Slot 12
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 99
|
||
DWord Bit Description
|
||
31:0
|
||
W2.3 Barycentric[1] for Slot 11
|
||
|
||
31:0
|
||
W2.2 Barycentric[1] for Slot 10
|
||
|
||
31:0
|
||
W2.1 Barycentric[1] for Slot 9
|
||
|
||
31:0
|
||
W2.0 Barycentric[1] for Slot 8
|
||
|
||
31:0
|
||
W3.7 Barycentric[2] for Slot 15
|
||
|
||
31:0
|
||
W3.6 Barycentric[2] for Slot 14
|
||
|
||
31:0
|
||
W3.5 Barycentric[2] for Slot 13
|
||
|
||
31:0
|
||
W3.4 Barycentric[2] for Slot 12
|
||
|
||
31:0
|
||
W3.3 Barycentric[2] for Slot 11
|
||
|
||
31:0
|
||
W3.2 Barycentric[2] for Slot 10
|
||
|
||
31:0
|
||
W3.1 Barycentric[2] for Slot 9
|
||
|
||
31:0
|
||
W3.0 Barycentric[2] for Slot 8
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 100
|
||
Revision History
|
||
Revision Number Description Revision Date
|
||
|
||
1.0 First 2012 OpenSource edition May 2012
|
||
|
||
|
||
|
||
|
||
§§
|
||
|
||
|
||
|
||
|
||
Doc Ref #: IHD-OS-V4 Pt 2 – 05 12 5/31/2012 101
|
||
|