xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/gen8/vp/kdll/hal_kernelrules_g8.c (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2009-2017, 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 "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file      hal_kernelrules_g8.c
24 //! \brief         Fast Compositing Kernel DLL rules for gen8
25 //!
26 #include "hal_kerneldll.h"  // Rule definitions
27 #include "vpkrnheader.h"    // Kernel IDs
28 
29 extern const Kdll_RuleEntry g_KdllRuleTable_g8[] =
30 {
31     // Kernel Setup
32 
33     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
34     { RID_IsParserState    , Parser_Begin                        , Kdll_None },
35     { RID_SetParserState   , Parser_SetRenderMethod              , Kdll_None },
36 
37     // Set rendering method
38 
39     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
40     { RID_IsParserState    , Parser_SetRenderMethod                  , Kdll_None },
41     { RID_IsRenderMethod   , RenderMethod_MediaObject                , Kdll_None },
42     { RID_SetKernel        , IDR_VP_VP_Setup                         , Kdll_None },
43     { RID_SetParserState   , Parser_SetupLayer0                      , Kdll_None },
44 
45     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
46     { RID_IsParserState    , Parser_SetRenderMethod                  , Kdll_None },
47     { RID_IsRenderMethod   , RenderMethod_MediaObjectWalker          , Kdll_None },
48     { RID_SetKernel        , IDR_VP_VP_Setup_MediaWalker_32x32_Color , Kdll_None },
49     { RID_SetParserState   , Parser_SetupLayer0                      , Kdll_None },
50 
51     // Set Layer 0
52 
53     // If first layer is RT, it's colorfill only case. Make sure.
54     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
55     { RID_IsParserState    , Parser_SetupLayer0                  , Kdll_None },
56     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },    // If it's RT
57     { RID_IsLayerNumber    , 0                                   , Kdll_None },    // If it's first layer.
58     { RID_SetParserState   , Parser_SetParamsTarget              , Kdll_None },
59 
60     // 1st layer
61     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
62     { RID_IsParserState    , Parser_SetupLayer0                  , Kdll_None },
63     { RID_IsLayerNumber    , 0                                   , Kdll_None },
64     { RID_SetKernel        , IDR_VP_Set_Layer_0                  , Kdll_None },
65     { RID_SetParserState   , Parser_SetParamsLayer0              , Kdll_None },
66 
67     // Set Layer 1
68 
69     // Please don't change the order of 2 rulesets below.
70     // Single layer
71     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
72     { RID_IsParserState    , Parser_SetupLayer1                  , Kdll_None },
73     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
74     { RID_IsSrc0Sampling   , Sample_Any                          , Kdll_None },  // Src0 must be valid for single layer case.
75     { RID_SetNextLayer     , -1                                  , Kdll_None },  // backoff one layer
76     { RID_SetParserState   , Parser_SampleLayer0                 , Kdll_None },
77 
78     // Last layer
79     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
80     { RID_IsParserState    , Parser_SetupLayer1                  , Kdll_None },
81     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
82     { RID_SetParserState   , Parser_SetParamsTarget              , Kdll_None },  // Setup CSC for render target
83 
84     // 2nd layer
85     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
86     { RID_IsParserState    , Parser_SetupLayer1                  , Kdll_None },
87     { RID_IsLayerNumber    , 1                                   , Kdll_None },
88     { RID_SetKernel        , IDR_VP_Set_Layer_1                  , Kdll_None },
89     { RID_SetParserState   , Parser_SetParamsLayer1              , Kdll_None },
90 
91     // 3rd layer
92     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
93     { RID_IsParserState    , Parser_SetupLayer1                  , Kdll_None },
94     { RID_IsLayerNumber    , 2                                   , Kdll_None },
95     { RID_SetKernel        , IDR_VP_Set_Layer_2                  , Kdll_None },
96     { RID_SetParserState   , Parser_SetParamsLayer1              , Kdll_None },
97 
98     // 4th layer
99     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
100     { RID_IsParserState    , Parser_SetupLayer1                  , Kdll_None },
101     { RID_IsLayerNumber    , 3                                   , Kdll_None },
102     { RID_SetKernel        , IDR_VP_Set_Layer_3                  , Kdll_None },
103     { RID_SetParserState   , Parser_SetParamsLayer1              , Kdll_None },
104 
105     // 5th layer
106     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
107     { RID_IsParserState    , Parser_SetupLayer1                  , Kdll_None },
108     { RID_IsLayerNumber    , 4                                   , Kdll_None },
109     { RID_SetKernel        , IDR_VP_Set_Layer_4                  , Kdll_None },
110     { RID_SetParserState   , Parser_SetParamsLayer1              , Kdll_None },
111 
112     // 6th layer
113     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
114     { RID_IsParserState    , Parser_SetupLayer1                  , Kdll_None },
115     { RID_IsLayerNumber    , 5                                   , Kdll_None },
116     { RID_SetKernel        , IDR_VP_Set_Layer_5                  , Kdll_None },
117     { RID_SetParserState   , Parser_SetParamsLayer1              , Kdll_None },
118 
119     // 7th layer
120     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
121     { RID_IsParserState    , Parser_SetupLayer1                  , Kdll_None },
122     { RID_IsLayerNumber    , 6                                   , Kdll_None },
123     { RID_SetKernel        , IDR_VP_Set_Layer_6                  , Kdll_None },
124     { RID_SetParserState   , Parser_SetParamsLayer1              , Kdll_None },
125 
126     // 8th layer
127     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
128     { RID_IsParserState    , Parser_SetupLayer1                  , Kdll_None },
129     { RID_IsLayerNumber    , 7                                   , Kdll_None },
130     { RID_SetKernel        , IDR_VP_Set_Layer_7                  , Kdll_None },
131     { RID_SetParserState   , Parser_SetParamsLayer1              , Kdll_None },
132 
133     // Setup Parameters for Layer 0
134 
135     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
136     { RID_IsParserState    , Parser_SetParamsLayer0              , Kdll_None },
137     { RID_SetSrc0Format    , Format_Source                       , Kdll_None },
138     { RID_SetSrc0Coeff     , CoeffID_Source                      , Kdll_None },
139     { RID_SetSrc0Sampling  , Sample_Source                       , Kdll_None },
140     { RID_SetSrc0Rotation  , Rotate_Source                       , Kdll_None },
141     { RID_SetSrc0ColorFill , ColorFill_Source                    , Kdll_None },
142     { RID_SetSrc0LumaKey   , LumaKey_Source                      , Kdll_None },
143     { RID_SetSrc0Processing, Process_Source                      , Kdll_None },
144     { RID_SetNextLayer     , 0                                   , Kdll_None },
145     { RID_SetParserState   , Parser_SetupLayer1                  , Kdll_None },
146 
147     // Setup Parameters for Layer 1
148 
149     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
150     { RID_IsParserState    , Parser_SetParamsLayer1              , Kdll_None },
151     { RID_SetSrc1Format    , Format_Source                       , Kdll_None },
152     { RID_SetSrc1Coeff     , CoeffID_Source                      , Kdll_None },
153     { RID_SetSrc1Sampling  , Sample_Source                       , Kdll_None },
154     { RID_SetSrc1Rotation  , Rotate_Source                       , Kdll_None },
155     { RID_SetSrc1LumaKey   , LumaKey_Source                      , Kdll_None },
156     { RID_SetSrc1Processing, Process_Source                      , Kdll_None },
157     { RID_SetParserState   , Parser_SampleLayer1                 , Kdll_None },
158 
159     // Setup Parameters for Render Target
160 
161     //If only RT is present, it's colorfill only case. Go to write directly.
162     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
163     { RID_IsParserState    , Parser_SetParamsTarget              , Kdll_None },
164     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
165     { RID_IsLayerNumber    , 0                                   , Kdll_None },
166     { RID_SetSrc0ColorFill , ColorFill_Source                    , Kdll_None },
167     { RID_SetSrc0Format    , Format_Source                       , Kdll_None },
168     { RID_SetParserState   , Parser_WriteOutput                  , Kdll_None },
169 
170     // If CSC0 is done before Mix, then jump to SetupCSC1
171     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
172     { RID_IsParserState    , Parser_SetParamsTarget              , Kdll_None },
173     { RID_IsCSCBeforeMix   , true                                , Kdll_None },
174     { RID_SetTargetCspace  , CSpace_Source                       , Kdll_None },
175     { RID_SetParserState   , Parser_SetupCSC1                    , Kdll_None },
176 
177     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
178     { RID_IsParserState    , Parser_SetParamsTarget              , Kdll_None },
179     { RID_SetSrc0Format    , Format_Source                       , Kdll_None },
180     { RID_SetSrc0Coeff     , CoeffID_Source                      , Kdll_None },
181     { RID_SetTargetCspace  , CSpace_Source                       , Kdll_None },
182     { RID_SetParserState   , Parser_SetupCSC0                    , Kdll_None },
183 
184     // Sample Layer 0
185 
186     // Sample (P010 | P016) -> Src0
187     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
188     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
189     { RID_IsSrc0Format     , Format_P010                         , Kdll_Or   },
190     { RID_IsSrc0Format     , Format_P016                         , Kdll_None },
191     { RID_IsSrc0Sampling   , Sample_Scaling                      , Kdll_None },
192     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_0        , Kdll_None },
193     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_1        , Kdll_None },
194     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_2        , Kdll_None },
195     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_3        , Kdll_None },
196     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
197 
198     // Sample_Unorm progressive scaling
199     // Sample (RGB | AYUV | Packed YUV | NV12 | 400P) -> Src0
200     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
201     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
202     { RID_IsSrc0Format     , Format_RGB                          , Kdll_Or   },
203     { RID_IsSrc0Format     , Format_AYUV                         , Kdll_Or   },
204     { RID_IsSrc0Format     , Format_PA                           , Kdll_Or   },
205     { RID_IsSrc0Format     , Format_PL2                          , Kdll_Or   },
206     { RID_IsSrc0Format     , Format_400P                         , Kdll_None },
207     { RID_IsSrc0Sampling   , Sample_Scaling                      , Kdll_None },
208     { RID_SetKernel        , IDR_VP_PA_444Scale16_Buf_0          , Kdll_None },
209     { RID_SetKernel        , IDR_VP_PA_444Scale16_Buf_1          , Kdll_None },
210     { RID_SetKernel        , IDR_VP_PA_444Scale16_Buf_2          , Kdll_None },
211     { RID_SetKernel        , IDR_VP_PA_444Scale16_Buf_3          , Kdll_None },
212     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
213 
214     // Sample NV12 (width or height is not a multiple of 4) -> Src0
215     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
216     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
217     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_None },
218     { RID_IsSrc0Sampling   , Sample_Scaling                      , Kdll_None },
219     { RID_SetKernel        , IDR_VP_PL2_444Scale16_Buf_0         , Kdll_None },
220     { RID_SetKernel        , IDR_VP_PL2_444Scale16_Buf_1         , Kdll_None },
221     { RID_SetKernel        , IDR_VP_PL2_444Scale16_Buf_2         , Kdll_None },
222     { RID_SetKernel        , IDR_VP_PL2_444Scale16_Buf_3         , Kdll_None },
223     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
224 
225     // Sample (PL3 | PL3_RGB) -> Src0
226     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
227     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
228     { RID_IsSrc0Format     , Format_PL3                          , Kdll_Or   },
229     { RID_IsSrc0Format     , Format_PL3_RGB                      , Kdll_None },
230     { RID_IsSrc0Sampling   , Sample_Scaling                      , Kdll_None },
231     { RID_SetKernel        , IDR_VP_PL3_444Scale16_Buf_0         , Kdll_None },
232     { RID_SetKernel        , IDR_VP_PL3_444Scale16_Buf_1         , Kdll_None },
233     { RID_SetKernel        , IDR_VP_PL3_444Scale16_Buf_2         , Kdll_None },
234     { RID_SetKernel        , IDR_VP_PL3_444Scale16_Buf_3         , Kdll_None },
235     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
236 
237     // Sample progressive scaling
238     // Sample 0.34x (P010 | P016) -> Src0
239     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
240     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
241     { RID_IsSrc0Format     , Format_P010                         , Kdll_Or   },
242     { RID_IsSrc0Format     , Format_P016                         , Kdll_None },
243     { RID_IsSrc0Sampling   , Sample_Scaling_034x                 , Kdll_None },
244     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_0        , Kdll_None },
245     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_1        , Kdll_None },
246     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_2        , Kdll_None },
247     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_3        , Kdll_None },
248     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
249 
250     // Sample 0.34x (RGB | AYUV | Packed YUV | NV12 | 400P) -> Src0
251     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
252     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
253     { RID_IsSrc0Format     , Format_RGB                          , Kdll_Or   },
254     { RID_IsSrc0Format     , Format_AYUV                         , Kdll_Or   },
255     { RID_IsSrc0Format     , Format_PA                           , Kdll_Or   },
256     { RID_IsSrc0Format     , Format_PL2                          , Kdll_Or   },
257     { RID_IsSrc0Format     , Format_400P                         , Kdll_None },
258     { RID_IsSrc0Sampling   , Sample_Scaling_034x                 , Kdll_None },
259     { RID_SetKernel        , IDR_VP_PA_444DScale16_Buf_0         , Kdll_None },
260     { RID_SetKernel        , IDR_VP_PA_444DScale16_Buf_1         , Kdll_None },
261     { RID_SetKernel        , IDR_VP_PA_444DScale16_Buf_2         , Kdll_None },
262     { RID_SetKernel        , IDR_VP_PA_444DScale16_Buf_3         , Kdll_None },
263     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
264 
265     // Sample 0.34x PL2(width or height is not a multiple of 4) -> Src0
266     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
267     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
268     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_None },
269     { RID_IsSrc0Sampling   , Sample_Scaling_034x                 , Kdll_None },
270     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_0        , Kdll_None },
271     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_1        , Kdll_None },
272     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_2        , Kdll_None },
273     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_3        , Kdll_None },
274     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
275 
276     // Sample 0.34x (PL3 | PL3_RGB) -> Src0
277     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
278     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
279     { RID_IsSrc0Format     , Format_PL3                          , Kdll_Or   },
280     { RID_IsSrc0Format     , Format_PL3_RGB                      , Kdll_None },
281     { RID_IsSrc0Sampling   , Sample_Scaling_034x                 , Kdll_None },
282     { RID_SetKernel        , IDR_VP_PL3_444DScale16_Buf_0        , Kdll_None },
283     { RID_SetKernel        , IDR_VP_PL3_444DScale16_Buf_1        , Kdll_None },
284     { RID_SetKernel        , IDR_VP_PL3_444DScale16_Buf_2        , Kdll_None },
285     { RID_SetKernel        , IDR_VP_PL3_444DScale16_Buf_3        , Kdll_None },
286     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
287 
288     // Sample_8x8 progressive scaling
289     // AVS Sample (RGB | AYUV | Packed YUV | NV12 | 400P) -> Src0
290     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
291     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
292     { RID_IsSrc0Format     , Format_RGB                          , Kdll_Or   },
293     { RID_IsSrc0Format     , Format_AYUV                         , Kdll_Or   },
294     { RID_IsSrc0Format     , Format_PA                           , Kdll_Or   },
295     { RID_IsSrc0Format     , Format_PL2                          , Kdll_Or   },
296     { RID_IsSrc0Format     , Format_400P                         , Kdll_None },
297     { RID_IsSrc0Sampling   , Sample_Scaling_AVS                  , Kdll_None },
298     { RID_SetKernel        , IDR_VP_PA_444AVS16_Buf_0            , Kdll_None },
299     { RID_SetKernel        , IDR_VP_PA_444AVS16_Buf_1            , Kdll_None },
300     { RID_SetKernel        , IDR_VP_PA_444AVS16_Buf_2            , Kdll_None },
301     { RID_SetKernel        , IDR_VP_PA_444AVS16_Buf_3            , Kdll_None },
302     { RID_SetParserState   , Parser_ShuffleLayer0                , Kdll_None },
303 
304     // AVS Sample PL2(width or height is not a multiple of 4) -> Src0
305     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
306     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
307     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_None },
308     { RID_IsSrc0Sampling   , Sample_Scaling_AVS                  , Kdll_None },
309     { RID_SetKernel        , IDR_VP_PL2_444AVS16_Buf_0           , Kdll_None },
310     { RID_SetKernel        , IDR_VP_PL2_444AVS16_Buf_1           , Kdll_None },
311     { RID_SetKernel        , IDR_VP_PL2_444AVS16_Buf_2           , Kdll_None },
312     { RID_SetKernel        , IDR_VP_PL2_444AVS16_Buf_3           , Kdll_None },
313     { RID_SetParserState   , Parser_ShuffleLayer0                , Kdll_None },
314 
315     // AVS Sample (PL3 | PL3_RGB) -> Src0
316     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
317     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
318     { RID_IsSrc0Format     , Format_PL3                          , Kdll_Or   },
319     { RID_IsSrc0Format     , Format_PL3_RGB                      , Kdll_None },
320     { RID_IsSrc0Sampling   , Sample_Scaling_AVS                  , Kdll_None },
321     { RID_SetKernel        , IDR_VP_PL3_444AVS16_Buf_0           , Kdll_None },
322     { RID_SetKernel        , IDR_VP_PL3_444AVS16_Buf_1           , Kdll_None },
323     { RID_SetKernel        , IDR_VP_PL3_444AVS16_Buf_2           , Kdll_None },
324     { RID_SetKernel        , IDR_VP_PL3_444AVS16_Buf_3           , Kdll_None },
325     { RID_SetParserState   , Parser_ShuffleLayer0                , Kdll_None },
326 
327      // AVS Interlace Scaling
328     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
329     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
330     { RID_IsSrc0Format     , Format_AYUV                         , Kdll_Or   },
331     { RID_IsSrc0Format     , Format_NV12                         , Kdll_Or   },
332     { RID_IsSrc0Format     , Format_PA                           , Kdll_Or   },
333     { RID_IsSrc0Format     , Format_RGB                          , Kdll_None },
334     { RID_IsSrc0Sampling   , Sample_iScaling_AVS                 , Kdll_None },
335     { RID_SetKernel        , IDR_VP_PA_444iAVS16_Buf_0           , Kdll_None },
336     { RID_SetKernel        , IDR_VP_PA_444iAVS16_Buf_1           , Kdll_None },
337     { RID_SetKernel        , IDR_VP_PA_444iAVS16_Buf_2           , Kdll_None },
338     { RID_SetKernel        , IDR_VP_PA_444iAVS16_Buf_3           , Kdll_None },
339     { RID_SetKernel        , IDR_VP_Shuffle_444AVS16_Buf_0       , Kdll_None },
340     { RID_SetKernel        , IDR_VP_Shuffle_444AVS16_Buf_1       , Kdll_None },
341     { RID_SetKernel        , IDR_VP_Shuffle_444AVS16_Buf_2       , Kdll_None },
342     { RID_SetKernel        , IDR_VP_Shuffle_444AVS16_Buf_3       , Kdll_None },
343     { RID_SetParserState   , Parser_SampleLayer0Mix              , Kdll_None },
344 
345     // AVS Interlace Scaling PL2 -> Src0
346     // PL2_444iAVS is not supported, use PL2_444iScale kernel instead
347     // May have quality difference than interlaced AVS scaling
348     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
349     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
350     { RID_IsSrc0Format     , Format_PL2                          , Kdll_Or   },
351     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_None },
352     { RID_IsSrc0Sampling   , Sample_iScaling_AVS                 , Kdll_None },
353     { RID_SetKernel        , IDR_VP_PL2_444iScale16_Buf_0        , Kdll_None },
354     { RID_SetKernel        , IDR_VP_PL2_444iScale16_Buf_1        , Kdll_None },
355     { RID_SetKernel        , IDR_VP_PL2_444iScale16_Buf_2        , Kdll_None },
356     { RID_SetKernel        , IDR_VP_PL2_444iScale16_Buf_3        , Kdll_None },
357     { RID_SetParserState   , Parser_SampleLayer0Mix              , Kdll_None },
358 
359     // Sample_Unorm interlaced scaling
360     // Interlaced Sample RGB -> Src0
361     // jump to sampleLayer0SelectCSC to decide if CSC needed before Mix
362     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
363     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
364     { RID_IsSrc0Format     , Format_RGB                          , Kdll_None },
365     { RID_IsSrc0Sampling   , Sample_iScaling                     , Kdll_None },
366     { RID_SetKernel        , IDR_VP_PA_444iScale16_Buf_0         , Kdll_None },
367     { RID_SetKernel        , IDR_VP_PA_444iScale16_Buf_1         , Kdll_None },
368     { RID_SetKernel        , IDR_VP_PA_444iScale16_Buf_2         , Kdll_None },
369     { RID_SetKernel        , IDR_VP_PA_444iScale16_Buf_3         , Kdll_None },
370     { RID_SetParserState   , Parser_SampleLayer0SelectCSC        , Kdll_None },
371 
372     // Sample (AYUV | Packed YUV | NV12 | 400P) -> Src0
373     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
374     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
375     { RID_IsSrc0Format     , Format_AYUV                         , Kdll_Or   },
376     { RID_IsSrc0Format     , Format_PA                           , Kdll_Or   },
377     { RID_IsSrc0Format     , Format_PL2                          , Kdll_Or   },
378     { RID_IsSrc0Format     , Format_400P                         , Kdll_None },
379     { RID_IsSrc0Sampling   , Sample_iScaling                     , Kdll_None },
380     { RID_SetKernel        , IDR_VP_PA_444iScale16_Buf_0         , Kdll_None },
381     { RID_SetKernel        , IDR_VP_PA_444iScale16_Buf_1         , Kdll_None },
382     { RID_SetKernel        , IDR_VP_PA_444iScale16_Buf_2         , Kdll_None },
383     { RID_SetKernel        , IDR_VP_PA_444iScale16_Buf_3         , Kdll_None },
384     { RID_SetParserState   , Parser_SampleLayer0Mix              , Kdll_None },
385 
386     // Sample PL2(width or height is not a multiple of 4) -> Src0
387     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
388     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
389     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_None },
390     { RID_IsSrc0Sampling   , Sample_iScaling                     , Kdll_None },
391     { RID_SetKernel        , IDR_VP_PL2_444iScale16_Buf_0        , Kdll_None },
392     { RID_SetKernel        , IDR_VP_PL2_444iScale16_Buf_1        , Kdll_None },
393     { RID_SetKernel        , IDR_VP_PL2_444iScale16_Buf_2        , Kdll_None },
394     { RID_SetKernel        , IDR_VP_PL2_444iScale16_Buf_3        , Kdll_None },
395     { RID_SetParserState   , Parser_SampleLayer0Mix              , Kdll_None },
396 
397     // Sample PL3 -> Src0
398     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
399     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
400     { RID_IsSrc0Format     , Format_PL3                          , Kdll_None },
401     { RID_IsSrc0Sampling   , Sample_iScaling                     , Kdll_None },
402     { RID_SetKernel        , IDR_VP_PL3_444iScale16_Buf_0        , Kdll_None },
403     { RID_SetKernel        , IDR_VP_PL3_444iScale16_Buf_1        , Kdll_None },
404     { RID_SetKernel        , IDR_VP_PL3_444iScale16_Buf_2        , Kdll_None },
405     { RID_SetKernel        , IDR_VP_PL3_444iScale16_Buf_3        , Kdll_None },
406     { RID_SetParserState   , Parser_SampleLayer0Mix              , Kdll_None },
407 
408     // Sample PL3_RGB -> Src0
409     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
410     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
411     { RID_IsSrc0Format     , Format_PL3_RGB                      , Kdll_None },
412     { RID_IsSrc0Sampling   , Sample_iScaling                     , Kdll_None },
413     { RID_SetKernel        , IDR_VP_PL3_444iScale16_Buf_0        , Kdll_None },
414     { RID_SetKernel        , IDR_VP_PL3_444iScale16_Buf_1        , Kdll_None },
415     { RID_SetKernel        , IDR_VP_PL3_444iScale16_Buf_2        , Kdll_None },
416     { RID_SetKernel        , IDR_VP_PL3_444iScale16_Buf_3        , Kdll_None },
417     { RID_SetParserState   , Parser_SampleLayer0SelectCSC        , Kdll_None },
418 
419     // Sample interlaced scaling
420     // Sample 0.34x RGB -> Src0
421     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
422     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
423     { RID_IsSrc0Format     , Format_RGB                          , Kdll_None },
424     { RID_IsSrc0Sampling   , Sample_iScaling_034x                , Kdll_None },
425     { RID_SetKernel        , IDR_VP_PA_444iDScale16_Buf_0        , Kdll_None },
426     { RID_SetKernel        , IDR_VP_PA_444iDScale16_Buf_1        , Kdll_None },
427     { RID_SetKernel        , IDR_VP_PA_444iDScale16_Buf_2        , Kdll_None },
428     { RID_SetKernel        , IDR_VP_PA_444iDScale16_Buf_3        , Kdll_None },
429     { RID_SetParserState   , Parser_SampleLayer0Mix              , Kdll_None },
430 
431      // Sample 0.34x (AYUV | Packed YUV | NV12 | 400P) -> Src0
432     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
433     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
434     { RID_IsSrc0Format     , Format_AYUV                         , Kdll_Or   },
435     { RID_IsSrc0Format     , Format_PA                           , Kdll_Or   },
436     { RID_IsSrc0Format     , Format_PL2                          , Kdll_Or   },
437     { RID_IsSrc0Format     , Format_400P                         , Kdll_None },
438     { RID_IsSrc0Sampling   , Sample_iScaling_034x                , Kdll_None },
439     { RID_SetKernel        , IDR_VP_PA_444iDScale16_Buf_0        , Kdll_None },
440     { RID_SetKernel        , IDR_VP_PA_444iDScale16_Buf_1        , Kdll_None },
441     { RID_SetKernel        , IDR_VP_PA_444iDScale16_Buf_2        , Kdll_None },
442     { RID_SetKernel        , IDR_VP_PA_444iDScale16_Buf_3        , Kdll_None },
443     { RID_SetParserState   , Parser_SampleLayer0Mix              , Kdll_None },
444 
445     // Sample 0.34x PL2(width or height is not a multiple of 4) -> Src0
446     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
447     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
448     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_None },
449     { RID_IsSrc0Sampling   , Sample_iScaling_034x                , Kdll_None },
450     { RID_SetKernel        , IDR_VP_PL2_444iDScale16_Buf_0       , Kdll_None },
451     { RID_SetKernel        , IDR_VP_PL2_444iDScale16_Buf_1       , Kdll_None },
452     { RID_SetKernel        , IDR_VP_PL2_444iDScale16_Buf_2       , Kdll_None },
453     { RID_SetKernel        , IDR_VP_PL2_444iDScale16_Buf_3       , Kdll_None },
454     { RID_SetParserState   , Parser_SampleLayer0Mix              , Kdll_None },
455 
456     // Sample 0.34x PL3 -> Src0
457     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
458     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
459     { RID_IsSrc0Format     , Format_PL3                          , Kdll_None },
460     { RID_IsSrc0Sampling   , Sample_iScaling_034x                , Kdll_None },
461     { RID_SetKernel        , IDR_VP_PL3_444iDScale16_Buf_0       , Kdll_None },
462     { RID_SetKernel        , IDR_VP_PL3_444iDScale16_Buf_1       , Kdll_None },
463     { RID_SetKernel        , IDR_VP_PL3_444iDScale16_Buf_2       , Kdll_None },
464     { RID_SetKernel        , IDR_VP_PL3_444iDScale16_Buf_3       , Kdll_None },
465     { RID_SetParserState   , Parser_SampleLayer0Mix              , Kdll_None },
466 
467     // Sample 0.34x PL3_RGB -> Src0
468     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
469     { RID_IsParserState    , Parser_SampleLayer0                 , Kdll_None },
470     { RID_IsSrc0Format     , Format_PL3_RGB                      , Kdll_None },
471     { RID_IsSrc0Sampling   , Sample_iScaling_034x                , Kdll_None },
472     { RID_SetKernel        , IDR_VP_PL3_444iDScale16_Buf_0       , Kdll_None },
473     { RID_SetKernel        , IDR_VP_PL3_444iDScale16_Buf_1       , Kdll_None },
474     { RID_SetKernel        , IDR_VP_PL3_444iDScale16_Buf_2       , Kdll_None },
475     { RID_SetKernel        , IDR_VP_PL3_444iDScale16_Buf_3       , Kdll_None },
476     { RID_SetParserState   , Parser_SampleLayer0SelectCSC        , Kdll_None },
477 
478     // Select CSC for layer 0 Mix only if Render Target format is NV12
479     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
480     { RID_IsParserState    , Parser_SampleLayer0SelectCSC        , Kdll_None },
481     { RID_IsTargetFormat   , Format_NV12                         , Kdll_None },
482     { RID_SetNextLayer     , 2                                   , Kdll_None },   // increase layer number to target layer
483     { RID_SetCSCBeforeMix  , true                                , Kdll_None },
484     { RID_SetSrc0Coeff     , CoeffID_Source                      , Kdll_None },
485     { RID_SetParserState   , Parser_SetupCSC0                    , Kdll_None },
486 
487     // If Render Target is not NV12, simply call Intermix
488     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
489     { RID_IsParserState    , Parser_SampleLayer0SelectCSC        , Kdll_None },
490     { RID_SetParserState   , Parser_SampleLayer0Mix              , Kdll_None },
491 
492     // Intermix the layer 0
493 
494     // Interlaced scaling, intermix the top and bottom fields
495     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
496     { RID_IsParserState    , Parser_SampleLayer0Mix              , Kdll_None },
497     { RID_IsTargetFormat   , Format_NV12                         , Kdll_None },
498     { RID_IsSrc0Sampling   , Sample_iScaling                     , Kdll_Or   },
499     { RID_IsSrc0Sampling   , Sample_iScaling_AVS                 , Kdll_Or   },
500     { RID_IsSrc0Sampling   , Sample_iScaling_034x                , Kdll_None },
501     { RID_SetKernel        , IDR_VP_Interlace_420_16_Buf_0       , Kdll_None },
502     { RID_SetKernel        , IDR_VP_Interlace_420_16_Buf_1       , Kdll_None },
503     { RID_SetKernel        , IDR_VP_Interlace_420_16_Buf_2       , Kdll_None },
504     { RID_SetKernel        , IDR_VP_Interlace_420_16_Buf_3       , Kdll_None },
505     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
506 
507     // Interlaced scaling, intermix the top and bottom fields
508     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
509     { RID_IsParserState    , Parser_SampleLayer0Mix              , Kdll_None },
510     { RID_SetKernel        , IDR_VP_Interlace_444_16_Buf_0       , Kdll_None },
511     { RID_SetKernel        , IDR_VP_Interlace_444_16_Buf_1       , Kdll_None },
512     { RID_SetKernel        , IDR_VP_Interlace_444_16_Buf_2       , Kdll_None },
513     { RID_SetKernel        , IDR_VP_Interlace_444_16_Buf_3       , Kdll_None },
514     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
515 
516     // Shuffle Layer 0
517 
518     // All layers use Sample_8x8
519     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
520     { RID_IsParserState    , Parser_ShuffleLayer0                , Kdll_None },
521     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
522     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
523 
524     // Mix of Sample_8x8 and normal sampling. Shuffle Sample_8x8 data
525     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
526     { RID_IsParserState    , Parser_ShuffleLayer0                , Kdll_None },
527     { RID_IsShuffling      , Shuffle_All_8x8_Layer               , Kdll_None },
528     { RID_SetKernel        , IDR_VP_Shuffle_444AVS16_Buf_0       , Kdll_None },
529     { RID_SetKernel        , IDR_VP_Shuffle_444AVS16_Buf_1       , Kdll_None },
530     { RID_SetKernel        , IDR_VP_Shuffle_444AVS16_Buf_2       , Kdll_None },
531     { RID_SetKernel        , IDR_VP_Shuffle_444AVS16_Buf_3       , Kdll_None },
532     { RID_SetParserState   , Parser_SampleLayer0ColorFill        , Kdll_None },
533 
534     // Sample Layer 0 Colorfill
535 
536     // Src0 Sampling is complete, AVS not shuffled yet -> SrcBlend + Luma key + colorfill AVS
537     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
538     { RID_IsParserState    , Parser_SampleLayer0ColorFill        , Kdll_None },
539     { RID_IsSrc0Processing , Process_SBlend                      , Kdll_None },
540     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
541     { RID_IsSrc0LumaKey    , LumaKey_True                        , Kdll_None },
542     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
543     { RID_SetKernel        , IDR_VP_Compute_Lumakey_Buf0123      , Kdll_None },
544     { RID_SetKernel        , IDR_VP_Colorfill_444AVS16_SrcBlend  , Kdll_None },
545     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
546     { RID_SetSrc0LumaKey   , LumaKey_False                       , Kdll_None },
547     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
548 
549     // Src0 Sampling is complete, AVS not shuffled yet -> SrcBlend + colorfill AVS
550     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
551     { RID_IsParserState    , Parser_SampleLayer0ColorFill        , Kdll_None },
552     { RID_IsSrc0Processing , Process_SBlend                      , Kdll_None },
553     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
554     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
555     { RID_SetKernel        , IDR_VP_Colorfill_444AVS16_SrcBlend  , Kdll_None },
556     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
557     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
558 
559     // Src0 Sampling is complete, AVS not shuffled yet -> ConstBlend + Luma key + colorfill AVS
560     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
561     { RID_IsParserState    , Parser_SampleLayer0ColorFill            , Kdll_None },
562     { RID_IsSrc0Processing , Process_CBlend                          , Kdll_None },
563     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
564     { RID_IsSrc0LumaKey    , LumaKey_True                            , Kdll_None },
565     { RID_IsShuffling      , Shuffle_RenderTarget                    , Kdll_None },
566     { RID_SetKernel        , IDR_VP_Compute_Lumakey_Buf0123          , Kdll_None },
567     { RID_SetKernel        , IDR_VP_Colorfill_444AVS16_ConstBlend    , Kdll_None },
568     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
569     { RID_SetSrc0LumaKey   , LumaKey_False                           , Kdll_None },
570     { RID_SetParserState   , Parser_SampleLayer0Done                 , Kdll_None },
571 
572     // Src0 Sampling is complete, AVS not shuffled yet -> ConstBlend + colorfill AVS
573     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
574     { RID_IsParserState    , Parser_SampleLayer0ColorFill            , Kdll_None },
575     { RID_IsSrc0Processing , Process_CBlend                          , Kdll_None },
576     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
577     { RID_IsShuffling      , Shuffle_RenderTarget                    , Kdll_None },
578     { RID_SetKernel        , IDR_VP_Colorfill_444AVS16_ConstBlend    , Kdll_None },
579     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
580     { RID_SetParserState   , Parser_SampleLayer0Done                 , Kdll_None },
581 
582     // Src0 Sampling is complete, AVS not shuffled yet -> ConstSrcBlend + Luma key + colorfill AVS
583     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                            , Kdll_None },
584     { RID_IsParserState    , Parser_SampleLayer0ColorFill                , Kdll_None },
585     { RID_IsSrc0Processing , Process_CSBlend                             , Kdll_None },
586     { RID_IsSrc0ColorFill  , ColorFill_True                              , Kdll_None },
587     { RID_IsSrc0LumaKey    , LumaKey_True                                , Kdll_None },
588     { RID_IsShuffling      , Shuffle_RenderTarget                        , Kdll_None },
589     { RID_SetKernel        , IDR_VP_Compute_Lumakey_Buf0123              , Kdll_None },
590     { RID_SetKernel        , IDR_VP_Colorfill_444AVS16_ConstSrcBlend     , Kdll_None },
591     { RID_SetSrc0ColorFill , ColorFill_False                             , Kdll_None },
592     { RID_SetSrc0LumaKey   , LumaKey_False                               , Kdll_None },
593     { RID_SetParserState   , Parser_SampleLayer0Done                     , Kdll_None },
594 
595     // Src0 Sampling is complete, AVS not shuffled yet -> ConstSrcBlend + colorfill AVS
596     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                            , Kdll_None },
597     { RID_IsParserState    , Parser_SampleLayer0ColorFill                , Kdll_None },
598     { RID_IsSrc0Processing , Process_CSBlend                             , Kdll_None },
599     { RID_IsSrc0ColorFill  , ColorFill_True                              , Kdll_None },
600     { RID_IsShuffling      , Shuffle_RenderTarget                        , Kdll_None },
601     { RID_SetKernel        , IDR_VP_Colorfill_444AVS16_ConstSrcBlend     , Kdll_None },
602     { RID_SetSrc0ColorFill , ColorFill_False                             , Kdll_None },
603     { RID_SetParserState   , Parser_SampleLayer0Done                     , Kdll_None },
604 
605     // Src0 Sampling is complete, AVS not shuffled yet -> PartBlend + Luma key + colorfill AVS
606     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
607     { RID_IsParserState    , Parser_SampleLayer0ColorFill            , Kdll_None },
608     { RID_IsSrc0Processing , Process_PBlend                          , Kdll_None },
609     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
610     { RID_IsSrc0LumaKey    , LumaKey_True                            , Kdll_None },
611     { RID_IsShuffling      , Shuffle_RenderTarget                    , Kdll_None },
612     { RID_SetKernel        , IDR_VP_Compute_Lumakey_Buf0123          , Kdll_None },
613     { RID_SetKernel        , IDR_VP_Colorfill_444AVS16_PartBlend     , Kdll_None },
614     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
615     { RID_SetSrc0LumaKey   , LumaKey_False                           , Kdll_None },
616     { RID_SetParserState   , Parser_SampleLayer0Done                 , Kdll_None },
617 
618     // Src0 Sampling is complete, AVS not shuffled yet -> PartBlend + colorfill AVS
619     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
620     { RID_IsParserState    , Parser_SampleLayer0ColorFill            , Kdll_None },
621     { RID_IsSrc0Processing , Process_PBlend                          , Kdll_None },
622     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
623     { RID_IsShuffling      , Shuffle_RenderTarget                    , Kdll_None },
624     { RID_SetKernel        , IDR_VP_Colorfill_444AVS16_PartBlend     , Kdll_None },
625     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
626     { RID_SetParserState   , Parser_SampleLayer0Done                 , Kdll_None },
627 
628     // Src0 Sampling is complete, AVS not shuffled yet -> Luma key + colorfill AVS
629     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
630     { RID_IsParserState    , Parser_SampleLayer0ColorFill        , Kdll_None },
631     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
632     { RID_IsSrc0LumaKey    , LumaKey_True                        , Kdll_None },
633     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
634     { RID_SetKernel        , IDR_VP_Compute_Lumakey_Buf0123      , Kdll_None },
635     { RID_SetKernel        , IDR_VP_Colorfill_444AVS16           , Kdll_None },
636     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
637     { RID_SetSrc0LumaKey   , LumaKey_False                       , Kdll_None },
638     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
639 
640     // Src0 Sampling is complete, AVS not shuffled yet -> colorfill AVS
641     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
642     { RID_IsParserState    , Parser_SampleLayer0ColorFill        , Kdll_None },
643     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
644     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
645     { RID_SetKernel        , IDR_VP_Colorfill_444AVS16           , Kdll_None },
646     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
647     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
648 
649     // Src0 Sampling is complete -> SrcBlend + Luma key + colorfill
650     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
651     { RID_IsParserState    , Parser_SampleLayer0ColorFill            , Kdll_None },
652     { RID_IsSrc0Processing , Process_SBlend                          , Kdll_None },
653     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
654     { RID_IsSrc0LumaKey    , LumaKey_True                            , Kdll_None },
655     { RID_SetKernel        , IDR_VP_Compute_Lumakey_Buf0123          , Kdll_None },
656     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16_SrcBlend    , Kdll_None },
657     { RID_SetSrc0Processing, Process_None                            , Kdll_None },
658     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
659     { RID_SetSrc0LumaKey   , LumaKey_False                           , Kdll_None },
660     { RID_SetParserState   , Parser_RotateLayer0Check                , Kdll_None },
661 
662     // Src0 Sampling is complete -> SrcBlend + colorfill
663     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
664     { RID_IsParserState    , Parser_SampleLayer0ColorFill            , Kdll_None },
665     { RID_IsSrc0Processing , Process_SBlend                          , Kdll_None },
666     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
667     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16_SrcBlend    , Kdll_None },
668     { RID_SetSrc0Processing, Process_None                            , Kdll_None },
669     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
670     { RID_SetParserState   , Parser_RotateLayer0Check                , Kdll_None },
671 
672     // Src0 Sampling is complete -> ConstBlend + Luma key + colorfill
673     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
674     { RID_IsParserState    , Parser_SampleLayer0ColorFill            , Kdll_None },
675     { RID_IsSrc0Processing , Process_CBlend                          , Kdll_None },
676     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
677     { RID_IsSrc0LumaKey    , LumaKey_True                            , Kdll_None },
678     { RID_SetKernel        , IDR_VP_Compute_Lumakey_Buf0123          , Kdll_None },
679     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16_ConstBlend  , Kdll_None },
680     { RID_SetSrc0Processing, Process_None                            , Kdll_None },
681     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
682     { RID_SetSrc0LumaKey   , LumaKey_False                           , Kdll_None },
683     { RID_SetParserState   , Parser_RotateLayer0Check                , Kdll_None },
684 
685     // Src0 Sampling is complete -> ConstBlend + colorfill
686     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
687     { RID_IsParserState    , Parser_SampleLayer0ColorFill            , Kdll_None },
688     { RID_IsSrc0Processing , Process_CBlend                          , Kdll_None },
689     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
690     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16_ConstBlend  , Kdll_None },
691     { RID_SetSrc0Processing, Process_None                            , Kdll_None },
692     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
693     { RID_SetParserState   , Parser_RotateLayer0Check                , Kdll_None },
694 
695     // Src0 Sampling is complete -> ConstSrcBlend + Luma key + colorfill
696     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                            , Kdll_None },
697     { RID_IsParserState    , Parser_SampleLayer0ColorFill                , Kdll_None },
698     { RID_IsSrc0Processing , Process_CSBlend                             , Kdll_None },
699     { RID_IsSrc0ColorFill  , ColorFill_True                              , Kdll_None },
700     { RID_IsSrc0LumaKey    , LumaKey_True                                , Kdll_None },
701     { RID_SetKernel        , IDR_VP_Compute_Lumakey_Buf0123              , Kdll_None },
702     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16_ConstSrcBlend   , Kdll_None },
703     { RID_SetSrc0Processing, Process_None                                , Kdll_None },
704     { RID_SetSrc0ColorFill , ColorFill_False                             , Kdll_None },
705     { RID_SetSrc0LumaKey   , LumaKey_False                               , Kdll_None },
706     { RID_SetParserState   , Parser_RotateLayer0Check                    , Kdll_None },
707 
708     // Src0 Sampling is complete -> ConstSrcBlend + colorfill
709     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                            , Kdll_None },
710     { RID_IsParserState    , Parser_SampleLayer0ColorFill                , Kdll_None },
711     { RID_IsSrc0Processing , Process_CSBlend                             , Kdll_None },
712     { RID_IsSrc0ColorFill  , ColorFill_True                              , Kdll_None },
713     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16_ConstSrcBlend   , Kdll_None },
714     { RID_SetSrc0Processing, Process_None                                , Kdll_None },
715     { RID_SetSrc0ColorFill , ColorFill_False                             , Kdll_None },
716     { RID_SetParserState   , Parser_RotateLayer0Check                    , Kdll_None },
717 
718     // Src0 Sampling is complete -> PartBlend + Luma key + colorfill
719     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
720     { RID_IsParserState    , Parser_SampleLayer0ColorFill            , Kdll_None },
721     { RID_IsSrc0Processing , Process_PBlend                          , Kdll_None },
722     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
723     { RID_IsSrc0LumaKey    , LumaKey_True                            , Kdll_None },
724     { RID_SetKernel        , IDR_VP_Compute_Lumakey_Buf0123          , Kdll_None },
725     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16_PartBlend   , Kdll_None },
726     { RID_SetSrc0Processing, Process_None                            , Kdll_None },
727     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
728     { RID_SetSrc0LumaKey   , LumaKey_False                           , Kdll_None },
729     { RID_SetParserState   , Parser_RotateLayer0Check                , Kdll_None },
730 
731     // Src0 Sampling is complete -> PartBlend + colorfill
732     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                        , Kdll_None },
733     { RID_IsParserState    , Parser_SampleLayer0ColorFill            , Kdll_None },
734     { RID_IsSrc0Processing , Process_PBlend                          , Kdll_None },
735     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
736     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16_PartBlend   , Kdll_None },
737     { RID_SetSrc0Processing, Process_None                            , Kdll_None },
738     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
739     { RID_SetParserState   , Parser_RotateLayer0Check                , Kdll_None },
740 
741     // Src0 Sampling is complete, no AVS or already shuffled -> Luma key + colorfill
742     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
743     { RID_IsParserState    , Parser_SampleLayer0ColorFill        , Kdll_None },
744     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
745     { RID_IsSrc0LumaKey    , LumaKey_True                        , Kdll_None },
746     { RID_SetKernel        , IDR_VP_Compute_Lumakey_Buf0123      , Kdll_None },
747     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16         , Kdll_None },
748     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
749     { RID_SetSrc0LumaKey   , LumaKey_False                       , Kdll_None },
750     { RID_SetParserState   , Parser_RotateLayer0Check            , Kdll_None },
751 
752     // Src0 Sampling is complete, no AVS or already shuffled -> colorfill
753     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
754     { RID_IsParserState    , Parser_SampleLayer0ColorFill        , Kdll_None },
755     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
756     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16         , Kdll_None },
757     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
758     { RID_SetParserState   , Parser_RotateLayer0Check            , Kdll_None },
759 
760     // Src0 Sampling is complete -> no Luma key or colorfill
761     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
762     { RID_IsParserState    , Parser_SampleLayer0ColorFill        , Kdll_None },
763     { RID_SetParserState   , Parser_RotateLayer0Check            , Kdll_None },
764 
765     // PreComp Layer 0 Rotation Check
766     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
767     { RID_IsParserState    , Parser_RotateLayer0Check            , Kdll_None },
768     { RID_IsRTRotate       , true                                , Kdll_None },
769     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
770 
771     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
772     { RID_IsParserState    , Parser_RotateLayer0Check            , Kdll_None },
773     { RID_IsRTRotate       , false                               , Kdll_None },
774     { RID_SetParserState   , Parser_RotateLayer0                 , Kdll_None },
775 
776     // Src0 PreComp Rotation
777 
778     // Rotate 0
779     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
780     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
781     { RID_IsSrc0Rotation   , VPHAL_ROTATION_IDENTITY             , Kdll_None },
782     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
783 
784     // Rotate 90: (Format_PL2 | Format_400P | Format_RGB | Format_AYUV | Format_PA) -> Src0
785     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
786     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
787     { RID_IsSrc0Format     , Format_PL2                          , Kdll_Or   },
788     { RID_IsSrc0Format     , Format_400P                         , Kdll_Or   },
789     { RID_IsSrc0Format     , Format_RGB                          , Kdll_Or   },
790     { RID_IsSrc0Format     , Format_AYUV                         , Kdll_Or   },
791     { RID_IsSrc0Format     , Format_PA                           , Kdll_None },
792     { RID_IsSrc0Rotation   , VPHAL_ROTATION_90                   , Kdll_None },
793     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate_L0_90        , Kdll_None },
794     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
795 
796     // Rotate 180: (Format_PL2 | Format_400P | Format_RGB | Format_AYUV | Format_PA) -> Src0
797     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
798     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
799     { RID_IsSrc0Format     , Format_PL2                          , Kdll_Or   },
800     { RID_IsSrc0Format     , Format_400P                         , Kdll_Or   },
801     { RID_IsSrc0Format     , Format_RGB                          , Kdll_Or   },
802     { RID_IsSrc0Format     , Format_AYUV                         , Kdll_Or   },
803     { RID_IsSrc0Format     , Format_PA                           , Kdll_None },
804     { RID_IsSrc0Rotation   , VPHAL_ROTATION_180                  , Kdll_None },
805     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate_L0_180       , Kdll_None },
806     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
807 
808     // Rotate 270: (Format_PL2 | Format_400P | Format_RGB | Format_AYUV | Format_PA) -> Src0
809     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
810     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
811     { RID_IsSrc0Format     , Format_PL2                          , Kdll_Or   },
812     { RID_IsSrc0Format     , Format_400P                         , Kdll_Or   },
813     { RID_IsSrc0Format     , Format_RGB                          , Kdll_Or   },
814     { RID_IsSrc0Format     , Format_AYUV                         , Kdll_Or   },
815     { RID_IsSrc0Format     , Format_PA                           , Kdll_None },
816     { RID_IsSrc0Rotation   , VPHAL_ROTATION_270                  , Kdll_None },
817     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate_L0_270       , Kdll_None },
818     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
819 
820     // Mirror Horizontal: (Format_PL2 | Format_400P | Format_RGB | Format_AYUV | Format_PA) -> Src0
821     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
822     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
823     { RID_IsSrc0Format     , Format_PL2                          , Kdll_Or   },
824     { RID_IsSrc0Format     , Format_400P                         , Kdll_Or   },
825     { RID_IsSrc0Format     , Format_RGB                          , Kdll_Or   },
826     { RID_IsSrc0Format     , Format_AYUV                         , Kdll_Or   },
827     { RID_IsSrc0Format     , Format_PA                           , Kdll_None },
828     { RID_IsSrc0Rotation   , VPHAL_MIRROR_HORIZONTAL             , Kdll_None },
829     { RID_SetKernel        , IDR_VP_PA_Scale_Mirror_H_L0         , Kdll_None },
830     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
831 
832     // Mirror Vertical: (Format_PL2 | Format_400P | Format_RGB | Format_AYUV | Format_PA) -> Src0
833     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
834     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
835     { RID_IsSrc0Format     , Format_PL2                          , Kdll_Or   },
836     { RID_IsSrc0Format     , Format_400P                         , Kdll_Or   },
837     { RID_IsSrc0Format     , Format_RGB                          , Kdll_Or   },
838     { RID_IsSrc0Format     , Format_AYUV                         , Kdll_Or   },
839     { RID_IsSrc0Format     , Format_PA                           , Kdll_None },
840     { RID_IsSrc0Rotation   , VPHAL_MIRROR_VERTICAL               , Kdll_None },
841     { RID_SetKernel        , IDR_VP_PA_Scale_Mirror_V_L0         , Kdll_None },
842     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
843 
844     // Rotate 90 Mirror Vertical: (Format_PL2 | Format_400P | Format_RGB | Format_AYUV | Format_PA) -> Src0
845     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
846     { RID_IsParserState    , Parser_RotateLayer0                     , Kdll_None },
847     { RID_IsSrc0Format     , Format_PL2                              , Kdll_Or   },
848     { RID_IsSrc0Format     , Format_400P                             , Kdll_Or   },
849     { RID_IsSrc0Format     , Format_RGB                              , Kdll_Or   },
850     { RID_IsSrc0Format     , Format_AYUV                             , Kdll_Or   },
851     { RID_IsSrc0Format     , Format_PA                               , Kdll_None },
852     { RID_IsSrc0Rotation   , VPHAL_ROTATE_90_MIRROR_VERTICAL         , Kdll_None },
853     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate90_Mirror_V_L0    , Kdll_None },
854     { RID_SetParserState   , Parser_SampleLayer0Done                 , Kdll_None },
855 
856     // Rotate 90 Mirror Horizontal: (Format_PL2 | Format_400P | Format_RGB | Format_AYUV | Format_PA) -> Src0
857     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
858     { RID_IsParserState    , Parser_RotateLayer0                     , Kdll_None },
859     { RID_IsSrc0Format     , Format_PL2                              , Kdll_Or   },
860     { RID_IsSrc0Format     , Format_400P                             , Kdll_Or   },
861     { RID_IsSrc0Format     , Format_RGB                              , Kdll_Or   },
862     { RID_IsSrc0Format     , Format_AYUV                             , Kdll_Or   },
863     { RID_IsSrc0Format     , Format_PA                               , Kdll_None },
864     { RID_IsSrc0Rotation   , VPHAL_ROTATE_90_MIRROR_HORIZONTAL       , Kdll_None },
865     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate90_Mirror_H_L0    , Kdll_None },
866     { RID_SetParserState   , Parser_SampleLayer0Done                 , Kdll_None },
867 
868     // Rotate 90: (Format_PL3 | Format_PL3_RGB) -> Src0
869     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
870     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
871     { RID_IsSrc0Format     , Format_PL3                          , Kdll_Or   },
872     { RID_IsSrc0Format     , Format_PL3_RGB                      , Kdll_None },
873     { RID_IsSrc0Rotation   , VPHAL_ROTATION_90                   , Kdll_None },
874     { RID_SetKernel        , IDR_VP_PL3_Scale_Rotate_L0_90       , Kdll_None },
875     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
876 
877     // Rotate 180: (Format_PL3 | Format_PL3_RGB) -> Src0
878     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
879     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
880     { RID_IsSrc0Format     , Format_PL3                          , Kdll_Or   },
881     { RID_IsSrc0Format     , Format_PL3_RGB                      , Kdll_None },
882     { RID_IsSrc0Rotation   , VPHAL_ROTATION_180                  , Kdll_None },
883     { RID_SetKernel        , IDR_VP_PL3_Scale_Rotate_L0_180      , Kdll_None },
884     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
885 
886     // Rotate 270: (Format_PL3 | Format_PL3_RGB) -> Src0
887     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
888     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
889     { RID_IsSrc0Format     , Format_PL3                          , Kdll_Or   },
890     { RID_IsSrc0Format     , Format_PL3_RGB                      , Kdll_None },
891     { RID_IsSrc0Rotation   , VPHAL_ROTATION_270                  , Kdll_None },
892     { RID_SetKernel        , IDR_VP_PL3_Scale_Rotate_L0_270      , Kdll_None },
893     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
894 
895     // There are no Kernels for PL3 mirroring
896 
897     // When there are multiple data formats inside the kernel depending on PL2, PA, AVS, scale
898     // Driver is loading the PL2 via AVS sampler then converting internal format to scale before the composition by shuffling.
899     // After this operation, the internal data format in the kernel changes and it is no long PL2 scale format but PA format
900     // PA_Scale_Rotate kernels should be called in this case
901     // Rotate 90: Format_PL2_UnAligned -> Src0
902     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
903     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
904     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_None },
905     { RID_IsSrc0Rotation   , VPHAL_ROTATION_90                   , Kdll_None },
906     { RID_IsShuffling      , Shuffle_All_8x8_Layer               , Kdll_None },
907     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate_L0_90        , Kdll_None },
908     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
909 
910     // Rotate 180: Format_PL2_UnAligned -> Src0
911     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
912     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
913     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_None },
914     { RID_IsSrc0Rotation   , VPHAL_ROTATION_180                  , Kdll_None },
915     { RID_IsShuffling      , Shuffle_All_8x8_Layer               , Kdll_None },
916     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate_L0_180       , Kdll_None },
917     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
918 
919     // Rotate 270: Format_PL2_UnAligned -> Src0
920     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
921     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
922     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_None },
923     { RID_IsSrc0Rotation   , VPHAL_ROTATION_270                  , Kdll_None },
924     { RID_IsShuffling      , Shuffle_All_8x8_Layer               , Kdll_None },
925     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate_L0_270       , Kdll_None },
926     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
927 
928     // Mirror Horizontal: Format_PL2_UnAligned -> Src0
929     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
930     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
931     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_None },
932     { RID_IsSrc0Rotation   , VPHAL_MIRROR_HORIZONTAL             , Kdll_None },
933     { RID_IsShuffling      , Shuffle_All_8x8_Layer               , Kdll_None },
934     { RID_SetKernel        , IDR_VP_PA_Scale_Mirror_H_L0         , Kdll_None },
935     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
936 
937     // Mirror Vertical: Format_PL2_UnAligned -> Src0
938     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
939     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
940     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_None },
941     { RID_IsSrc0Rotation   , VPHAL_MIRROR_VERTICAL               , Kdll_None },
942     { RID_IsShuffling      , Shuffle_All_8x8_Layer               , Kdll_None },
943     { RID_SetKernel        , IDR_VP_PA_Scale_Mirror_V_L0         , Kdll_None },
944     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
945 
946     // Rotate 90 Mirror Vertical: Format_PL2_UnAligned -> Src0
947     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
948     { RID_IsParserState    , Parser_RotateLayer0                     , Kdll_None },
949     { RID_IsSrc0Format     , Format_PL2_UnAligned                    , Kdll_None },
950     { RID_IsSrc0Rotation   , VPHAL_ROTATE_90_MIRROR_VERTICAL         , Kdll_None },
951     { RID_IsShuffling      , Shuffle_All_8x8_Layer                   , Kdll_None },
952     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate90_Mirror_V_L0    , Kdll_None },
953     { RID_SetParserState   , Parser_SampleLayer0Done                 , Kdll_None },
954 
955     // Rotate 90 Mirror Horizontal: Format_PL2_UnAligned -> Src0
956     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
957     { RID_IsParserState    , Parser_RotateLayer0                     , Kdll_None },
958     { RID_IsSrc0Format     , Format_PL2_UnAligned                    , Kdll_None },
959     { RID_IsSrc0Rotation   , VPHAL_ROTATE_90_MIRROR_HORIZONTAL       , Kdll_None },
960     { RID_IsShuffling      , Shuffle_All_8x8_Layer                   , Kdll_None },
961     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate90_Mirror_H_L0    , Kdll_None },
962     { RID_SetParserState   , Parser_SampleLayer0Done                 , Kdll_None },
963 
964     // Rotate 90: Format_PL2_UnAligned, Format_P010, Format_P016 -> Src0
965     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
966     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
967     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_Or   },
968     { RID_IsSrc0Format     , Format_P010                         , Kdll_Or   },
969     { RID_IsSrc0Format     , Format_P016                         , Kdll_None },
970     { RID_IsSrc0Rotation   , VPHAL_ROTATION_90                   , Kdll_None },
971     { RID_SetKernel        , IDR_VP_PL2_Scale_Rotate_L0_90       , Kdll_None },
972     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
973 
974     // Rotate 180: Format_PL2_UnAligned, Format_P010, Format_P016 -> Src0
975     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
976     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
977     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_Or   },
978     { RID_IsSrc0Format     , Format_P010                         , Kdll_Or   },
979     { RID_IsSrc0Format     , Format_P016                         , Kdll_None },
980     { RID_IsSrc0Rotation   , VPHAL_ROTATION_180                  , Kdll_None },
981     { RID_SetKernel        , IDR_VP_PL2_Scale_Rotate_L0_180      , Kdll_None },
982     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
983 
984     // Rotate 270: Format_PL2_UnAligned, Format_P010, Format_P016 -> Src0
985     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
986     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
987     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_Or   },
988     { RID_IsSrc0Format     , Format_P010                         , Kdll_Or   },
989     { RID_IsSrc0Format     , Format_P016                         , Kdll_None },
990     { RID_IsSrc0Rotation   , VPHAL_ROTATION_270                  , Kdll_None },
991     { RID_SetKernel        , IDR_VP_PL2_Scale_Rotate_L0_270      , Kdll_None },
992     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
993 
994     // Mirror Horizontal: Format_PL2_UnAligned, Format_P010, Format_P016 -> Src0
995     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
996     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
997     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_Or   },
998     { RID_IsSrc0Format     , Format_P010                         , Kdll_Or   },
999     { RID_IsSrc0Format     , Format_P016                         , Kdll_None },
1000     { RID_IsSrc0Rotation   , VPHAL_MIRROR_HORIZONTAL             , Kdll_None },
1001     { RID_SetKernel        , IDR_VP_PL2_Scale_Mirror_H_L0        , Kdll_None },
1002     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
1003 
1004     // Mirror Vertical: Format_PL2_UnAligned, Format_P010, Format_P016 -> Src0
1005     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1006     { RID_IsParserState    , Parser_RotateLayer0                 , Kdll_None },
1007     { RID_IsSrc0Format     , Format_PL2_UnAligned                , Kdll_Or   },
1008     { RID_IsSrc0Format     , Format_P010                         , Kdll_Or   },
1009     { RID_IsSrc0Format     , Format_P016                         , Kdll_None },
1010     { RID_IsSrc0Rotation   , VPHAL_MIRROR_VERTICAL               , Kdll_None },
1011     { RID_SetKernel        , IDR_VP_PL2_Scale_Mirror_V_L0        , Kdll_None },
1012     { RID_SetParserState   , Parser_SampleLayer0Done             , Kdll_None },
1013 
1014     // Rotate 90 Mirror Vertical: Format_PL2_UnAligned, Format_P010, Format_P016 -> Src0
1015     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1016     { RID_IsParserState    , Parser_RotateLayer0                     , Kdll_None },
1017     { RID_IsSrc0Format     , Format_PL2_UnAligned                    , Kdll_Or   },
1018     { RID_IsSrc0Format     , Format_P010                             , Kdll_Or   },
1019     { RID_IsSrc0Format     , Format_P016                             , Kdll_None },
1020     { RID_IsSrc0Rotation   , VPHAL_ROTATE_90_MIRROR_VERTICAL         , Kdll_None },
1021     { RID_SetKernel        , IDR_VP_PL2_Scale_Rotate90_Mirror_V_L0   , Kdll_None },
1022     { RID_SetParserState   , Parser_SampleLayer0Done                 , Kdll_None },
1023 
1024     // Rotate 90 Mirror Horizontal: Format_PL2_UnAligned, Format_P010, Format_P016 -> Src0
1025     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1026     { RID_IsParserState    , Parser_RotateLayer0                     , Kdll_None },
1027     { RID_IsSrc0Format     , Format_PL2_UnAligned                    , Kdll_Or   },
1028     { RID_IsSrc0Format     , Format_P010                             , Kdll_Or   },
1029     { RID_IsSrc0Format     , Format_P016                             , Kdll_None },
1030     { RID_IsSrc0Rotation   , VPHAL_ROTATE_90_MIRROR_HORIZONTAL       , Kdll_None },
1031     { RID_SetKernel        , IDR_VP_PL2_Scale_Rotate90_Mirror_H_L0   , Kdll_None },
1032     { RID_SetParserState   , Parser_SampleLayer0Done                 , Kdll_None },
1033 
1034     // Sample Layer 0 Done
1035     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1036     { RID_IsParserState    , Parser_SampleLayer0Done             , Kdll_None },
1037     { RID_SetSrc0Sampling  , Sample_None                         , Kdll_None },
1038     { RID_SetSrc0Format    , Format_None                         , Kdll_None },
1039     { RID_SetParserState   , Parser_SampleLayer1                 , Kdll_None },
1040 
1041     // Sample Layer 1
1042 
1043     // Sampling for layer0 is not complete, go back
1044     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1045     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1046     { RID_IsSrc0Sampling   , Sample_Any                          , Kdll_None },
1047     { RID_SetParserState   , Parser_SampleLayer0                 , Kdll_None },
1048 
1049     // Sampling is complete for both layers, perform CSC
1050     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1051     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1052     { RID_IsSrc0Sampling   , Sample_None                         , Kdll_None },
1053     { RID_IsSrc1Sampling   , Sample_None                         , Kdll_None },
1054     { RID_SetParserState   , Parser_SetupCSC1                    , Kdll_None },
1055 
1056     // Sample (P010 | P016) -> Src1
1057     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1058     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1059     { RID_IsSrc1Format     , Format_P010                         , Kdll_Or   },
1060     { RID_IsSrc1Format     , Format_P016                         , Kdll_None },
1061     { RID_IsSrc1Sampling   , Sample_Scaling                      , Kdll_None },
1062     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_4        , Kdll_None },
1063     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_5        , Kdll_None },
1064     { RID_SetParserState   , Parser_SetupCSC1                    , Kdll_None },
1065 
1066     // Sample (RGB | AYUV | Packed YUV | NV12 | 400P) -> Src1
1067     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1068     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1069     { RID_IsSrc1Format     , Format_RGB                          , Kdll_Or   },
1070     { RID_IsSrc1Format     , Format_AYUV                         , Kdll_Or   },
1071     { RID_IsSrc1Format     , Format_PA                           , Kdll_Or   },
1072     { RID_IsSrc1Format     , Format_PL2                          , Kdll_Or   },
1073     { RID_IsSrc1Format     , Format_400P                         , Kdll_None },
1074     { RID_IsSrc1Sampling   , Sample_Scaling                      , Kdll_None },
1075     { RID_SetKernel        , IDR_VP_PA_444Scale16_Buf_4          , Kdll_None },
1076     { RID_SetKernel        , IDR_VP_PA_444Scale16_Buf_5          , Kdll_None },
1077     { RID_SetParserState   , Parser_SampleLayer1Done             , Kdll_None },
1078 
1079     // Sample NV12(width or height is not a multiple of 4) -> Src1
1080     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1081     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1082     { RID_IsSrc1Format     , Format_PL2_UnAligned                , Kdll_None },
1083     { RID_IsSrc1Sampling   , Sample_Scaling                      , Kdll_None },
1084     { RID_SetKernel        , IDR_VP_PL2_444Scale16_Buf_4         , Kdll_None },
1085     { RID_SetKernel        , IDR_VP_PL2_444Scale16_Buf_5         , Kdll_None },
1086     { RID_SetParserState   , Parser_SampleLayer1Done             , Kdll_None },
1087 
1088     // Sample (PL3 | PL3_RGB) -> Src1
1089     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1090     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1091     { RID_IsSrc1Format     , Format_PL3                          , Kdll_Or   },
1092     { RID_IsSrc1Format     , Format_PL3_RGB                      , Kdll_None },
1093     { RID_IsSrc1Sampling   , Sample_Scaling                      , Kdll_None },
1094     { RID_SetKernel        , IDR_VP_PL3_444Scale16_Buf_4         , Kdll_None },
1095     { RID_SetKernel        , IDR_VP_PL3_444Scale16_Buf_5         , Kdll_None },
1096     { RID_SetParserState   , Parser_SampleLayer1Done             , Kdll_None },
1097 
1098     // Sample 0.34x (P010 | P016) -> Src1
1099     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1100     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1101     { RID_IsSrc1Format     , Format_P010                         , Kdll_Or   },
1102     { RID_IsSrc1Format     , Format_P016                         , Kdll_None },
1103     { RID_IsSrc1Sampling   , Sample_Scaling_034x                 , Kdll_None },
1104     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_4        , Kdll_None },
1105     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_5        , Kdll_None },
1106     { RID_SetParserState   , Parser_SetupCSC1                    , Kdll_None },
1107 
1108     // Sample 0.34x (RGB | AYUV | Packed YUV | NV12 | 400P) -> Src1
1109     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1110     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1111     { RID_IsSrc1Format     , Format_RGB                          , Kdll_Or   },
1112     { RID_IsSrc1Format     , Format_AYUV                         , Kdll_Or   },
1113     { RID_IsSrc1Format     , Format_PA                           , Kdll_Or   },
1114     { RID_IsSrc1Format     , Format_PL2                          , Kdll_Or   },
1115     { RID_IsSrc1Format     , Format_400P                         , Kdll_None },
1116     { RID_IsSrc1Sampling   , Sample_Scaling_034x                 , Kdll_None },
1117     { RID_SetKernel        , IDR_VP_PA_444DScale16_Buf_4         , Kdll_None },
1118     { RID_SetKernel        , IDR_VP_PA_444DScale16_Buf_5         , Kdll_None },
1119     { RID_SetParserState   , Parser_SampleLayer1Done             , Kdll_None },
1120 
1121     // Sample 0.34x PL2(width or height is not a multiple of 4) -> Src1
1122     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1123     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1124     { RID_IsSrc1Format     , Format_PL2_UnAligned                , Kdll_None },
1125     { RID_IsSrc1Sampling   , Sample_Scaling_034x                 , Kdll_None },
1126     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_4        , Kdll_None },
1127     { RID_SetKernel        , IDR_VP_PL2_444DScale16_Buf_5        , Kdll_None },
1128     { RID_SetParserState   , Parser_SampleLayer1Done             , Kdll_None },
1129 
1130     // Sample 0.34x (PL3 | PL3_RGB) -> Src1
1131     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1132     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1133     { RID_IsSrc1Format     , Format_PL3                          , Kdll_Or   },
1134     { RID_IsSrc1Format     , Format_PL3_RGB                      , Kdll_None },
1135     { RID_IsSrc1Sampling   , Sample_Scaling_034x                 , Kdll_None },
1136     { RID_SetKernel        , IDR_VP_PL3_444DScale16_Buf_4        , Kdll_None },
1137     { RID_SetKernel        , IDR_VP_PL3_444DScale16_Buf_5        , Kdll_None },
1138     { RID_SetParserState   , Parser_SampleLayer1Done             , Kdll_None },
1139 
1140     // AVS Sample (RGB | AYUV | Packed YUV | NV12 | 400P) -> Src1
1141     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1142     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1143     { RID_IsSrc1Format     , Format_RGB                          , Kdll_Or   },
1144     { RID_IsSrc1Format     , Format_AYUV                         , Kdll_Or   },
1145     { RID_IsSrc1Format     , Format_PA                           , Kdll_Or   },
1146     { RID_IsSrc1Format     , Format_PL2                          , Kdll_Or   },
1147     { RID_IsSrc1Format     , Format_400P                         , Kdll_None },
1148     { RID_IsSrc1Sampling   , Sample_Scaling_AVS                  , Kdll_None },
1149     { RID_SetKernel        , IDR_VP_PA_444AVS16_Buf_4            , Kdll_None },
1150     { RID_SetKernel        , IDR_VP_PA_444AVS16_Buf_5            , Kdll_None },
1151     { RID_SetParserState   , Parser_SampleLayer1Done             , Kdll_None },
1152 
1153     // AVS Sample PL2(width or height is not a multiple of 4) -> Src1
1154     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1155     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1156     { RID_IsSrc1Format     , Format_PL2_UnAligned                , Kdll_None },
1157     { RID_IsSrc1Sampling   , Sample_Scaling_AVS                  , Kdll_None },
1158     { RID_SetKernel        , IDR_VP_PL2_444AVS16_Buf_4           , Kdll_None },
1159     { RID_SetKernel        , IDR_VP_PL2_444AVS16_Buf_5           , Kdll_None },
1160     { RID_SetParserState   , Parser_SampleLayer1Done             , Kdll_None },
1161 
1162     // AVS Sample (PL3 | PL3_RGB) -> Src1
1163     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1164     { RID_IsParserState    , Parser_SampleLayer1                 , Kdll_None },
1165     { RID_IsSrc1Format     , Format_PL3                          , Kdll_Or   },
1166     { RID_IsSrc1Format     , Format_PL3_RGB                      , Kdll_None },
1167     { RID_IsSrc1Sampling   , Sample_Scaling_AVS                  , Kdll_None },
1168     { RID_SetKernel        , IDR_VP_PL3_444AVS16_Buf_4           , Kdll_None },
1169     { RID_SetKernel        , IDR_VP_PL3_444AVS16_Buf_5           , Kdll_None },
1170     { RID_SetParserState   , Parser_SampleLayer1Done             , Kdll_None },
1171 
1172     // Shuffle Layer 1
1173 
1174     // All layers use Sample_8x8
1175     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1176     { RID_IsParserState    , Parser_ShuffleLayer1                , Kdll_None },
1177     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
1178     { RID_SetParserState   , Parser_SetupCSC1                    , Kdll_None },
1179 
1180     // Mix of Sample_8x8 and normal sampling. Shuffle Sample_8x8 data
1181     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1182     { RID_IsParserState    , Parser_ShuffleLayer1                , Kdll_None },
1183     { RID_IsShuffling      , Shuffle_All_8x8_Layer               , Kdll_None },
1184     { RID_SetKernel        , IDR_VP_Shuffle_444AVS16_Buf_4       , Kdll_None },
1185     { RID_SetKernel        , IDR_VP_Shuffle_444AVS16_Buf_5       , Kdll_None },
1186     { RID_SetParserState   , Parser_SetupCSC1                    , Kdll_None },
1187 
1188     // Sample Layer 1 Done
1189 
1190     // Sample8x8
1191     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1192     { RID_IsParserState    , Parser_SampleLayer1Done             , Kdll_None },
1193     { RID_IsSrc1Sampling   , Sample_Scaling_AVS                  , Kdll_None },
1194     { RID_SetParserState   , Parser_ShuffleLayer1                , Kdll_None },
1195 
1196     // Non-Sample8x8
1197     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1198     { RID_IsParserState    , Parser_SampleLayer1Done             , Kdll_None },
1199     { RID_SetParserState   , Parser_SetupCSC1                    , Kdll_None },
1200 
1201     // Setup CSC coefficients for layer 0
1202 
1203     // CSC not present for Render Target
1204     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1205     { RID_IsParserState    , Parser_SetupCSC0                    , Kdll_None },
1206     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
1207     { RID_IsSrc0Coeff      , CoeffID_None                        , Kdll_None },
1208     { RID_SetParserState   , Parser_DualOutput                   , Kdll_None },
1209 
1210     // Coeff  0 (CSC+PA), Set Curbe CSC Coefficients
1211     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1212     { RID_IsParserState    , Parser_SetupCSC0                    , Kdll_None },
1213     { RID_IsSrc0Coeff      , CoeffID_0                           , Kdll_None },
1214     { RID_IsSetCoeffMode   , SetCSCCoeffMethod_Curbe             , Kdll_None },
1215     { RID_SetKernel        , IDR_VP_Set_CURBE_CSC_Coeff          , Kdll_None },
1216     { RID_SetParserState   , Parser_ExecuteCSC0                  , Kdll_None },
1217 
1218     // Coeff  0 (CSC+PA), Set Patch CSC Coefficients
1219     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1220     { RID_IsParserState    , Parser_SetupCSC0                    , Kdll_None },
1221     { RID_IsSrc0Coeff      , CoeffID_0                           , Kdll_None },
1222     { RID_IsSetCoeffMode   , SetCSCCoeffMethod_Patch             , Kdll_None },
1223     { RID_SetKernel        , IDR_VP_Set_Patched_CSC_Coeff        , Kdll_None },
1224     { RID_SetPatchData     , PatchKind_CSC_Coeff_Src0            , Kdll_None },      // Patch data source is CSC coeff for Src0
1225     { RID_SetPatch         , 6                                   , Kdll_None },      // 6 patches : Count (8), Src (8), Dest (16)
1226     { (Kdll_RuleID) 0x000c , 0x0400                              , Kdll_None },      //             04 00 000c
1227     { (Kdll_RuleID) 0x001c , 0x0404                              , Kdll_None },      //             04 04 001c
1228     { (Kdll_RuleID) 0x002c , 0x0408                              , Kdll_None },      //             04 08 002c
1229     { (Kdll_RuleID) 0x003c , 0x040C                              , Kdll_None },      //             04 0C 003c
1230     { (Kdll_RuleID) 0x004c , 0x0410                              , Kdll_None },      //             04 10 004c
1231     { (Kdll_RuleID) 0x005c , 0x0414                              , Kdll_None },      //             04 14 005c
1232     { RID_SetParserState   , Parser_ExecuteCSC0                  , Kdll_None },
1233 
1234     // Other Matrices ( cannot include PA)
1235     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1236     { RID_IsParserState    , Parser_SetupCSC0                    , Kdll_None },
1237     { RID_IsSrc0Coeff      , CoeffID_Any                         , Kdll_None },
1238     { RID_SetKernel        , IDR_VP_Set_Patched_CSC_Coeff        , Kdll_None },
1239     { RID_SetPatchData     , PatchKind_CSC_Coeff_Src0            , Kdll_None },      // Patch data source is CSC coeff for Src0
1240     { RID_SetPatch         , 6                                   , Kdll_None },      // 6 patches : Count (8), Src (8), Dest (16)
1241     { (Kdll_RuleID) 0x000c , 0x0400                              , Kdll_None },      //             04 00 000c
1242     { (Kdll_RuleID) 0x001c , 0x0404                              , Kdll_None },      //             04 04 001c
1243     { (Kdll_RuleID) 0x002c , 0x0408                              , Kdll_None },      //             04 08 002c
1244     { (Kdll_RuleID) 0x003c , 0x040C                              , Kdll_None },      //             04 0C 003c
1245     { (Kdll_RuleID) 0x004c , 0x0410                              , Kdll_None },      //             04 10 004c
1246     { (Kdll_RuleID) 0x005c , 0x0414                              , Kdll_None },      //             04 14 005c
1247     { RID_SetParserState   , Parser_ExecuteCSC0                  , Kdll_None },
1248 
1249     // Setup CSC coefficients for layer 1
1250 
1251     // No color space conversion for any layer
1252     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1253     { RID_IsParserState    , Parser_SetupCSC1                    , Kdll_None },
1254     { RID_IsSrc0Coeff      , CoeffID_None                        , Kdll_None },
1255     { RID_IsSrc1Coeff      , CoeffID_None                        , Kdll_None },
1256     { RID_SetParserState   , Parser_Lumakey                      , Kdll_None },
1257 
1258     // Layer 0 not yet converted -> setup/execute CSC for layer 0 and then resume Layer 1
1259     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1260     { RID_IsParserState    , Parser_SetupCSC1                    , Kdll_None },
1261     { RID_IsSrc0Coeff      , CoeffID_Any                         , Kdll_None },
1262     { RID_SetParserState   , Parser_SetupCSC0                    , Kdll_None },
1263 
1264     // Quadrant 2,3 - CSC coefficients already set
1265     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1266     { RID_IsParserState    , Parser_SetupCSC1                    , Kdll_None },
1267     { RID_IsQuadrant       , 2                                   , Kdll_None },
1268     { RID_SetParserState   , Parser_Lumakey                      , Kdll_None },
1269 
1270     // Coeff  0 (CSC+PA), Set Curbe CSC Coefficients
1271     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1272     { RID_IsParserState    , Parser_SetupCSC1                    , Kdll_None },
1273     { RID_IsSrc1Coeff      , CoeffID_0                           , Kdll_None },
1274     { RID_IsSetCoeffMode   , SetCSCCoeffMethod_Curbe             , Kdll_None },
1275     { RID_SetKernel        , IDR_VP_Set_CURBE_CSC_Coeff          , Kdll_None },
1276     { RID_SetParserState   , Parser_Lumakey                      , Kdll_None },
1277 
1278     // Coeff  0 (CSC+PA), Set Patch CSC Coefficients
1279     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1280     { RID_IsParserState    , Parser_SetupCSC1                    , Kdll_None },
1281     { RID_IsSrc0Coeff      , CoeffID_0                           , Kdll_None },
1282     { RID_IsSetCoeffMode   , SetCSCCoeffMethod_Patch             , Kdll_None },
1283     { RID_SetKernel        , IDR_VP_Set_Patched_CSC_Coeff        , Kdll_None },
1284     { RID_SetPatchData     , PatchKind_CSC_Coeff_Src1            , Kdll_None },      // Patch data source is CSC coeff for Src0
1285     { RID_SetPatch         , 6                                   , Kdll_None },      // 6 patches : Count (8), Src (8), Dest (16)
1286     { (Kdll_RuleID) 0x000c , 0x0400                              , Kdll_None },      //             04 00 000c
1287     { (Kdll_RuleID) 0x001c , 0x0404                              , Kdll_None },      //             04 04 001c
1288     { (Kdll_RuleID) 0x002c , 0x0408                              , Kdll_None },      //             04 08 002c
1289     { (Kdll_RuleID) 0x003c , 0x040C                              , Kdll_None },      //             04 0C 003c
1290     { (Kdll_RuleID) 0x004c , 0x0410                              , Kdll_None },      //             04 10 004c
1291     { (Kdll_RuleID) 0x005c , 0x0414                              , Kdll_None },      //             04 14 005c
1292     { RID_SetParserState   , Parser_Lumakey                      , Kdll_None },
1293 
1294     // Other Matrices (cannot include PA)
1295     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1296     { RID_IsParserState    , Parser_SetupCSC1                    , Kdll_None },
1297     { RID_IsSrc1Coeff      , CoeffID_Any                         , Kdll_None },
1298     { RID_SetKernel        , IDR_VP_Set_Patched_CSC_Coeff        , Kdll_None },
1299     { RID_SetPatchData     , PatchKind_CSC_Coeff_Src1            , Kdll_None },      // Patch data source is CSC coeff for Src1
1300     { RID_SetPatch         , 6                                   , Kdll_None },      // 6 patches : Count (8), Src (8), Dest (16)
1301     { (Kdll_RuleID) 0x000c , 0x0400                              , Kdll_None },      //             04 00 000c
1302     { (Kdll_RuleID) 0x001c , 0x0404                              , Kdll_None },      //             04 04 001c
1303     { (Kdll_RuleID) 0x002c , 0x0408                              , Kdll_None },      //             04 08 002c
1304     { (Kdll_RuleID) 0x003c , 0x040C                              , Kdll_None },      //             04 0C 003c
1305     { (Kdll_RuleID) 0x004c , 0x0410                              , Kdll_None },      //             04 10 004c
1306     { (Kdll_RuleID) 0x005c , 0x0414                              , Kdll_None },      //             04 14 005c
1307     { RID_SetParserState   , Parser_Lumakey                      , Kdll_None },
1308 
1309     // Lumakey
1310     // lumakey and CSC not needed for current layer.
1311     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1312     { RID_IsParserState    , Parser_Lumakey                      , Kdll_None },
1313     { RID_IsSrc1Coeff      , CoeffID_None                        , Kdll_None },
1314     { RID_IsSrc1LumaKey    , LumaKey_False                       , Kdll_None },
1315     { RID_SetParserState   , Parser_ProcessLayer                 , Kdll_None },
1316 
1317     // lumakey not needed, CSC needed
1318     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1319     { RID_IsParserState    , Parser_Lumakey                      , Kdll_None },
1320     { RID_IsSrc1LumaKey    , LumaKey_False                       , Kdll_None },
1321     { RID_IsSrc1Coeff      , CoeffID_Any                         , Kdll_None },
1322     { RID_SetParserState   , Parser_ExecuteCSC1                  , Kdll_None },
1323 
1324     // lumakey and CSC - both needed
1325     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1326     { RID_IsParserState    , Parser_Lumakey                      , Kdll_None },
1327     { RID_IsQuadrant       , 0                                   , Kdll_None },
1328     { RID_IsSrc1LumaKey    , LumaKey_True                        , Kdll_None },
1329     { RID_IsSrc1Coeff      , CoeffID_Any                         , Kdll_None },
1330     { RID_SetKernel        , IDR_VP_Set_Buf0_Buf4                , Kdll_None },
1331     { RID_SetKernel        , IDR_VP_Compute_Lumakey              , Kdll_None },
1332     { RID_SetKernel        , IDR_VP_Set_Buf1_Buf5                , Kdll_None },
1333     { RID_SetKernel        , IDR_VP_Compute_Lumakey              , Kdll_None },
1334     { RID_SetParserState   , Parser_ExecuteCSC1                  , Kdll_None },
1335 
1336     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1337     { RID_IsParserState    , Parser_Lumakey                      , Kdll_None },
1338     { RID_IsQuadrant       , 2                                   , Kdll_None },
1339     { RID_IsSrc1LumaKey    , LumaKey_True                        , Kdll_None },
1340     { RID_IsSrc1Coeff      , CoeffID_Any                         , Kdll_None },
1341     { RID_SetKernel        , IDR_VP_Set_Buf2_Buf4                , Kdll_None },
1342     { RID_SetKernel        , IDR_VP_Compute_Lumakey              , Kdll_None },
1343     { RID_SetKernel        , IDR_VP_Set_Buf3_Buf5                , Kdll_None },
1344     { RID_SetKernel        , IDR_VP_Compute_Lumakey              , Kdll_None },
1345     { RID_SetParserState   , Parser_ExecuteCSC1                  , Kdll_None },
1346 
1347     // Lumakey needed, CSC not needed
1348     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1349     { RID_IsParserState    , Parser_Lumakey                      , Kdll_None },
1350     { RID_IsQuadrant       , 0                                   , Kdll_None },
1351     { RID_IsSrc1LumaKey    , LumaKey_True                        , Kdll_None },
1352     { RID_IsSrc1Coeff      , CoeffID_None                        , Kdll_None },
1353     { RID_SetKernel        , IDR_VP_Set_Buf0_Buf4                , Kdll_None },
1354     { RID_SetKernel        , IDR_VP_Compute_Lumakey              , Kdll_None },
1355     { RID_SetKernel        , IDR_VP_Set_Buf1_Buf5                , Kdll_None },
1356     { RID_SetKernel        , IDR_VP_Compute_Lumakey              , Kdll_None },
1357     { RID_SetParserState   , Parser_ProcessLayer                 , Kdll_None },
1358 
1359     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1360     { RID_IsParserState    , Parser_Lumakey                      , Kdll_None },
1361     { RID_IsQuadrant       , 2                                   , Kdll_None },
1362     { RID_IsSrc1LumaKey    , LumaKey_True                        , Kdll_None },
1363     { RID_IsSrc1Coeff      , CoeffID_None                        , Kdll_None },
1364     { RID_SetKernel        , IDR_VP_Set_Buf2_Buf4                , Kdll_None },
1365     { RID_SetKernel        , IDR_VP_Compute_Lumakey              , Kdll_None },
1366     { RID_SetKernel        , IDR_VP_Set_Buf3_Buf5                , Kdll_None },
1367     { RID_SetKernel        , IDR_VP_Compute_Lumakey              , Kdll_None },
1368     { RID_SetParserState   , Parser_ProcessLayer                 , Kdll_None },
1369 
1370     // Perform CSC operation for layer 0
1371     // Src0 -> any to RGB, if Src0 is pre-multiplied content use CSC_Premultiplied
1372     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1373     { RID_IsParserState    , Parser_ExecuteCSC0                  , Kdll_None },
1374     { RID_IsSrc0Processing , Process_PBlend                      , Kdll_None },
1375     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf0             , Kdll_None },
1376     { RID_SetKernel        , IDR_VP_Call_CSC_Premultiplied       , Kdll_None },
1377     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf1             , Kdll_None },
1378     { RID_SetKernel        , IDR_VP_Call_CSC_Premultiplied       , Kdll_None },
1379     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf2             , Kdll_None },
1380     { RID_SetKernel        , IDR_VP_Call_CSC_Premultiplied       , Kdll_None },
1381     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf3             , Kdll_None },
1382     { RID_SetKernel        , IDR_VP_Call_CSC_Premultiplied       , Kdll_None },
1383     { RID_SetParserState   , Parser_ExecuteCSC0Done              , Kdll_None },
1384 
1385     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1386     { RID_IsParserState    , Parser_ExecuteCSC0                  , Kdll_None },
1387     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf0             , Kdll_None },
1388     { RID_SetKernel        , IDR_VP_Call_CSC                     , Kdll_None },
1389     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf1             , Kdll_None },
1390     { RID_SetKernel        , IDR_VP_Call_CSC                     , Kdll_None },
1391     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf2             , Kdll_None },
1392     { RID_SetKernel        , IDR_VP_Call_CSC                     , Kdll_None },
1393     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf3             , Kdll_None },
1394     { RID_SetKernel        , IDR_VP_Call_CSC                     , Kdll_None },
1395     { RID_SetParserState   , Parser_ExecuteCSC0Done              , Kdll_None },
1396 
1397     // CSC0 is complete
1398 
1399     // Check whether go back to intermix layer 0
1400     // Please not change the order of these two rules
1401     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1402     { RID_IsParserState    , Parser_ExecuteCSC0Done              , Kdll_None },
1403     { RID_IsSrc0Sampling   , Sample_iScaling                     , Kdll_None },
1404     { RID_SetSrc0Coeff     , CoeffID_None                        , Kdll_None },
1405     { RID_SetNextLayer     , -2                                  , Kdll_None }, // jump back to main layer
1406     { RID_SetParserState   , Parser_SampleLayer0Mix              , Kdll_None },
1407 
1408     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1409     { RID_IsParserState    , Parser_ExecuteCSC0Done              , Kdll_None },
1410     { RID_SetSrc0Coeff     , CoeffID_None                        , Kdll_None },
1411     { RID_SetParserState   , Parser_SetupCSC1                    , Kdll_None },
1412 
1413     // Perform CSC operation for layer 1
1414 
1415     // Src1 -> YUV to RGB, if Src1 is pre-multiplied content use CSC_Premultiplied
1416     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1417     { RID_IsParserState    , Parser_ExecuteCSC1                  , Kdll_None },
1418     { RID_IsSrc1Processing , Process_PBlend                      , Kdll_None },
1419     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf4             , Kdll_None },
1420     { RID_SetKernel        , IDR_VP_Call_CSC_Premultiplied       , Kdll_None },
1421     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf5             , Kdll_None },
1422     { RID_SetKernel        , IDR_VP_Call_CSC_Premultiplied       , Kdll_None },
1423     { RID_SetParserState   , Parser_ExecuteCSC1Done              , Kdll_None },
1424 
1425     // Src1 -> YUV to RGB
1426     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1427     { RID_IsParserState    , Parser_ExecuteCSC1                  , Kdll_None },
1428     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf4             , Kdll_None },
1429     { RID_SetKernel        , IDR_VP_Call_CSC                     , Kdll_None },
1430     { RID_SetKernel        , IDR_VP_Set_CSC_Src_Buf5             , Kdll_None },
1431     { RID_SetKernel        , IDR_VP_Call_CSC                     , Kdll_None },
1432     { RID_SetParserState   , Parser_ExecuteCSC1Done              , Kdll_None },
1433 
1434     // Layer 1 CSC is complete - prepare operation
1435     // Quadrants 0,1 CSC complete
1436     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1437     { RID_IsParserState    , Parser_ExecuteCSC1Done              , Kdll_None },
1438     { RID_IsQuadrant       , 0                                   , Kdll_None },
1439     { RID_SetParserState   , Parser_ProcessLayer                 , Kdll_None },
1440 
1441     // Quadrants 2,3 CSC complete
1442     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1443     { RID_IsParserState    , Parser_ExecuteCSC1Done              , Kdll_None },
1444     { RID_IsQuadrant       , 2                                   , Kdll_None },
1445     { RID_SetSrc1Coeff     , CoeffID_None                        , Kdll_None },
1446     { RID_SetParserState   , Parser_ProcessLayer                 , Kdll_None },
1447 
1448     // Process layer
1449 
1450     // Render target layer -> write output and finish
1451     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1452     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1453     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
1454     { RID_SetParserState   , Parser_DualOutput                   , Kdll_None },
1455 
1456     // Single layer -> skip processing - prepare CSC for Render Target
1457     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1458     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1459     { RID_IsSrc1Processing , Process_None                        , Kdll_None },
1460     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1461 
1462     // Compositing quadrants 0,1
1463     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1464     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1465     { RID_IsQuadrant       , 0                                   , Kdll_None },
1466     { RID_IsSrc1Processing , Process_Composite                   , Kdll_None },
1467     { RID_SetKernel        , IDR_VP_Set_Buf0_Buf4                , Kdll_None },
1468     { RID_SetKernel        , IDR_VP_Call_Composite               , Kdll_None },
1469     { RID_SetKernel        , IDR_VP_Set_Buf1_Buf5                , Kdll_None },
1470     { RID_SetKernel        , IDR_VP_Call_Composite               , Kdll_None },
1471     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1472 
1473     // Compositing quadrants 2,3
1474     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1475     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1476     { RID_IsQuadrant       , 2                                   , Kdll_None },
1477     { RID_IsSrc1Processing , Process_Composite                   , Kdll_None },
1478     { RID_SetKernel        , IDR_VP_Set_Buf2_Buf4                , Kdll_None },
1479     { RID_SetKernel        , IDR_VP_Call_Composite               , Kdll_None },
1480     { RID_SetKernel        , IDR_VP_Set_Buf3_Buf5                , Kdll_None },
1481     { RID_SetKernel        , IDR_VP_Call_Composite               , Kdll_None },
1482     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1483 
1484     // Constant Blending quadrants 0,1
1485     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1486     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1487     { RID_IsQuadrant       , 0                                   , Kdll_None },
1488     { RID_IsSrc1Processing , Process_CBlend                      , Kdll_None },
1489     { RID_SetKernel        , IDR_VP_Set_Buf0_Buf4                , Kdll_None },
1490     { RID_SetKernel        , IDR_VP_Call_ConstBlend              , Kdll_None },
1491     { RID_SetKernel        , IDR_VP_Set_Buf1_Buf5                , Kdll_None },
1492     { RID_SetKernel        , IDR_VP_Call_ConstBlend              , Kdll_None },
1493     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1494 
1495     // Constant Blending quadrants 2,3
1496     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1497     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1498     { RID_IsQuadrant       , 2                                   , Kdll_None },
1499     { RID_IsSrc1Processing , Process_CBlend                      , Kdll_None },
1500     { RID_SetKernel        , IDR_VP_Set_Buf2_Buf4                , Kdll_None },
1501     { RID_SetKernel        , IDR_VP_Call_ConstBlend              , Kdll_None },
1502     { RID_SetKernel        , IDR_VP_Set_Buf3_Buf5                , Kdll_None },
1503     { RID_SetKernel        , IDR_VP_Call_ConstBlend              , Kdll_None },
1504     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1505 
1506     // Source Blending quadrants 0,1
1507     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1508     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1509     { RID_IsQuadrant       , 0                                   , Kdll_None },
1510     { RID_IsSrc1Processing , Process_SBlend                      , Kdll_None },
1511     { RID_SetKernel        , IDR_VP_Set_Buf0_Buf4                , Kdll_None },
1512     { RID_SetKernel        , IDR_VP_Call_SrcBlend                , Kdll_None },
1513     { RID_SetKernel        , IDR_VP_Set_Buf1_Buf5                , Kdll_None },
1514     { RID_SetKernel        , IDR_VP_Call_SrcBlend                , Kdll_None },
1515     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1516 
1517     // Source Blending quadrants 2,3
1518     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1519     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1520     { RID_IsQuadrant       , 2                                   , Kdll_None },
1521     { RID_IsSrc1Processing , Process_SBlend                      , Kdll_None },
1522     { RID_SetKernel        , IDR_VP_Set_Buf2_Buf4                , Kdll_None },
1523     { RID_SetKernel        , IDR_VP_Call_SrcBlend                , Kdll_None },
1524     { RID_SetKernel        , IDR_VP_Set_Buf3_Buf5                , Kdll_None },
1525     { RID_SetKernel        , IDR_VP_Call_SrcBlend                , Kdll_None },
1526     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1527 
1528     // Source Blending (4-bits alpha) quadrants 0,1
1529     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1530     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1531     { RID_IsQuadrant       , 0                                   , Kdll_None },
1532     { RID_IsSrc1Processing , Process_SBlend_4bits                , Kdll_None },
1533     { RID_SetKernel        , IDR_VP_Set_Buf0_Buf4                , Kdll_None },
1534     { RID_SetKernel        , IDR_VP_Call_SrcBlend_4bits          , Kdll_None },
1535     { RID_SetKernel        , IDR_VP_Set_Buf1_Buf5                , Kdll_None },
1536     { RID_SetKernel        , IDR_VP_Call_SrcBlend_4bits          , Kdll_None },
1537     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1538 
1539     // Source Blending (4-bits alpha) quadrants 2,3
1540     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1541     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1542     { RID_IsQuadrant       , 2                                   , Kdll_None },
1543     { RID_IsSrc1Processing , Process_SBlend_4bits                , Kdll_None },
1544     { RID_SetKernel        , IDR_VP_Set_Buf2_Buf4                , Kdll_None },
1545     { RID_SetKernel        , IDR_VP_Call_SrcBlend_4bits          , Kdll_None },
1546     { RID_SetKernel        , IDR_VP_Set_Buf3_Buf5                , Kdll_None },
1547     { RID_SetKernel        , IDR_VP_Call_SrcBlend_4bits          , Kdll_None },
1548     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1549 
1550     // Partial Blending quadrants 0,1
1551     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1552     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1553     { RID_IsQuadrant       , 0                                   , Kdll_None },
1554     { RID_IsSrc1Processing , Process_PBlend                      , Kdll_None },
1555     { RID_SetKernel        , IDR_VP_Set_Buf0_Buf4                , Kdll_None },
1556     { RID_SetKernel        , IDR_VP_Call_PartBlend               , Kdll_None },
1557     { RID_SetKernel        , IDR_VP_Set_Buf1_Buf5                , Kdll_None },
1558     { RID_SetKernel        , IDR_VP_Call_PartBlend               , Kdll_None },
1559     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1560 
1561     // Partial Blending quadrants 2,3
1562     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1563     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1564     { RID_IsQuadrant       , 2                                   , Kdll_None },
1565     { RID_IsSrc1Processing , Process_PBlend                      , Kdll_None },
1566     { RID_SetKernel        , IDR_VP_Set_Buf2_Buf4                , Kdll_None },
1567     { RID_SetKernel        , IDR_VP_Call_PartBlend               , Kdll_None },
1568     { RID_SetKernel        , IDR_VP_Set_Buf3_Buf5                , Kdll_None },
1569     { RID_SetKernel        , IDR_VP_Call_PartBlend               , Kdll_None },
1570     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1571 
1572     // Constant multitply Sources Blending quadrants 0,1
1573     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1574     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1575     { RID_IsQuadrant       , 0                                   , Kdll_None },
1576     { RID_IsSrc1Processing , Process_CSBlend                     , Kdll_None },
1577     { RID_SetKernel        , IDR_VP_Set_Buf0_Buf4                , Kdll_None },
1578     { RID_SetKernel        , IDR_VP_Call_ConstSrcBlend           , Kdll_None },
1579     { RID_SetKernel        , IDR_VP_Set_Buf1_Buf5                , Kdll_None },
1580     { RID_SetKernel        , IDR_VP_Call_ConstSrcBlend           , Kdll_None },
1581     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1582 
1583     // Constant multiply Sources Blending quadrants 2,3
1584     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1585     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1586     { RID_IsQuadrant       , 2                                   , Kdll_None },
1587     { RID_IsSrc1Processing , Process_CSBlend                     , Kdll_None },
1588     { RID_SetKernel        , IDR_VP_Set_Buf2_Buf4                , Kdll_None },
1589     { RID_SetKernel        , IDR_VP_Call_ConstSrcBlend           , Kdll_None },
1590     { RID_SetKernel        , IDR_VP_Set_Buf3_Buf5                , Kdll_None },
1591     { RID_SetKernel        , IDR_VP_Call_ConstSrcBlend           , Kdll_None },
1592     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1593 
1594     // Constant multitply Partial Blending quadrants 0,1
1595     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1596     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1597     { RID_IsQuadrant       , 0                                   , Kdll_None },
1598     { RID_IsSrc1Processing , Process_CPBlend                     , Kdll_None },
1599     { RID_SetKernel        , IDR_VP_Set_Buf0_Buf4                , Kdll_None },
1600     { RID_SetKernel        , IDR_VP_Call_AlphaSrcBlendG          , Kdll_None },
1601     { RID_SetKernel        , IDR_VP_Set_Buf1_Buf5                , Kdll_None },
1602     { RID_SetKernel        , IDR_VP_Call_AlphaSrcBlendG          , Kdll_None },
1603     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1604 
1605     // Constant multiply Partial Blending quadrants 2,3
1606     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1607     { RID_IsParserState    , Parser_ProcessLayer                 , Kdll_None },
1608     { RID_IsQuadrant       , 2                                   , Kdll_None },
1609     { RID_IsSrc1Processing , Process_CPBlend                     , Kdll_None },
1610     { RID_SetKernel        , IDR_VP_Set_Buf2_Buf4                , Kdll_None },
1611     { RID_SetKernel        , IDR_VP_Call_AlphaSrcBlendG          , Kdll_None },
1612     { RID_SetKernel        , IDR_VP_Set_Buf3_Buf5                , Kdll_None },
1613     { RID_SetKernel        , IDR_VP_Call_AlphaSrcBlendG          , Kdll_None },
1614     { RID_SetParserState   , Parser_ProcessLayerDone             , Kdll_None },
1615 
1616     // Layer processing is complete
1617 
1618     // nothing to process - next layer
1619     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1620     { RID_IsParserState    , Parser_ProcessLayerDone             , Kdll_None },
1621     { RID_IsSrc1Processing , Process_None                        , Kdll_None },
1622     { RID_SetNextLayer     , 0                                   , Kdll_None },
1623     { RID_SetQuadrant      , 0                                   , Kdll_None },
1624     { RID_SetParserState   , Parser_SetupLayer1                  , Kdll_None },
1625 
1626     // Quadrants 0,1 are complete - sample/process quadrants 2,3
1627     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1628     { RID_IsParserState    , Parser_ProcessLayerDone             , Kdll_None },
1629     { RID_IsQuadrant       , 0                                   , Kdll_None },
1630     { RID_SetKernel        , IDR_VP_Set_Sec_Half_Buf45           , Kdll_None },
1631     { RID_SetQuadrant      , 2                                   , Kdll_None },
1632     { RID_SetParserState   , Parser_SampleLayer1                 , Kdll_None },
1633 
1634     // All quadrants are processed - start next layer
1635     { RID_Op_NewEntry      , RULE_NO_OVERRIDE                    , Kdll_None },
1636     { RID_IsParserState    , Parser_ProcessLayerDone             , Kdll_None },
1637     { RID_IsQuadrant       , 2                                   , Kdll_None },
1638     { RID_SetSrc1Sampling  , Sample_None                         , Kdll_None },
1639     { RID_SetSrc1Format    , Format_None                         , Kdll_None },
1640     { RID_SetSrc1Processing, Process_None                        , Kdll_None },
1641     { RID_SetNextLayer     , 0                                   , Kdll_None },
1642     { RID_SetQuadrant      , 0                                   , Kdll_None },
1643     { RID_SetParserState   , Parser_SetupLayer1                  , Kdll_None },
1644 
1645     // dual output mode, non-rotated NV12 is Primary
1646     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1647     { RID_IsParserState    , Parser_DualOutput                       , Kdll_None },
1648     { RID_IsShuffling      , Shuffle_RenderTarget                    , Kdll_None },
1649     { RID_IsDualOutput     , true                                    , Kdll_None },
1650     { RID_SetKernel        , IDR_VP_Set_Dest_Surf_Indexes_Primary    , Kdll_None },
1651     { RID_SetKernel        , IDR_VP_Save_444AVS16_NV12               , Kdll_None },
1652     { RID_SetParserState   , Parser_Rotation                         , Kdll_None },
1653 
1654     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1655     { RID_IsParserState    , Parser_DualOutput                       , Kdll_None },
1656     { RID_IsDualOutput     , true                                    , Kdll_None },
1657     { RID_SetKernel        , IDR_VP_Set_Dest_Surf_Indexes_Primary    , Kdll_None },
1658     { RID_SetKernel        , IDR_VP_Save_444Scale16_NV12             , Kdll_None },
1659     { RID_SetParserState   , Parser_Rotation                         , Kdll_None },
1660 
1661     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1662     { RID_IsParserState    , Parser_DualOutput                       , Kdll_None },
1663     { RID_SetParserState   , Parser_Rotation                         , Kdll_None },
1664 
1665     // PL2_Scale_Rotate/Mirroring cases. It requires to keep track of the first
1666     // layer (layer 0) format, because the post composition rotation kernel requires
1667     // to match the layer 0 input format.
1668     // For PL3 input, we will use PL2 kernels as PL3 may be replaced by PL2.
1669 
1670     // post composition rotation -> write output
1671     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1672     { RID_IsParserState    , Parser_Rotation                     , Kdll_None },
1673     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
1674     { RID_IsLayerRotation  , VPHAL_ROTATION_90                   , Kdll_None },
1675     { RID_SetKernel        , IDR_VP_PA_AVS_Rotate_L0_90          , Kdll_None },
1676     { RID_SetParserState   , Parser_DestSurfIndex                , Kdll_None },
1677 
1678     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1679     { RID_IsParserState    , Parser_Rotation                     , Kdll_None },
1680     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
1681     { RID_IsLayerRotation  , VPHAL_ROTATION_180                  , Kdll_None },
1682     { RID_SetKernel        , IDR_VP_PA_AVS_Rotate_L0_180         , Kdll_None },
1683     { RID_SetParserState   , Parser_DestSurfIndex                , Kdll_None },
1684 
1685     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1686     { RID_IsParserState    , Parser_Rotation                     , Kdll_None },
1687     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
1688     { RID_IsLayerRotation  , VPHAL_ROTATION_270                  , Kdll_None },
1689     { RID_SetKernel        , IDR_VP_PA_AVS_Rotate_L0_270         , Kdll_None },
1690     { RID_SetParserState   , Parser_DestSurfIndex                , Kdll_None },
1691 
1692     // Mirror
1693     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1694     { RID_IsParserState    , Parser_Rotation                     , Kdll_None },
1695     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
1696     { RID_IsLayerRotation  , VPHAL_MIRROR_HORIZONTAL             , Kdll_None },
1697     { RID_SetKernel        , IDR_VP_PA_AVS_Mirror_H_L0           , Kdll_None },
1698     { RID_SetParserState   , Parser_DestSurfIndex                , Kdll_None },
1699 
1700     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1701     { RID_IsParserState    , Parser_Rotation                     , Kdll_None },
1702     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
1703     { RID_IsLayerRotation  , VPHAL_MIRROR_VERTICAL               , Kdll_None },
1704     { RID_SetKernel        , IDR_VP_PA_AVS_Mirror_V_L0           , Kdll_None },
1705     { RID_SetParserState   , Parser_DestSurfIndex                , Kdll_None },
1706 
1707     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1708     { RID_IsParserState    , Parser_Rotation                         , Kdll_None },
1709     { RID_IsShuffling      , Shuffle_RenderTarget                    , Kdll_None },
1710     { RID_IsLayerRotation  , VPHAL_ROTATE_90_MIRROR_VERTICAL         , Kdll_None },
1711     { RID_SetKernel        , IDR_VP_PA_AVS_Rotate_90_Mirror_V_L0     , Kdll_None },
1712     { RID_SetParserState   , Parser_DestSurfIndex                    , Kdll_None },
1713 
1714     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1715     { RID_IsParserState    , Parser_Rotation                         , Kdll_None },
1716     { RID_IsShuffling      , Shuffle_RenderTarget                    , Kdll_None },
1717     { RID_IsLayerRotation  , VPHAL_ROTATE_90_MIRROR_HORIZONTAL       , Kdll_None },
1718     { RID_SetKernel        , IDR_VP_PA_AVS_Rotate_90_Mirror_H_L0     , Kdll_None },
1719     { RID_SetParserState   , Parser_DestSurfIndex                    , Kdll_None },
1720 
1721     // jump to write output if it's shuffle
1722     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1723     { RID_IsParserState    , Parser_Rotation                     , Kdll_None },
1724     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
1725     { RID_SetParserState   , Parser_DestSurfIndex                , Kdll_None },
1726 
1727     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1728     { RID_IsParserState    , Parser_Rotation                     , Kdll_None },
1729     { RID_IsLayerRotation  , VPHAL_ROTATION_90                   , Kdll_None },
1730     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate_L0_90        , Kdll_None },
1731     { RID_SetParserState   , Parser_DestSurfIndex                , Kdll_None },
1732 
1733     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1734     { RID_IsParserState    , Parser_Rotation                     , Kdll_None },
1735     { RID_IsLayerRotation  , VPHAL_ROTATION_180                  , Kdll_None },
1736     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate_L0_180       , Kdll_None },
1737     { RID_SetParserState   , Parser_DestSurfIndex                , Kdll_None },
1738 
1739     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1740     { RID_IsParserState    , Parser_Rotation                     , Kdll_None },
1741     { RID_IsLayerRotation  , VPHAL_ROTATION_270                  , Kdll_None },
1742     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate_L0_270       , Kdll_None },
1743     { RID_SetParserState   , Parser_DestSurfIndex                , Kdll_None },
1744 
1745     // Mirror
1746     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1747     { RID_IsParserState    , Parser_Rotation                     , Kdll_None },
1748     { RID_IsLayerRotation  , VPHAL_MIRROR_HORIZONTAL             , Kdll_None },
1749     { RID_SetKernel        , IDR_VP_PA_Scale_Mirror_H_L0         , Kdll_None },
1750     { RID_SetParserState   , Parser_DestSurfIndex                , Kdll_None },
1751 
1752     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1753     { RID_IsParserState    , Parser_Rotation                     , Kdll_None },
1754     { RID_IsLayerRotation  , VPHAL_MIRROR_VERTICAL               , Kdll_None },
1755     { RID_SetKernel        , IDR_VP_PA_Scale_Mirror_V_L0         , Kdll_None },
1756     { RID_SetParserState   , Parser_DestSurfIndex                , Kdll_None },
1757 
1758     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1759     { RID_IsParserState    , Parser_Rotation                         , Kdll_None },
1760     { RID_IsLayerRotation  , VPHAL_ROTATE_90_MIRROR_VERTICAL         , Kdll_None },
1761     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate90_Mirror_V_L0    , Kdll_None },
1762     { RID_SetParserState   , Parser_DestSurfIndex                    , Kdll_None },
1763 
1764     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1765     { RID_IsParserState    , Parser_Rotation                         , Kdll_None },
1766     { RID_IsLayerRotation  , VPHAL_ROTATE_90_MIRROR_HORIZONTAL       , Kdll_None },
1767     { RID_SetKernel        , IDR_VP_PA_Scale_Rotate90_Mirror_H_L0    , Kdll_None },
1768     { RID_SetParserState   , Parser_DestSurfIndex                    , Kdll_None },
1769 
1770     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1771     { RID_IsParserState    , Parser_Rotation                         , Kdll_None },
1772     { RID_SetParserState   , Parser_DestSurfIndex                    , Kdll_None },
1773 
1774     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1775     { RID_IsParserState    , Parser_DestSurfIndex                    , Kdll_None },
1776     { RID_IsDualOutput     , true                                    , Kdll_None },
1777     { RID_SetKernel        , IDR_VP_Set_Dest_Surf_Indexes_Secondary  , Kdll_None },
1778     { RID_SetParserState   , Parser_WriteOutput                      , Kdll_None },
1779 
1780     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1781     { RID_IsParserState    , Parser_DestSurfIndex                    , Kdll_None },
1782     { RID_IsLayerFormat    , Format_YUY2                             , Kdll_Or   },
1783     { RID_IsLayerFormat    , Format_YUYV                             , Kdll_Or   },
1784     { RID_IsLayerFormat    , Format_YVYU                             , Kdll_Or   },
1785     { RID_IsLayerFormat    , Format_UYVY                             , Kdll_Or   },
1786     { RID_IsLayerFormat    , Format_VYUY                             , Kdll_Or   },
1787     { RID_IsLayerFormat    , Format_NV21                             , Kdll_Or   },
1788     { RID_IsLayerFormat    , Format_PL2                              , Kdll_Or   },
1789     { RID_IsLayerFormat    , Format_R10G10B10A2                      , Kdll_Or   },
1790     { RID_IsLayerFormat    , Format_B10G10R10A2                      , Kdll_None },
1791     { RID_SetKernel        , IDR_VP_Set_Dest_Surf_Indexes_Primary    , Kdll_None },
1792     { RID_SetParserState   , Parser_WriteOutput                      , Kdll_None },
1793 
1794     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1795     { RID_IsParserState    , Parser_DestSurfIndex                    , Kdll_None },
1796     { RID_IsLayerFormat    , Format_PL2                              , Kdll_None },
1797     { RID_SetKernel        , IDR_VP_Set_Dest_Surf_Indexes_Primary    , Kdll_None },
1798     { RID_SetParserState   , Parser_WriteOutput                      , Kdll_None },
1799 
1800     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1801     { RID_IsParserState    , Parser_DestSurfIndex                    , Kdll_None },
1802     { RID_SetParserState   , Parser_WriteOutput                      , Kdll_None },
1803 
1804     // Write
1805 
1806     // Colorfill only write rulesets has to be before regular rulesets.
1807 
1808     // Write ARGB with 64B save kernel
1809     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1810     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
1811     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
1812     { RID_IsLayerFormat    , Format_A8R8G8B8                     , Kdll_Or   },
1813     { RID_IsLayerFormat    , Format_A8B8G8R8                     , Kdll_None },
1814     { RID_Is64BSaveEnabled , true                                , Kdll_None },
1815     { RID_IsLayerNumber    , 0                                   , Kdll_None },
1816     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
1817     { RID_SetKernel        , IDR_VP_Set_Scale_Buf_0123_Colorfill , Kdll_None },
1818     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16         , Kdll_None },
1819     { RID_SetKernel        , IDR_VP_Save_444Scale16_RGB_64Byte   , Kdll_None },
1820     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
1821     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
1822     { RID_SetParserState   , Parser_End                          , Kdll_None },
1823 
1824     // Write ARGB
1825     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1826     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
1827     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
1828     { RID_IsLayerFormat    , Format_A8R8G8B8                     , Kdll_Or   },
1829     { RID_IsLayerFormat    , Format_A8B8G8R8                     , Kdll_None },
1830     { RID_IsLayerNumber    , 0                                   , Kdll_None },
1831     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
1832     { RID_SetKernel        , IDR_VP_Set_Scale_Buf_0123_Colorfill , Kdll_None },
1833     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16         , Kdll_None },
1834     { RID_SetKernel        , IDR_VP_Save_444Scale16_RGB          , Kdll_None },
1835     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
1836     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
1837     { RID_SetParserState   , Parser_End                          , Kdll_None },
1838 
1839     // Write RGB with 64B save kernel
1840     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1841     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
1842     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
1843     { RID_IsLayerFormat    , Format_X8R8G8B8                     , Kdll_None },
1844     { RID_Is64BSaveEnabled , true                                , Kdll_None },
1845     { RID_IsLayerNumber    , 0                                   , Kdll_None },
1846     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
1847     { RID_SetKernel        , IDR_VP_Set_Scale_Buf_0123_Colorfill , Kdll_None },
1848     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16         , Kdll_None },
1849     { RID_SetKernel        , IDR_VP_Save_444Scale16_RGB_64Byte   , Kdll_None },
1850     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
1851     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
1852     { RID_SetParserState   , Parser_End                          , Kdll_None },
1853 
1854     // Write RGB
1855     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1856     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
1857     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
1858     { RID_IsLayerFormat    , Format_X8R8G8B8                     , Kdll_None },
1859     { RID_IsLayerNumber    , 0                                   , Kdll_None },
1860     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
1861     { RID_SetKernel        , IDR_VP_Set_Scale_Buf_0123_Colorfill , Kdll_None },
1862     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16         , Kdll_None },
1863     { RID_SetKernel        , IDR_VP_Save_444Scale16_RGB          , Kdll_None },
1864     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
1865     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
1866     { RID_SetParserState   , Parser_End                          , Kdll_None },
1867 
1868     // Write RGB16
1869     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1870     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
1871     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
1872     { RID_IsLayerFormat    , Format_R5G6B5                       , Kdll_None },
1873     { RID_IsLayerNumber    , 0                                   , Kdll_None },
1874     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
1875     { RID_SetKernel        , IDR_VP_Set_Scale_Buf_0123_Colorfill , Kdll_None },
1876     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16         , Kdll_None },
1877     { RID_SetKernel        , IDR_VP_Save_444Scale16_RGB16        , Kdll_None },
1878     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
1879     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
1880     { RID_SetParserState   , Parser_End                          , Kdll_None },
1881 
1882     // Write (R10G10B10A2 | B10G10R10A2) - With ColorFill. Note: R10G10B10A2 | B10G10R10A2 should be in front of Format_RGB32
1883     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1884     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
1885     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
1886     { RID_IsLayerFormat    , Format_R10G10B10A2                  , Kdll_Or   },
1887     { RID_IsLayerFormat    , Format_B10G10R10A2                  , Kdll_None },
1888     { RID_IsLayerNumber    , 0                                   , Kdll_None },
1889     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
1890     { RID_SetKernel        , IDR_VP_Set_Scale_Buf_0123_Colorfill , Kdll_None },
1891     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16         , Kdll_None },
1892     { RID_SetKernel        , IDR_VP_Save_444Scale16_R10G10B10    , Kdll_None },
1893     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
1894     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
1895     { RID_SetParserState   , Parser_End                          , Kdll_None },
1896 
1897     // Write AYUV with legacy save kernel
1898     { RID_Op_NewEntry      , RULE_DEFAULT                          , Kdll_None },
1899     { RID_IsParserState    , Parser_WriteOutput                    , Kdll_None },
1900     { RID_IsLayerID        , Layer_RenderTarget                    , Kdll_None },
1901     { RID_IsLayerFormat    , Format_AYUV                           , Kdll_None },
1902     { RID_IsLayerNumber    , 0                                     , Kdll_None },
1903     { RID_IsSrc0ColorFill  , ColorFill_True                        , Kdll_None },
1904     { RID_SetKernel        , IDR_VP_Set_Scale_Buf_0123_Colorfill   , Kdll_None },
1905     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16           , Kdll_None },
1906     { RID_SetKernel        , IDR_VP_Save_444Scale16_VUYA           , Kdll_None },
1907     { RID_SetKernel        , IDR_VP_EOT                            , Kdll_None },
1908     { RID_SetSrc0ColorFill , ColorFill_False                       , Kdll_None },
1909     { RID_SetParserState   , Parser_End                            , Kdll_None },
1910 
1911     // Write (YUY2 | YUYV | YVYU | UYVY | VYUY)
1912     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1913     { RID_IsParserState    , Parser_WriteOutput                      , Kdll_None },
1914     { RID_IsLayerID        , Layer_RenderTarget                      , Kdll_None },
1915     { RID_IsLayerFormat    , Format_YUY2                             , Kdll_Or   },
1916     { RID_IsLayerFormat    , Format_YUYV                             , Kdll_Or   },
1917     { RID_IsLayerFormat    , Format_YVYU                             , Kdll_Or   },
1918     { RID_IsLayerFormat    , Format_UYVY                             , Kdll_Or   },
1919     { RID_IsLayerFormat    , Format_VYUY                             , Kdll_None },
1920     { RID_IsLayerNumber    , 0                                       , Kdll_None },
1921     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
1922     { RID_SetKernel        , IDR_VP_Set_Scale_Buf_0123_Colorfill     , Kdll_None },
1923     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16             , Kdll_None },
1924     { RID_SetKernel        , IDR_VP_Set_Dest_Surf_Indexes_Primary    , Kdll_None },
1925     { RID_SetKernel        , IDR_VP_Save_444Scale16_PA               , Kdll_None },
1926     { RID_SetKernel        , IDR_VP_EOT                              , Kdll_None },
1927     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
1928     { RID_SetParserState   , Parser_End                              , Kdll_None },
1929 
1930     // Write NV21
1931     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1932     { RID_IsParserState    , Parser_WriteOutput                      , Kdll_None },
1933     { RID_IsLayerID        , Layer_RenderTarget                      , Kdll_None },
1934     { RID_IsLayerFormat    , Format_NV21                             , Kdll_None },
1935     { RID_IsLayerNumber    , 0                                       , Kdll_None },
1936     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
1937     { RID_SetKernel        , IDR_VP_Set_Scale_Buf_0123_Colorfill     , Kdll_None },
1938     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16             , Kdll_None },
1939     { RID_SetKernel        , IDR_VP_Set_Dest_Surf_Indexes_Primary    , Kdll_None },
1940     { RID_SetKernel        , IDR_VP_Save_444Scale16_NV21             , Kdll_None },
1941     { RID_SetKernel        , IDR_VP_EOT                              , Kdll_None },
1942     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
1943     { RID_SetParserState   , Parser_End                              , Kdll_None },
1944 
1945     // Write NV12
1946     { RID_Op_NewEntry      , RULE_DEFAULT                            , Kdll_None },
1947     { RID_IsParserState    , Parser_WriteOutput                      , Kdll_None },
1948     { RID_IsLayerID        , Layer_RenderTarget                      , Kdll_None },
1949     { RID_IsLayerFormat    , Format_PL2                              , Kdll_None },
1950     { RID_IsLayerNumber    , 0                                       , Kdll_None },
1951     { RID_IsSrc0ColorFill  , ColorFill_True                          , Kdll_None },
1952     { RID_SetKernel        , IDR_VP_Set_Scale_Buf_0123_Colorfill     , Kdll_None },
1953     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16             , Kdll_None },
1954     { RID_SetKernel        , IDR_VP_Set_Dest_Surf_Indexes_Primary    , Kdll_None },
1955     { RID_SetKernel        , IDR_VP_Save_444Scale16_NV12             , Kdll_None },
1956     { RID_SetKernel        , IDR_VP_EOT                              , Kdll_None },
1957     { RID_SetSrc0ColorFill , ColorFill_False                         , Kdll_None },
1958     { RID_SetParserState   , Parser_End                              , Kdll_None },
1959 
1960     // Write PL3
1961     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1962     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
1963     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
1964     { RID_IsLayerFormat    , Format_PL3                          , Kdll_None },
1965     { RID_IsLayerNumber    , 0                                   , Kdll_None },
1966     { RID_IsSrc0ColorFill  , ColorFill_True                      , Kdll_None },
1967     { RID_SetKernel        , IDR_VP_Set_Scale_Buf_0123_Colorfill , Kdll_None },
1968     { RID_SetKernel        , IDR_VP_Colorfill_444Scale16         , Kdll_None },
1969     { RID_SetKernel        , IDR_VP_Save_444Scale16_PL3          , Kdll_None },
1970     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
1971     { RID_SetSrc0ColorFill , ColorFill_False                     , Kdll_None },
1972     { RID_SetParserState   , Parser_End                          , Kdll_None },
1973 
1974     // Write (ARGB | ABGR) with 64B save kernel - Shuffle Save,
1975     // Save_AVS_ARGB can write out ABGR as well, based on CURBE settings.
1976     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1977     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
1978     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
1979     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
1980     { RID_IsLayerFormat    , Format_A8R8G8B8                     , Kdll_Or   },
1981     { RID_IsLayerFormat    , Format_A8B8G8R8                     , Kdll_None },
1982     { RID_Is64BSaveEnabled , true                                , Kdll_None },
1983     { RID_IsConstOutAlpha  , false                               , Kdll_None },
1984     { RID_SetKernel        , IDR_VP_Save_444AVS16_ARGB_64Byte    , Kdll_None },
1985     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
1986     { RID_SetParserState   , Parser_End                          , Kdll_None },
1987 
1988     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
1989     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
1990     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
1991     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
1992     { RID_IsLayerFormat    , Format_A8R8G8B8                     , Kdll_Or   },
1993     { RID_IsLayerFormat    , Format_A8B8G8R8                     , Kdll_None },
1994     { RID_Is64BSaveEnabled , true                                , Kdll_None },
1995     { RID_IsConstOutAlpha  , true                                , Kdll_None },
1996     { RID_SetKernel        , IDR_VP_Save_444AVS16_RGB_64Byte     , Kdll_None },
1997     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
1998     { RID_SetParserState   , Parser_End                          , Kdll_None },
1999 
2000     // Write (ARGB | ABGR) - Shuffle Save
2001     // Save_AVS_ARGB can write out ABGR as well, based on CURBE settings.
2002     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2003     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2004     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
2005     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2006     { RID_IsLayerFormat    , Format_A8R8G8B8                     , Kdll_Or   },
2007     { RID_IsLayerFormat    , Format_A8B8G8R8                     , Kdll_None },
2008     { RID_IsConstOutAlpha  , false                               , Kdll_None },
2009     { RID_SetKernel        , IDR_VP_Save_444AVS16_ARGB           , Kdll_None },
2010     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2011     { RID_SetParserState   , Parser_End                          , Kdll_None },
2012 
2013     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2014     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2015     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
2016     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2017     { RID_IsLayerFormat    , Format_A8R8G8B8                     , Kdll_Or   },
2018     { RID_IsLayerFormat    , Format_A8B8G8R8                     , Kdll_None },
2019     { RID_IsConstOutAlpha  , true                                , Kdll_None },
2020     { RID_SetKernel        , IDR_VP_Save_444AVS16_RGB            , Kdll_None },
2021     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2022     { RID_SetParserState   , Parser_End                          , Kdll_None },
2023 
2024     // Write (RGB | BGR) with 64B save kernel - Shuffle Save,
2025     // Save_AVS_RGB can write out BGR as well, based on CURBE settings.
2026     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2027     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2028     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
2029     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2030     { RID_IsLayerFormat    , Format_X8R8G8B8                     , Kdll_Or   },
2031     { RID_IsLayerFormat    , Format_X8B8G8R8                     , Kdll_None },
2032     { RID_Is64BSaveEnabled , true                                , Kdll_None },
2033     { RID_SetKernel        , IDR_VP_Save_444AVS16_RGB_64Byte     , Kdll_None },
2034     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2035     { RID_SetParserState   , Parser_End                          , Kdll_None },
2036 
2037     // Write (RGB | BGR) - Shuffle Save
2038     // Save_AVS_RGB can write out BGR as well, based on CURBE settings.
2039     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2040     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2041     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
2042     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2043     { RID_IsLayerFormat    , Format_X8R8G8B8                     , Kdll_Or   },
2044     { RID_IsLayerFormat    , Format_X8B8G8R8                     , Kdll_None },
2045     { RID_SetKernel        , IDR_VP_Save_444AVS16_RGB            , Kdll_None },
2046     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2047     { RID_SetParserState   , Parser_End                          , Kdll_None },
2048 
2049     // Write RGB16 - Shuffle Save
2050     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2051     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2052     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
2053     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2054     { RID_IsLayerFormat    , Format_R5G6B5                       , Kdll_None },
2055     { RID_SetKernel        , IDR_VP_Save_444AVS16_RGB16          , Kdll_None },
2056     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2057     { RID_SetParserState   , Parser_End                          , Kdll_None },
2058 
2059     // Write (R10G10B10A2 | B10G10R10A2) - Shuffle Save
2060     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2061     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2062     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
2063     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2064     { RID_IsLayerFormat    , Format_R10G10B10A2                  , Kdll_Or   },
2065     { RID_IsLayerFormat    , Format_B10G10R10A2                  , Kdll_None },
2066     { RID_SetKernel        , IDR_VP_Save_444AVS16_R10G10B10      , Kdll_None },
2067     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2068     { RID_SetParserState   , Parser_End                          , Kdll_None },
2069 
2070     // Write AYUV - Shuffle Save
2071     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2072     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2073     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
2074     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2075     { RID_IsLayerFormat    , Format_AYUV                         , Kdll_None },
2076     { RID_SetKernel        , IDR_VP_Save_444AVS16_SrcAYUV        , Kdll_None },
2077     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2078     { RID_SetParserState   , Parser_End                          , Kdll_None },
2079 
2080     // Write (YUY2 | YUYV | YVYU | UYVY | VYUY) - Shuffle Save
2081     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2082     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2083     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
2084     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2085     { RID_IsLayerFormat    , Format_YUY2                         , Kdll_Or   },
2086     { RID_IsLayerFormat    , Format_YUYV                         , Kdll_Or   },
2087     { RID_IsLayerFormat    , Format_YVYU                         , Kdll_Or   },
2088     { RID_IsLayerFormat    , Format_UYVY                         , Kdll_Or   },
2089     { RID_IsLayerFormat    , Format_VYUY                         , Kdll_None },
2090     { RID_SetKernel        , IDR_VP_Save_444AVS16_PA             , Kdll_None },
2091     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2092     { RID_SetParserState   , Parser_End                          , Kdll_None },
2093 
2094     // Write NV21 - Shuffle Save
2095     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2096     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2097     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
2098     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2099     { RID_IsLayerFormat    , Format_NV21                         , Kdll_None },
2100     { RID_SetKernel        , IDR_VP_Save_444AVS16_NV21           , Kdll_None },
2101     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2102     { RID_SetParserState   , Parser_End                          , Kdll_None },
2103 
2104     // Write NV12 - Shuffle Save
2105     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2106     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2107     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
2108     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2109     { RID_IsLayerFormat    , Format_PL2                          , Kdll_None },
2110     { RID_SetKernel        , IDR_VP_Save_444AVS16_NV12           , Kdll_None },
2111     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2112     { RID_SetParserState   , Parser_End                          , Kdll_None },
2113 
2114     // Write PL3 - Shuffle Save
2115     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2116     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2117     { RID_IsShuffling      , Shuffle_RenderTarget                , Kdll_None },
2118     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2119     { RID_IsLayerFormat    , Format_PL3                          , Kdll_None },
2120     { RID_SetKernel        , IDR_VP_Save_444AVS16_PL3            , Kdll_None },
2121     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2122     { RID_SetParserState   , Parser_End                          , Kdll_None },
2123 
2124     // Write (ARGB | ABGR) with 64B save kernel - Normal Save
2125     // Sample_8x8 not used or already shuffled
2126     // Save_ARGB can write out ABGR as well, based on CURBE settings.
2127     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2128     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2129     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2130     { RID_IsLayerFormat    , Format_A8R8G8B8                     , Kdll_Or   },
2131     { RID_IsLayerFormat    , Format_A8B8G8R8                     , Kdll_None },
2132     { RID_Is64BSaveEnabled , true                                , Kdll_None },
2133     { RID_IsConstOutAlpha  , false                               , Kdll_None },
2134     { RID_SetKernel        , IDR_VP_Save_444Scale16_ARGB_64Byte  , Kdll_None },
2135     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2136     { RID_SetParserState   , Parser_End                          , Kdll_None },
2137 
2138     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2139     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2140     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2141     { RID_IsLayerFormat    , Format_A8R8G8B8                     , Kdll_Or   },
2142     { RID_IsLayerFormat    , Format_A8B8G8R8                     , Kdll_None },
2143     { RID_Is64BSaveEnabled , true                                , Kdll_None },
2144     { RID_IsConstOutAlpha  , true                                , Kdll_None },
2145     { RID_SetKernel        , IDR_VP_Save_444Scale16_RGB_64Byte   , Kdll_None },
2146     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2147     { RID_SetParserState   , Parser_End                          , Kdll_None },
2148 
2149     // Write (ARGB | ABGR) - Normal Save
2150     // Sample_8x8 not used or already shuffled
2151     // Save_ARGB can write out ABGR as well, based on CURBE settings.
2152     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2153     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2154     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2155     { RID_IsLayerFormat    , Format_A8R8G8B8                     , Kdll_Or   },
2156     { RID_IsLayerFormat    , Format_A8B8G8R8                     , Kdll_None },
2157     { RID_IsConstOutAlpha  , false                               , Kdll_None },
2158     { RID_SetKernel        , IDR_VP_Save_444Scale16_ARGB         , Kdll_None },
2159     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2160     { RID_SetParserState   , Parser_End                          , Kdll_None },
2161 
2162     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2163     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2164     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2165     { RID_IsLayerFormat    , Format_A8R8G8B8                     , Kdll_Or   },
2166     { RID_IsLayerFormat    , Format_A8B8G8R8                     , Kdll_None },
2167     { RID_IsConstOutAlpha  , true                                , Kdll_None },
2168     { RID_SetKernel        , IDR_VP_Save_444Scale16_RGB          , Kdll_None },
2169     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2170     { RID_SetParserState   , Parser_End                          , Kdll_None },
2171 
2172     // Write (RGB | BGR) with 64B save kernel - Normal Save
2173     // Sample_8x8 not used or already shuffled
2174     // Save_RGB can write out BGR as well, based on CURBE settings.
2175     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2176     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2177     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2178     { RID_IsLayerFormat    , Format_X8R8G8B8                     , Kdll_Or   },
2179     { RID_IsLayerFormat    , Format_X8B8G8R8                     , Kdll_None },
2180     { RID_Is64BSaveEnabled , true                                , Kdll_None },
2181     { RID_SetKernel        , IDR_VP_Save_444Scale16_RGB_64Byte   , Kdll_None },
2182     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2183     { RID_SetParserState   , Parser_End                          , Kdll_None },
2184 
2185     // Write (RGB | BGR) - Normal Save
2186     // Sample_8x8 not used or already shuffled
2187     // Save_RGB can write out BGR as well, based on CURBE settings.
2188     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2189     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2190     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2191     { RID_IsLayerFormat    , Format_X8R8G8B8                     , Kdll_Or   },
2192     { RID_IsLayerFormat    , Format_X8B8G8R8                     , Kdll_None },
2193     { RID_SetKernel        , IDR_VP_Save_444Scale16_RGB          , Kdll_None },
2194     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2195     { RID_SetParserState   , Parser_End                          , Kdll_None },
2196 
2197     // Write RGB16 - Normal Save, Sample_8x8 not used or already shuffled
2198     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2199     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2200     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2201     { RID_IsLayerFormat    , Format_R5G6B5                       , Kdll_None },
2202     { RID_SetKernel        , IDR_VP_Save_444Scale16_RGB16        , Kdll_None },
2203     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2204     { RID_SetParserState   , Parser_End                          , Kdll_None },
2205 
2206     // Write (R10G10B10A2 | B10G10R10A2) - Normal Save
2207     // Sample_8x8 not used or already shuffled
2208     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2209     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2210     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2211     { RID_IsLayerFormat    , Format_R10G10B10A2                  , Kdll_Or   },
2212     { RID_IsLayerFormat    , Format_B10G10R10A2                  , Kdll_None },
2213     { RID_IsConstOutAlpha  , false                               , Kdll_None },
2214     { RID_SetKernel        , IDR_VP_Save_444Scale16_R10G10B10A2  , Kdll_None },
2215     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2216     { RID_SetParserState   , Parser_End                          , Kdll_None },
2217 
2218     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2219     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2220     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2221     { RID_IsLayerFormat    , Format_R10G10B10A2                  , Kdll_Or   },
2222     { RID_IsLayerFormat    , Format_B10G10R10A2                  , Kdll_None },
2223     { RID_IsConstOutAlpha  , true                                , Kdll_None },
2224     { RID_SetKernel        , IDR_VP_Save_444Scale16_R10G10B10    , Kdll_None },
2225     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2226     { RID_SetParserState   , Parser_End                          , Kdll_None },
2227 
2228     // Write AYUV - Normal Save, Sample_8x8 not used or already shuffled
2229     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2230     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2231     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2232     { RID_IsLayerFormat    , Format_AYUV                         , Kdll_None },
2233     { RID_IsConstOutAlpha  , false                               , Kdll_None },
2234     { RID_SetKernel        , IDR_VP_Save_444Scale16_SrcVUYA      , Kdll_None },
2235     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2236     { RID_SetParserState   , Parser_End                          , Kdll_None },
2237 
2238     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2239     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2240     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2241     { RID_IsLayerFormat    , Format_AYUV                         , Kdll_None },
2242     { RID_IsConstOutAlpha  , true                                , Kdll_None },
2243     { RID_SetKernel        , IDR_VP_Save_444Scale16_VUYA         , Kdll_None },
2244     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2245     { RID_SetParserState   , Parser_End                          , Kdll_None },
2246 
2247     // Write (YUY2 | YUYV | YVYU | UYVY | VYUY) - Normal Save, Sample_8x8 not used or already shuffled
2248     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2249     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2250     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2251     { RID_IsLayerFormat    , Format_YUY2                         , Kdll_Or   },
2252     { RID_IsLayerFormat    , Format_YUYV                         , Kdll_Or   },
2253     { RID_IsLayerFormat    , Format_YVYU                         , Kdll_Or   },
2254     { RID_IsLayerFormat    , Format_UYVY                         , Kdll_Or   },
2255     { RID_IsLayerFormat    , Format_VYUY                         , Kdll_None },
2256     { RID_SetKernel        , IDR_VP_Save_444Scale16_PA           , Kdll_None },
2257     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2258     { RID_SetParserState   , Parser_End                          , Kdll_None },
2259 
2260     // Write NV21 - Normal Save, Sample_8x8 not used or already shuffled
2261     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2262     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2263     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2264     { RID_IsLayerFormat    , Format_NV21                         , Kdll_None },
2265     { RID_SetKernel        , IDR_VP_Save_444Scale16_NV21         , Kdll_None },
2266     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2267     { RID_SetParserState   , Parser_End                          , Kdll_None },
2268 
2269     // Write NV12 - Normal Save, Sample_8x8 not used or already shuffled
2270     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2271     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2272     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2273     { RID_IsLayerFormat    , Format_PL2                          , Kdll_None },
2274     { RID_SetKernel        , IDR_VP_Save_444Scale16_NV12         , Kdll_None },
2275     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2276     { RID_SetParserState   , Parser_End                          , Kdll_None },
2277 
2278     // Write PL3 - Normal Save, Sample_8x8 not used or already shuffled
2279     { RID_Op_NewEntry      , RULE_DEFAULT                        , Kdll_None },
2280     { RID_IsParserState    , Parser_WriteOutput                  , Kdll_None },
2281     { RID_IsLayerID        , Layer_RenderTarget                  , Kdll_None },
2282     { RID_IsLayerFormat    , Format_PL3                          , Kdll_None },
2283     { RID_SetKernel        , IDR_VP_Save_444Scale16_PL3          , Kdll_None },
2284     { RID_SetKernel        , IDR_VP_EOT                          , Kdll_None },
2285     { RID_SetParserState   , Parser_End                          , Kdll_None },
2286 
2287     // Last entry
2288 
2289     { RID_Op_EOF           , 0                                   , Kdll_None }
2290 };
2291