windows-nt/Source/XPSP1/NT/multimedia/directx/dxg/d3d8/inc/vshader.hpp
2020-09-26 16:20:57 +08:00

289 lines
10 KiB
C++

/*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* File: vshader.hpp
* Content: Direct3D vertex shader internal include file
*
*
***************************************************************************/
#ifndef _VSHADER_HPP
#define _VSHADER_HPP
#include "d3dfe.hpp"
#include "vvm.h"
#include "hmgr.hpp"
#include "vbuffer.hpp"
#include "ibuffer.hpp"
void CheckForNull(LPVOID p, DWORD line, char* file);
class CD3DBase;
//---------------------------------------------------------------------
// macros for parsing Declaration Token Array
// TRUE, if shader handle is DX7 FVF code
//
#define D3DVSD_ISLEGACY(ShaderHandle) !(ShaderHandle & D3DFVF_RESERVED0)
enum D3DVSD_DATALOAD
{
D3DVSD_LOADREGISTER = 0,
D3DVSD_SKIP
};
#define D3DVSD_GETTOKENTYPE(token) ((token & D3DVSD_TOKENTYPEMASK) >> D3DVSD_TOKENTYPESHIFT)
#define D3DVSD_ISSTREAMTESS(token) ((token & D3DVSD_STREAMTESSMASK) >> (D3DVSD_TOKENTYPESHIFT - 1))
#define D3DVSD_GETDATALOADTYPE(token) ((token & D3DVSD_DATALOADTYPEMASK) >> D3DVSD_DATALOADTYPESHIFT)
#define D3DVSD_GETDATATYPE(token) ((token & D3DVSD_DATATYPEMASK) >> D3DVSD_DATATYPESHIFT)
#define D3DVSD_GETSKIPCOUNT(token) ((token & D3DVSD_SKIPCOUNTMASK) >> D3DVSD_SKIPCOUNTSHIFT)
#define D3DVSD_GETSTREAMNUMBER(token) ((token & D3DVSD_STREAMNUMBERMASK) >> D3DVSD_STREAMNUMBERSHIFT)
#define D3DVSD_GETVERTEXREG(token) ((token & D3DVSD_VERTEXREGMASK) >> D3DVSD_VERTEXREGSHIFT)
#define D3DVSD_GETCONSTCOUNT(token) ((token & D3DVSD_CONSTCOUNTMASK) >> D3DVSD_CONSTCOUNTSHIFT)
#define D3DVSD_GETCONSTADDRESS(token) ((token & D3DVSD_CONSTADDRESSMASK) >> D3DVSD_CONSTADDRESSSHIFT)
#define D3DVSD_GETCONSTRS(token) ((token & D3DVSD_CONSTRSMASK) >> D3DVSD_CONSTRSSHIFT)
#define D3DVSD_GETEXTCOUNT(token) ((token & D3DVSD_EXTCOUNTMASK) >> D3DVSD_EXTCOUNTSHIFT)
#define D3DVSD_GETEXTINFO(token) ((token & D3DVSD_EXTINFOMASK) >> D3DVSD_EXTINFOSHIFT)
//---------------------------------------------------------------------
//
// CVConstantData: Constant data that is used by a shader
//
//---------------------------------------------------------------------
struct CVConstantData: public CListEntry
{
CVConstantData() {m_pData = NULL; m_dwCount = 0;}
~CVConstantData() {delete m_pData;}
DWORD m_dwCount; // Number of 4*DWORDs to load
DWORD m_dwAddress; // Start constant register
DWORD* m_pData; // Data. Multiple of 4*DWORD
};
//---------------------------------------------------------------------
//
// CVStreamDecl:
//
// Describes a stream, used by a declaration
//
//---------------------------------------------------------------------
class CVStreamDecl: public CListEntry
{
public:
CVStreamDecl()
{
m_dwNumElements = 0;
m_dwStride = 0;
m_dwStreamIndex = 0xFFFFFFFF;
#if DBG
m_dwFVF = 0;
#endif // DBG
}
// Parses declaration.
// For fixed-function pipeline computes FVF, FVF2 (used to record
// texture presense) and number of floats after position
void Parse(CD3DBase* pDevice, DWORD CONST ** ppToken, BOOL bFixedFunction,
DWORD* pdwFVF, DWORD* pdwFVF2, DWORD* pnFloats,
BOOL* pbLegacyFVF, UINT Usage, BOOL bTessStream = FALSE);
CVElement m_Elements[__NUMELEMENTS]; // Vertex elements in the stream
DWORD m_dwNumElements; // Number of elements to use
DWORD m_dwStride; // Vertex size in bytes
DWORD m_dwStreamIndex; // Index to device streams
#if DBG
// FVF, computed from declaration. Used for fixed function pipeline only
DWORD m_dwFVF;
#endif //DBG
};
//---------------------------------------------------------------------
//
// CVDeclaration:
//
// D3D parses declaration byte-codes and creates this data structure.
//
//-----------------------------------------------------------------------------
class CVDeclaration
{
public:
CVDeclaration(DWORD dwNumStreams);
~CVDeclaration();
//------------- Used during declaration parsing -----------
// pDeclSize will have size of the declaration in bytes if not NULL
void Parse(CD3DBase* pDevice, CONST DWORD * decl, BOOL bFixedFunction,
DWORD* pDeclSize, UINT Usage);
// List of streams, which are used by the declaration
CVStreamDecl* m_pActiveStreams;
CVStreamDecl* m_pActiveStreamsTail;
// Corresponding FVF for fixed-function pipeline
// This is OR of all streams input FVF
DWORD m_dwInputFVF;
// This is computed for legacy TL capable hardware.
// If this is NULL, that means that the declaration is too complex
// for these devices.
BOOL m_bLegacyFVF;
// TRUE when a tesselator stream is present in the declaration.
// We need this to validate that the stream is not passed to DrawPrimitive
// API.
BOOL m_bStreamTessPresent;
// Max number of available streams
DWORD m_dwNumStreams;
// Constant data that should be loaded when shader becomes active
CVConstantData* m_pConstants;
CVConstantData* m_pConstantsTail;
//------------- Used by PSGP ---------------
// The description of all vertex elements to be loaded into input registers.
// The array is built by going through active streams and elements inside
// each stream
CVElement m_VertexElements[__NUMELEMENTS];
// Number of used members of m_VertexElements
DWORD m_dwNumElements;
friend class CD3DHal;
};
//-----------------------------------------------------------------------------
//
// CVStreamBase: Class representing the digested information for vertex
// stream in the MS implementation.
//
//-----------------------------------------------------------------------------
struct CVStreamBase
{
CVStreamBase()
{
m_pData = NULL;
m_dwStride = 0;
#if DBG
m_dwSize = 0;
#endif
m_dwNumVertices = 0;
m_dwIndex = 0;
}
// Stream memory. In case of vertex buffers (m_pVB != NULL), we lock the
// vertex buffer and assign its memory pointer to the m_pData
LPBYTE m_pData;
// Vertex (or index) stride in bytes
DWORD m_dwStride;
#if DBG
// Buffer size in bytes
DWORD m_dwSize;
#endif // DBG
// Index of the stream. Needed when we access streams through pointers
// m_dwIndex == __NUMSTREAMS is a flag when CIndexBuffer is used
DWORD m_dwIndex;
// Max number of vertices (or indices in case of index buffer) the buffer
// can store (valid in DBG only !!!).
// For internal TL buffers this is used as number of vertices, currently
// written to the buffer.
DWORD m_dwNumVertices;
};
//-----------------------------------------------------------------------------
//
// CVStream: Class representing the digested information for vertex
// stream in the MS implementation.
//
//-----------------------------------------------------------------------------
struct CVStream: public CVStreamBase
{
CVStream() {m_pVB = NULL;}
BYTE* Data()
{
if (m_pVB)
return m_pVB->Data();
else
return m_pData;
}
~CVStream();
virtual BOOL IsUserMemStream() {return FALSE;}
CVertexBuffer *m_pVB; // User passed VB
};
//-----------------------------------------------------------------------------
//
// CVStream: Class representing the digested information for vertex
// stream in the MS implementation.
//
//-----------------------------------------------------------------------------
struct CVIndexStream: public CVStreamBase
{
CVIndexStream()
{
m_dwBaseIndex = 0;
m_dwIndex = __NUMSTREAMS; // Mark the stream as index stream
m_pVBI = NULL;
}
BYTE* Data()
{
if (m_pVBI)
return m_pVBI->Data();
else
return m_pData;
}
~CVIndexStream();
DWORD m_dwBaseIndex; // Vertex index, that corresponds to the index 0
CIndexBuffer *m_pVBI; // User passed VB
};
//-----------------------------------------------------------------------------
//
// CVShader: Vertex Shader Class
//
//-----------------------------------------------------------------------------
class CVShader : public CD3DBaseObj
{
public:
CVShader(DWORD dwNumStreams): m_Declaration(dwNumStreams)
{
m_dwFlags = 0;
m_pCode = NULL;
m_pOrgDeclaration = NULL;
m_OrgDeclSize = 0;
m_pOrgFuncCode = NULL;
m_OrgFuncCodeSize = 0;
m_pStrippedFuncCode = NULL;
m_StrippedFuncCodeSize = 0;
}
~CVShader()
{
delete m_pCode;
delete m_pOrgDeclaration;
delete m_pOrgFuncCode;
delete m_pStrippedFuncCode;
}
HRESULT Initialize(DWORD* lpdwDeclaration, DWORD* lpdwFunction);
// Bits for m_dwFlags
static const DWORD FIXEDFUNCTION; // This is fixed-function shader
static const DWORD SOFTWARE; // Shader is used with software pipeline
CVDeclaration m_Declaration;
CVShaderCode* m_pCode; // PSGP vertex shader object
// Used to process point sprites.
DWORD m_dwFlags;
DWORD m_dwInputFVF; // Input FVF for fixed-function pipeline
DWORD* m_pOrgDeclaration; // Original declaration
UINT m_OrgDeclSize; // Size in bytes
DWORD* m_pOrgFuncCode; // Original function code
UINT m_OrgFuncCodeSize; // Size in bytes
DWORD* m_pStrippedFuncCode; // Comment-stripped function code
UINT m_StrippedFuncCodeSize; // Size in bytes
};
typedef CVShader *LPVSHADER;
//-----------------------------------------------------------------------------
//
// CVShaderHandleFactory: Vertex Shader Handle Factory
//
//-----------------------------------------------------------------------------
class CVShaderHandleFactory : public CHandleFactory
{
public:
DWORD CreateNewHandle( LPVSHADER pVShader );
LPD3DBASEOBJ GetObject( DWORD dwHandle ) const;
void ReleaseHandle(DWORD handle, BOOL);
BOOL SetObject( DWORD dwHandle, LPD3DBASEOBJ );
virtual UINT HandleFromIndex( DWORD index) const {return (index << 1) + 1;}
CVShader* GetObjectFast(DWORD dwHandle) const
{
return (CVShader*)((reinterpret_cast<CHandle*>(m_Handles.GetArrayPointer())[dwHandle >> 1]).m_pObj);
}
};
#endif _VSHADER_HPP