Home | History | Annotate | Download | only in D3D8
      1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //    http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #ifndef D3D8_Direct3DDevice8_hpp
     16 #define D3D8_Direct3DDevice8_hpp
     17 
     18 #include "Unknown.hpp"
     19 
     20 #include "Direct3D8.hpp"
     21 #include "Direct3DStateBlock8.hpp"
     22 #include "Direct3DVertexDeclaration8.hpp"
     23 #include "Direct3DSwapChain8.hpp"
     24 
     25 #include "Stream.hpp"
     26 
     27 #include <d3d8.h>
     28 #include <vector>
     29 #include <list>
     30 #include <map>
     31 
     32 namespace sw
     33 {
     34 	class Renderer;
     35 	class Context;
     36 }
     37 
     38 namespace D3D8
     39 {
     40 	class Direct3DPixelShader8;
     41 	class Direct3DVertexShader8;
     42 	class Direct3DSurface8;
     43 	class Direct3DVertexBuffer8;
     44 	class Direct3DIndexBuffer8;
     45 
     46 	class Direct3DDevice8 : public IDirect3DDevice8, protected Unknown
     47 	{
     48 	public:
     49 		Direct3DDevice8(const HINSTANCE instance, Direct3D8 *d3d8, unsigned int adapter, D3DDEVTYPE deviceType, HWND focusWindow, unsigned long behaviourFlags, D3DPRESENT_PARAMETERS *presentParameters);
     50 
     51 		~Direct3DDevice8() override;
     52 
     53 		// IUnknown methods
     54 		long __stdcall QueryInterface(const IID &iid, void **object) override;
     55 		unsigned long __stdcall AddRef() override;
     56 		unsigned long __stdcall Release() override;
     57 
     58 		// IDirect3DDevice8 methods
     59 		long __stdcall ApplyStateBlock(unsigned long token) override;
     60 		long __stdcall BeginScene() override;
     61 		long __stdcall BeginStateBlock() override;
     62 		long __stdcall CaptureStateBlock(unsigned long token) override;
     63 		long __stdcall Clear(unsigned long count, const D3DRECT *rects, unsigned long flags, unsigned long color, float z, unsigned long stencil) override;
     64 		long __stdcall CopyRects(IDirect3DSurface8 *sourceSurface, const RECT *sourceRectsArray, unsigned int rects, IDirect3DSurface8 *destinationSurface, const POINT *destPointsArray) override;
     65 		long __stdcall CreateAdditionalSwapChain(D3DPRESENT_PARAMETERS *presentParameters, IDirect3DSwapChain8 **swapChain) override;
     66 		long __stdcall CreateCubeTexture(unsigned int edgeLength, unsigned int levels, unsigned long usage, D3DFORMAT format, D3DPOOL pool, IDirect3DCubeTexture8 **cubeTexture) override;
     67 		long __stdcall CreateDepthStencilSurface(unsigned int width, unsigned int height, D3DFORMAT format, D3DMULTISAMPLE_TYPE multiSample, IDirect3DSurface8 **surface) override;
     68 		long __stdcall CreateImageSurface(unsigned int width, unsigned int height, D3DFORMAT format, IDirect3DSurface8 **surface) override;
     69 		long __stdcall CreateIndexBuffer(unsigned int length, unsigned long usage, D3DFORMAT format, D3DPOOL pool, IDirect3DIndexBuffer8 **indexBuffer) override;
     70 		long __stdcall CreatePixelShader(const unsigned long *function, unsigned long *handle) override;
     71 		long __stdcall CreateRenderTarget(unsigned int width, unsigned int height, D3DFORMAT format, D3DMULTISAMPLE_TYPE multiSample, int lockable, IDirect3DSurface8 **surface) override;
     72 		long __stdcall CreateStateBlock(D3DSTATEBLOCKTYPE type, unsigned long *token) override;
     73 		long __stdcall CreateTexture(unsigned int width, unsigned int height, unsigned int levels, unsigned long usage, D3DFORMAT format, D3DPOOL pool, IDirect3DTexture8 **texture) override;
     74 		long __stdcall CreateVertexBuffer(unsigned int length, unsigned long usage, unsigned long FVF, D3DPOOL, IDirect3DVertexBuffer8 **vertexBuffer) override;
     75 		long __stdcall CreateVertexShader(const unsigned long *declaration, const unsigned long *function, unsigned long *handle, unsigned long usage) override;
     76 		long __stdcall CreateVolumeTexture(unsigned int width, unsigned int height, unsigned int depth, unsigned int levels, unsigned long usage, D3DFORMAT format, D3DPOOL pool, IDirect3DVolumeTexture8 **volumeTexture) override;
     77 		long __stdcall DeletePatch(unsigned int handle) override;
     78 		long __stdcall DeletePixelShader(unsigned long handle) override;
     79 		long __stdcall DeleteStateBlock(unsigned long token) override;
     80 		long __stdcall DeleteVertexShader(unsigned long handle) override;
     81 		long __stdcall DrawIndexedPrimitive(D3DPRIMITIVETYPE type, unsigned int minIndex, unsigned int numVertices, unsigned int startIndex, unsigned int primitiveCount) override;
     82 		long __stdcall DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE type, unsigned int minVertexIndex, unsigned int numVertexIndices, unsigned int PrimitiveCount, const void *indexData, D3DFORMAT indexDataFormat, const void *vertexStreamZeroData, unsigned int VertexStreamZeroStride) override;
     83 		long __stdcall DrawPrimitive(D3DPRIMITIVETYPE primitiveType, unsigned int startVertex, unsigned int primiveCount) override;
     84 		long __stdcall DrawPrimitiveUP(D3DPRIMITIVETYPE primitiveType, unsigned int primitiveCount, const void *vertexStreamZeroData, unsigned int vertexStreamZeroStride) override;
     85 		long __stdcall DrawRectPatch(unsigned int handle, const float *numSegs, const D3DRECTPATCH_INFO *rectPatchInfo) override;
     86 		long __stdcall DrawTriPatch(unsigned int handle, const float *numSegs, const D3DTRIPATCH_INFO *triPatchInfo) override;
     87 		long __stdcall EndScene() override;
     88 		long __stdcall EndStateBlock(unsigned long *token) override;
     89 		unsigned int __stdcall GetAvailableTextureMem() override;
     90 		long __stdcall GetBackBuffer(unsigned int index, D3DBACKBUFFER_TYPE type, IDirect3DSurface8 **backBuffer) override;
     91 		long __stdcall GetClipPlane(unsigned long index, float *plane) override;
     92 		long __stdcall GetClipStatus(D3DCLIPSTATUS8 *clipStatus) override;
     93 		long __stdcall GetCreationParameters(D3DDEVICE_CREATION_PARAMETERS *parameters) override;
     94 		long __stdcall GetCurrentTexturePalette(unsigned int *paletteNumber) override;
     95 		long __stdcall GetDepthStencilSurface(IDirect3DSurface8 **depthStencilSurface) override;
     96 		long __stdcall GetDeviceCaps(D3DCAPS8 *caps) override;
     97 		long __stdcall GetDirect3D(IDirect3D8 **D3D) override;
     98 		long __stdcall GetDisplayMode(D3DDISPLAYMODE *mode) override;
     99 		long __stdcall GetFrontBuffer(IDirect3DSurface8 *destSurface) override;
    100 		void __stdcall GetGammaRamp(D3DGAMMARAMP *ramp) override;
    101 		long __stdcall GetIndices(IDirect3DIndexBuffer8 **indexData, unsigned int *baseVertexIndex) override;
    102 		long __stdcall GetInfo(unsigned long devInfoID, void *devInfoStruct, unsigned long devInfoStructSize) override;
    103 		long __stdcall GetLight(unsigned long index, D3DLIGHT8 *p) override;
    104 		long __stdcall GetLightEnable(unsigned long index , int *enable) override;
    105 		long __stdcall GetMaterial(D3DMATERIAL8 *material) override;
    106 		long __stdcall GetPaletteEntries(unsigned int paletteNumber, PALETTEENTRY *entries) override;
    107 		long __stdcall GetPixelShader(unsigned long *handle) override;
    108 		long __stdcall GetPixelShaderFunction(unsigned long handle, void *data, unsigned long *sizeOfData) override;
    109 		long __stdcall GetPixelShaderConstant(unsigned long startRegister, void *constantData, unsigned long constantCount) override;
    110 		long __stdcall GetRasterStatus(D3DRASTER_STATUS *rasterStatus) override;
    111 		long __stdcall GetRenderState(D3DRENDERSTATETYPE State, unsigned long *value) override;
    112 		long __stdcall GetRenderTarget(IDirect3DSurface8 **renderTarget) override;
    113 		long __stdcall GetStreamSource(unsigned int streamNumber, IDirect3DVertexBuffer8 **streamData, unsigned int *stride) override;
    114 		long __stdcall GetTexture(unsigned long stage, IDirect3DBaseTexture8 **texture) override;
    115 		long __stdcall GetTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type, unsigned long *value) override;
    116 		long __stdcall GetTransform(D3DTRANSFORMSTATETYPE state, D3DMATRIX *matrix) override;
    117 		long __stdcall GetVertexShader(unsigned long *handle) override;
    118 		long __stdcall GetVertexShaderConstant(unsigned long startRegister, void *constantData, unsigned long constantCount) override;
    119 		long __stdcall GetVertexShaderDeclaration(unsigned long handle, void *data, unsigned long *size) override;
    120 		long __stdcall GetVertexShaderFunction(unsigned long handle, void *data, unsigned long *size) override;
    121 		long __stdcall GetViewport(D3DVIEWPORT8 *viewport) override;
    122 		long __stdcall LightEnable(unsigned long index, int enable) override;
    123 		long __stdcall MultiplyTransform(D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix) override;
    124 		long __stdcall Present(const RECT *sourceRect, const RECT *destRect, HWND destWindowOverride, const RGNDATA *dirtyRegion) override;
    125 		long __stdcall ProcessVertices(unsigned int srcStartIndex, unsigned int destIndex, unsigned int vertexCount, IDirect3DVertexBuffer8 *destBuffer, unsigned long flags) override;
    126 		long __stdcall Reset(D3DPRESENT_PARAMETERS *presentParameters) override;
    127 		long __stdcall ResourceManagerDiscardBytes(unsigned long bytes) override;
    128 		long __stdcall SetClipPlane(unsigned long index, const float *plane) override;
    129 		long __stdcall SetClipStatus(const D3DCLIPSTATUS8 *clipStatus) override;
    130 		long __stdcall SetCurrentTexturePalette(unsigned int paletteNumber) override;
    131 		void __stdcall SetCursorPosition(int x, int y, unsigned long flags) override;
    132 		long __stdcall SetCursorProperties(unsigned int x, unsigned int y, IDirect3DSurface8 *cursorBitmap) override;
    133 		void __stdcall SetGammaRamp(unsigned long flags, const D3DGAMMARAMP *ramp) override;
    134 		long __stdcall SetIndices(IDirect3DIndexBuffer8 *indexData, unsigned int baseVertexIndex) override;
    135 		long __stdcall SetLight(unsigned long index, const D3DLIGHT8 *light) override;
    136 		long __stdcall SetMaterial(const D3DMATERIAL8 *material) override;
    137 		long __stdcall SetPaletteEntries(unsigned int paletteNumber, const PALETTEENTRY *entries) override;
    138 		long __stdcall SetPixelShader(unsigned long shader) override;
    139 		long __stdcall SetPixelShaderConstant(unsigned long startRegister, const void *constantData, unsigned long constantCount) override;
    140 		long __stdcall SetRenderState(D3DRENDERSTATETYPE state, unsigned long value) override;
    141 		long __stdcall SetRenderTarget(IDirect3DSurface8 *renderTarget, IDirect3DSurface8 *newZStencil) override;
    142 		long __stdcall SetStreamSource(unsigned int streamNumber, IDirect3DVertexBuffer8 *streamData, unsigned int stride) override;
    143 		long __stdcall SetTexture(unsigned long stage, IDirect3DBaseTexture8 *texture) override;
    144 		long __stdcall SetTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type, unsigned long value) override;
    145 		long __stdcall SetTransform(D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix) override;
    146 		long __stdcall SetVertexShader(unsigned long handle) override;
    147 		long __stdcall SetVertexShaderConstant(unsigned long startRegister, const void *constantData, unsigned long constantCount) override;
    148 		long __stdcall SetViewport(const D3DVIEWPORT8 *viewport) override;
    149 		int __stdcall ShowCursor(int show) override;
    150 		long __stdcall TestCooperativeLevel() override;
    151 		long __stdcall UpdateTexture(IDirect3DBaseTexture8 *sourceTexture, IDirect3DBaseTexture8 *destinationTexture) override;
    152 		long __stdcall ValidateDevice(unsigned long *numPasses) override;
    153 
    154 		// Internal methods
    155 		long __stdcall updateSurface(IDirect3DSurface8 *sourceSurface, const RECT *sourceRect, IDirect3DSurface8 *destinationSurface, const POINT *destPoint);
    156 
    157 	private:
    158 		static int FVFStride(unsigned long FVF);
    159 		static int typeStride(unsigned char streamType);
    160 		static sw::StreamType streamType(int type);
    161 		bool bindData(Direct3DIndexBuffer8 *indexBuffer, int base);
    162 		void bindStreams(int base);
    163 		void bindIndexBuffer(Direct3DIndexBuffer8 *indexBuffer);
    164 		void bindLights();
    165 		bool bindViewport();
    166 		void bindTextures();
    167 		void bindCursor();
    168 
    169 		long updateVolume(IDirect3DVolume8 *sourceVolume, IDirect3DVolume8 *destinationVolume);
    170 		void configureFPU();
    171 
    172 		// Creation parameters
    173 		const HINSTANCE instance;
    174 		Direct3D8 *d3d8;
    175 		const unsigned int adapter;
    176 		const D3DDEVTYPE deviceType;
    177 		const HWND focusWindow;
    178 		const unsigned long behaviourFlags;
    179 		const D3DPRESENT_PARAMETERS presentParameters;
    180 
    181 		HWND windowHandle;
    182 
    183 		D3DVIEWPORT8 viewport;
    184 		D3DMATRIX matrix[512];
    185 		Direct3DBaseTexture8 *texture[8];
    186 		D3DMATERIAL8 material;
    187 		float plane[6][4];
    188 		D3DCLIPSTATUS8 clipStatus;
    189 
    190 		struct Light : D3DLIGHT8
    191 		{
    192 			Light &operator=(const D3DLIGHT8 &light)
    193 			{
    194 				Type = light.Type;
    195 				Diffuse = light.Diffuse;
    196 				Specular = light.Specular;
    197 				Ambient = light.Ambient;
    198 				Position = light.Position;
    199 				Direction = light.Direction;
    200 				Range = light.Range;
    201 				Falloff = light.Falloff;
    202 				Attenuation0 = light.Attenuation0;
    203 				Attenuation1 = light.Attenuation1;
    204 				Attenuation2 = light.Attenuation2;
    205 				Theta = light.Theta;
    206 				Phi = light.Phi;
    207 
    208 				return *this;
    209 			}
    210 
    211 			bool enable;
    212 		};
    213 
    214 		struct Lights : std::map<int, Light>
    215 		{
    216 			bool exists(int index)
    217 			{
    218 				return find(index) != end();
    219 			}
    220 		};
    221 
    222 		Lights light;
    223 		bool lightsDirty;
    224 
    225 		Direct3DVertexBuffer8 *dataStream[16];
    226 		int streamStride[16];
    227 		Direct3DIndexBuffer8 *indexData;
    228 		unsigned int baseVertexIndex;
    229 
    230 		unsigned long FVF;
    231 
    232 		std::vector<Direct3DSwapChain8*> swapChain;
    233 
    234 		Direct3DSurface8 *renderTarget;
    235 		Direct3DSurface8 *depthStencil;
    236 
    237 		bool recordState;
    238 		std::vector<Direct3DStateBlock8*> stateRecorder;
    239 
    240 		unsigned long renderState[D3DRS_NORMALORDER + 1];
    241 		unsigned long textureStageState[8][D3DTSS_RESULTARG + 1];
    242 		bool init;   // TODO: Deprecate when all state changes implemented
    243 
    244 		std::vector<Direct3DPixelShader8*> pixelShader;
    245 		std::vector<Direct3DVertexShader8*> vertexShader;
    246 		unsigned long pixelShaderHandle;
    247 		unsigned long vertexShaderHandle;
    248 		const unsigned long *declaration;
    249 
    250 		float pixelShaderConstant[8][4];
    251 		float vertexShaderConstant[256][4];
    252 
    253 		struct Palette
    254 		{
    255 			PALETTEENTRY entry[256];
    256 		};
    257 
    258 		unsigned int currentPalette;
    259 		std::map<int, Palette> palette;
    260 
    261 		sw::Context *context;
    262 		sw::Renderer *renderer;
    263 
    264 		sw::Surface *cursor;
    265 		bool showCursor;
    266 		HCURSOR nullCursor;
    267 		HCURSOR win32Cursor;
    268 	};
    269 }
    270 
    271 #endif   // D3D8_Direct3DDevice8_hpp
    272