1 /*
2  * Copyright (C) 2018-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #pragma once
9 #include "shared/source/execution_environment/execution_environment.h"
10 #include "shared/source/helpers/hw_info.h"
11 #include "shared/test/common/helpers/default_hw_info.h"
12 #include "shared/test/common/test_macros/test.h"
13 
14 #include "opencl/source/helpers/cl_memory_properties_helpers.h"
15 #include "opencl/source/mem_obj/image.h"
16 #include "opencl/source/platform/platform.h"
17 #include "opencl/test/unit_test/fixtures/cl_device_fixture.h"
18 #include "opencl/test/unit_test/mocks/mock_context.h"
19 #include "opencl/test/unit_test/mocks/mock_platform.h"
20 
21 #include "CL/cl.h"
22 
23 #include <cassert>
24 #include <cstdio>
25 
26 struct Image1dDefaults {
27     enum { flags = 0 };
28     static const cl_image_format imageFormat;
29     static const cl_image_desc imageDesc;
30     static void *hostPtr;
31     static NEO::Context *context;
32 };
33 
34 struct Image1dBufferDefaults : public Image1dDefaults {
35     static const cl_image_desc imageDesc;
36 };
37 
38 struct Image2dDefaults : public Image1dDefaults {
39     static const cl_image_desc imageDesc;
40 };
41 
42 struct Image3dDefaults : public Image2dDefaults {
43     static const cl_image_desc imageDesc;
44 };
45 
46 struct Image2dArrayDefaults : public Image2dDefaults {
47     static const cl_image_desc imageDesc;
48 };
49 
50 struct Image1dArrayDefaults : public Image2dDefaults {
51     static const cl_image_desc imageDesc;
52 };
53 
54 struct LuminanceImage : public Image2dDefaults {
55     static const cl_image_format imageFormat;
56 };
57 
58 struct ImageWithoutHostPtr : public Image1dDefaults {
59     enum { flags = 0 };
60     static void *hostPtr;
61 };
62 
63 template <typename BaseClass>
64 struct ImageUseHostPtr : public BaseClass {
65     enum { flags = BaseClass::flags | CL_MEM_USE_HOST_PTR };
66 };
67 
68 template <typename BaseClass>
69 struct ImageReadOnly : public BaseClass {
70     enum { flags = BaseClass::flags | CL_MEM_READ_ONLY };
71 };
72 
73 template <typename BaseClass>
74 struct ImageWriteOnly : public BaseClass {
75     enum { flags = BaseClass::flags | CL_MEM_WRITE_ONLY };
76 };
77 
78 template <typename Traits>
79 struct ImageHelper {
80     using Context = NEO::Context;
81     using Image = NEO::Image;
82     using MockContext = NEO::MockContext;
83 
84     static Image *create(Context *context = Traits::context, const cl_image_desc *imgDesc = &Traits::imageDesc,
85                          const cl_image_format *imgFormat = &Traits::imageFormat) {
86         auto retVal = CL_INVALID_VALUE;
87         auto surfaceFormat = Image::getSurfaceFormatFromTable(Traits::flags, imgFormat, context->getDevice(0)->getHardwareInfo().capabilityTable.supportsOcl21Features);
88         auto image = Image::create(
89             context,
90             NEO::ClMemoryPropertiesHelper::createMemoryProperties(Traits::flags, 0, 0, &context->getDevice(0)->getDevice()),
91             Traits::flags,
92             0,
93             surfaceFormat,
94             imgDesc,
95             Traits::hostPtr,
96             retVal);
97 
98         return image;
99     }
100 };
101 
102 template <typename Traits = Image1dDefaults>
103 struct Image1dHelper : public ImageHelper<Traits> {
104 };
105 
106 template <typename Traits = Image1dBufferDefaults>
107 struct Image1dBufferHelper : public ImageHelper<Traits> {
108 };
109 
110 template <typename Traits = Image2dDefaults>
111 struct Image2dHelper : public ImageHelper<Traits> {
112 };
113 
114 template <typename Traits = Image3dDefaults>
115 struct Image3dHelper : public ImageHelper<Traits> {
116 };
117 
118 template <typename Traits = Image2dArrayDefaults>
119 struct Image2dArrayHelper : public ImageHelper<Traits> {
120 };
121 
122 template <typename Traits = Image1dArrayDefaults>
123 struct Image1dArrayHelper : public ImageHelper<Traits> {
124 };
125 
126 struct ImageClearColorFixture : ::testing::Test {
127     using MockContext = NEO::MockContext;
128     using Image = NEO::Image;
129 
130     template <typename FamilyType>
setUpImplImageClearColorFixture131     void setUpImpl() {
132         hardwareInfo.capabilityTable.ftrRenderCompressedImages = true;
133 
134         NEO::platformsImpl->clear();
135         NEO::constructPlatform()->peekExecutionEnvironment()->prepareRootDeviceEnvironments(1u);
136         NEO::platform()->peekExecutionEnvironment()->rootDeviceEnvironments[0]->setHwInfo(&hardwareInfo);
137         NEO::platform()->peekExecutionEnvironment()->rootDeviceEnvironments[0]->initGmm();
138     }
139 
140     template <typename FamilyType>
getSurfaceStateImageClearColorFixture141     typename FamilyType::RENDER_SURFACE_STATE getSurfaceState() {
142         using AUXILIARY_SURFACE_MODE = typename FamilyType::RENDER_SURFACE_STATE::AUXILIARY_SURFACE_MODE;
143         auto surfaceState = FamilyType::cmdInitRenderSurfaceState;
144         surfaceState.setAuxiliarySurfaceMode(AUXILIARY_SURFACE_MODE::AUXILIARY_SURFACE_MODE_AUX_CCS_E);
145         return surfaceState;
146     }
147 
148     NEO::HardwareInfo hardwareInfo = *NEO::defaultHwInfo;
149     MockContext context;
150     std::unique_ptr<Image> image;
151 };
152