1 /*
2  * Copyright � 2014 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sub license, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the
13  * next paragraph) shall be included in all copies or substantial portions
14  * of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  *
24  * Authors:
25  *     Wei Lin<wei.w.lin@intel.com>
26  *     Yuting Yang<yuting.yang@intel.com>
27  */
28 #pragma once
29 #include "cm_def.h"
30 
31 class CmDevice_RT;
32 class CmKernel;
33 class CmTask_RT;
34 
35 class CmThreadSpace {
36  public:
37 	static INT Create(CmDevice_RT * pDevice, UINT indexTsArray, UINT width,
38 			  UINT height, CmThreadSpace * &pTS);
39 	static INT Destroy(CmThreadSpace * &pTS);
40 
41 	CM_RT_API INT AssociateThread(UINT x, UINT y, CmKernel * pKernel,
42 				      UINT threadId, BYTE dependencyMask);
43 	CM_RT_API INT SetThreadDependencyPattern(UINT count, INT * deltaX,
44 						 INT * deltaY);
45 	CM_RT_API INT SelectThreadDependencyPattern(CM_HAL_DEPENDENCY_PATTERN
46 						    pattern);
47 	CM_RT_API INT SetThreadSpaceColorCount(UINT colorCount);
48 	CM_RT_API INT SelectMediaWalkingPattern(CM_HAL_WALKING_PATTERN pattern);
49 	CM_RT_API INT Set26ZIDispatchPattern(CM_HAL_26ZI_DISPATCH_PATTERN
50 					     pattern);
51 	CM_RT_API INT Set26ZIMacroBlockSize(UINT width, UINT height);
52 	CM_RT_API INT SelectMediaWalkingParameters(CM_HAL_WALKING_PARAMETERS
53 						   parameters);
54 	CM_RT_API INT SelectThreadDependencyVectors(CM_HAL_DEPENDENCY
55 						    dependencyVectors);
56 
57 	INT GetThreadSpaceSize(UINT & width, UINT & height);
58 	INT GetThreadSpaceUnit(CM_THREAD_SPACE_UNIT * &pThreadSpaceUnit);
59 	INT GetDependency(CM_DEPENDENCY * &pDependency);
60 	INT GetDependencyPatternType(CM_HAL_DEPENDENCY_PATTERN &
61 				     DependencyPatternType);
62 	INT GetWalkingPattern(CM_HAL_WALKING_PATTERN & pWalkingPattern);
63 	INT Get26ZIDispatchPattern(CM_HAL_26ZI_DISPATCH_PATTERN & pattern);
64 	INT GetWalkingParameters(CM_HAL_WALKING_PARAMETERS &
65 				 pWalkingParameters);
66 	INT GetDependencyVectors(CM_HAL_DEPENDENCY & pDependencyVectors);
67 	BOOLEAN CheckWalkingParametersSet();
68 	BOOLEAN CheckDependencyVectorsSet();
69 	INT GetColorCountMinusOne(UINT & colorCount);
70 	INT GetWavefront26ZDispatchInfo(CM_HAL_WAVEFRONT26Z_DISPATCH_INFO &
71 					dispatchInfo);
72 	BOOLEAN IntegrityCheck(CmTask_RT * pTask);
73 	INT GetBoardOrder(UINT * &pBoardOrder);
74 	INT Wavefront45Sequence();
75 	INT Wavefront26Sequence();
76 	INT Wavefront26ZSequence();
77 	INT Wavefront26ZISeqVVHV26();
78 	INT Wavefront26ZISeqVVHH26();
79 	INT Wavefront26ZISeqVV26HH26();
80 	INT Wavefront26ZISeqVV1x26HH1x26();
81 	INT HorizentalSequence();
82 	INT VerticalSequence();
83 
84 	BOOLEAN IsThreadAssociated() const;
85 	BOOLEAN IsDependencySet();
86 
87 	UINT GetIndexInTsArray();
88 	CM_THREAD_SPACE_DIRTY_STATUS GetDirtyStatus() const;
89 	UINT SetDirtyStatus(CM_THREAD_SPACE_DIRTY_STATUS DirtyStatus) const;
90 
91 	BOOLEAN GetNeedSetKernelPointer() const;
92 	INT SetKernelPointer(CmKernel * pKernel) const;
93 	BOOLEAN KernelPointerIsNULL() const;
94 	CmKernel *GetKernelPointer() const;
95 
96  protected:
97 	 CmThreadSpace(CmDevice_RT * pDevice, UINT indexTsArray, UINT width,
98 		       UINT height);
99 	~CmThreadSpace(void);
100 
101 	INT Initialize(void);
102 
103 	CmDevice_RT *m_pDevice;
104 
105 	UINT m_Width;
106 	UINT m_Height;
107 	UINT m_ColorCountMinusOne;
108 
109 	UINT m_26ZIBlockWidth;
110 	UINT m_26ZIBlockHeight;
111 
112 	CM_THREAD_SPACE_UNIT *m_pThreadSpaceUnit;
113 	BOOLEAN m_ThreadAssociated;
114 
115 	BOOLEAN m_NeedSetKernelPointer;
116 	CmKernel **m_ppKernel;
117 
118 	CM_HAL_DEPENDENCY_PATTERN m_DependencyPatternType;
119 	CM_HAL_DEPENDENCY_PATTERN m_CurrentDependencyPattern;
120 	CM_DEPENDENCY m_Dependency;
121 	CM_HAL_26ZI_DISPATCH_PATTERN m_26ZIDispatchPattern;
122 	CM_HAL_26ZI_DISPATCH_PATTERN m_Current26ZIDispatchPattern;
123 
124 	UINT *m_pBoardFlag;
125 	UINT *m_pBoardOrderList;
126 	UINT m_IndexInList;
127 	UINT m_IndexInTsArray;
128 
129 	CM_HAL_WALKING_PATTERN m_WalkingPattern;
130 	DWORD m_WalkingParameters[CM_NUM_DWORD_FOR_MW_PARAM];
131 	BOOLEAN m_MediaWalkerParamsSet;
132 	CM_HAL_DEPENDENCY m_DependencyVectors;
133 	BOOLEAN m_DependencyVectorsSet;
134 
135  private:
136 	 CmThreadSpace(const CmThreadSpace & other);
137 	 CmThreadSpace & operator=(const CmThreadSpace & other);
138 
139 	PCM_THREAD_SPACE_DIRTY_STATUS m_pDirtyStatus;
140 
141 	CM_HAL_WAVEFRONT26Z_DISPATCH_INFO m_Wavefront26ZDispatchInfo;
142 };
143