Command Buffer Structure (Windows Embedded CE 6.0)

1/6/2010

The command buffer is a queue of command tokens that the Microsoft® Direct3D® Mobile middleware maintains. Each token represents a single command for the driver to parse and execute. The driver must read the command buffer's tokens sequentially and execute each command sequentially. If the driver executes the tokens out of sequence, it may render some pixels incorrectly.

Most application calls to the Driect3D Mobile middleware that are intended to change the state of the driver or draw on the screen result in the middleware writing tokens into the command buffer.

Ordinarily, the middleware sends the commands in the buffer to the driver and then clears the buffer when the pixels affected by the command tokens are required on the screen or when the command buffer is full. This process is often referred to as flushing the command buffer. Other occasions where the middleware will flush the command buffer during locks and during calls to D3DM_GetInfo. For more information, see Surface Locks in Direct3D Mobile

To maintain performance, the driver should process command tokens immediately. An exception to this is the token generated by IDirect3DMobileDevice::Present. This token may require the driver to wait until a vertical blank interval period before it can be executed. This token is only found at the end of a command buffer; it permits the driver to return from a call to D3DM_DrawPrimitive while the final Present call is still pending.

The Direct3D Mobile middleware flushes its command buffer by calling the driver's D3DM_DrawPrimitive method with a D3DM_DRAWPRIMITIVE_DATA structure.

Each command consists of a header structure, D3DM_COMMAND, followed by some count of command-specific structures. The header for each command immediately follows the end of the command data for the command before it. Because command buffers are always 32-bit aligned, the command header structure and all command data structures are some multiple of 32 bits. Consequently, all pointer arithmetic involved in parsing a command buffer should be 32bit aligned.

Methods that control the resource manager act immediately; they are not buffered in the command buffer.

Default Command Buffer

When the Direct3D Mobile middleware creates a new context with the driver's D3DM_CreateContext function, it prepares a default command buffer that it passes to the driver's D3DM_DrawPrimitive function immediately after the context is created. The following list describes these cases.

  • The middleware determines which number format to send to the driver with D3DMOP_TRANSFORM tokens for D3DMTS_VIEW, D3DMTS_PROJECTION, D3DMTS_WORLD, and D3DMTS_TEXTUREn transforms, see D3DM_OPERATION and D3DMTRANSFORMSTATETYPE.
  • The middleware determines the number of supported texture stages and then restricts the D3DMOP_TEXTURESTAGESTATE tokens in the default command-buffer to only those with a stage that is supported by the driver.

Usually, the default command buffer is tailored to the capability bits that the driver exposes. It initializes all of the various state variables in the driver to default values. Because this process initializes all variables, variables may be initialized for capabilities the driver does not support. The driver can ignore these state values.

Default Driver State Values

The default driver state includes transformation matrices. All transformation matrices are set to the identity matrix. The data format of the matrices depends on whether the driver advertises itself as fixed or float native as described by the D3DMDEVCAPS_NATIVEFLOAT capability bit, see D3DMDEVCAPS Values. The matrices include all 4 texture stage coordinate transformation matrices, even if the driver does not support texture transformation, or supports less than 4 stages.

The default driver state also includes the viewport. The default viewport is the entire client area of the device window. If the cooperative level is set to full-screen then the default viewport is the entire screen. The default minimum z value for the viewport is set to 0 and the maximum is set to 1.

The initial material is set to flat black. All color parameters are set to black (0,0,0,0) and the specular power is set to 0.

The default driver state also includes NULL index and vertex buffer command tokens.

By default, no textures are bound because none exist when the driver is initialized. There is a default set of texture stage states that are loaded into all values for all 4 possible stages. The driver may ignore any values that do not apply to the capabilities it supports.

The following table shows the default texture stage state values.

Texture Stage State Default

D3DMTSS_ADDRESSU

D3DMTADDRESS_WRAP

D3DMTSS_ADDRESSV

D3DMTADDRESS_WRAP

D3DMTSS_ADDRESSW

D3DMTADDRESS_WRAP

D3DMTSS_ALPHAARG0

D3DMTA_CURRENT

D3DMTSS_ALPHAARG1

D3DMTA_TEXTURE

D3DMTSS_ALPHAARG2

D3DMTA_CURRENT

D3DMTSS_ALPHAOP

D3DMTOP_SELECTARG1 for stage 0

D3DMTOP_DISABLE for other Stages

D3DMTSS_BORDERCOLOR

0 (black)

D3DMTSS_COLORARG0

D3DMTA_CURRENT

D3DMTSS_COLORARG1

D3DMTA_TEXTURE

D3DMTSS_COLORARG2

D3DMTA_CURRENT

D3DMTSS_COLOROP

D3DMTOP_MODULATE for stage 0

D3DMTOP_DISABLE for other Stages

D3DMTSS_MAGFILTER

D3DMTEXF_POINT

D3DMTSS_MAXANISOTROPY

1

D3DMTSS_MAXMIPLEVEL

0

D3DMTSS_MINFILTER

D3DMTEXF_POINT

D3DMTSS_MIPFILTER

D3DMTEXF_NONE

D3DMTSS_MIPMAPLODBIAS

0

D3DMTSS_RESULTARG

D3DMTA_CURRENT

D3DMTSS_TEXCOORDINDEX

0

D3DMTSS_TEXTURETRANSFORMFLAGS

D3DMTTFF_DISABLE

The following table shows the default render state values.

Render State Default Value

D3DMRS_ALPHABLENDENABLE

FALSE

D3DMRS_ALPHAFUNC

D3DMCMP_ALWAYS

D3DMRS_ALPHAREF

0

D3DMRS_ALPHATESTENABLE

FALSE

D3DMRS_AMBIENT

0 (Black)

D3DMRS_AMBIENTMATERIALSOURCE

D3DMMCS_MATERIAL

D3DMRS_BLENDOP

D3DMBLENDOP_ADD

D3DMRS_CLIPPING

TRUE

D3DMRS_COLORVERTEX

TRUE

D3DMRS_COLORWRITEENABLE

D3DMCOLORWRITEENABLE_ALL

D3DMRS_CULLMODE

D3DMCULL_CCW

D3DMRS_DEPTHBIAS

0

D3DMRS_DESTBLEND

D3DMBLEND_ZERO

D3DMRS_DIFFUSEMATERIALSOURCE

D3DMMCS_COLOR1

D3DMRS_DITHERENABLE

FALSE

D3DMRS_FILLMODE

D3DMFILL_SOLID

D3DMRS_FOGCOLOR

0

D3DMRS_FOGDENSITY

0

D3DMRS_FOGENABLE

FALSE

D3DMRS_FOGEND

0

D3DMRS_FOGSTART

0

D3DMRS_FOGTABLEMODE

D3DMFOG_NONE

D3DMRS_FOGVERTEXMODE

D3DMFOG_NONE

D3DMRS_LASTPIXEL

TRUE

D3DMRS_LIGHTING

TRUE

D3DMRS_LOCALVIEWER

TRUE

D3DMRS_NORMALIZENORMALS

FALSE

D3DMRS_RANGEFOGENABLE

FALSE

D3DMRS_SHADEMODE

D3DMSHADE_GOURAUD

D3DMRS_SLOPESCALEDEPTHBIAS

0

D3DMRS_SPECULARENABLE

FALSE

D3DMRS_SPECULARMATERIALSOURCE

D3DMMCS_COLOR2

D3DMRS_SRCBLEND

D3DMBLEND_ONE

D3DMRS_STENCILENABLE

FALSE

D3DMRS_STENCILFAIL

D3DMSTENCILOP_KEEP

D3DMRS_STENCILFUNC

D3DMCMP_ALWAYS

D3DMRS_STENCILMASK

0xFFFFFFFF

D3DMRS_STENCILPASS

D3DMSTENCILOP_KEEP

D3DMRS_STENCILREF

0

D3DMRS_STENCILWRITEMASK

0xFFFFFFFF

D3DMRS_STENCILZFAIL

D3DMSTENCILOP_KEEP

D3DMRS_TEXTUREFACTOR

0xFFFFFFFF (White)

D3DMRS_TEXTUREPERSPECTIVE

FALSE

D3DMRS_WRAP0

0

D3DMRS_WRAP1

0

D3DMRS_WRAP2

0

D3DMRS_WRAP3

0

D3DMRS_ZENABLE

TRUE (D3DMZB_TRUE) if D3DMPRESENT_PARAMETERS.EnableAutoDepthStencil was set to TRUE, FALSE otherwise.

D3DMRS_ZFUNC

D3DMCMP_LESSEQUAL

D3DMRS_ZWRITEENABLE

TRUE if the EnableAutoDepthStencil member of D3DMPRESENT_PARAMETERS is TRUE

FALSE otherwise.

See Also

Concepts

Driver Interactions with the Direct3D Mobile Middleware