blob: 55f268e900021a6bfe391edb6f66eb6546a66b68 [file] [log] [blame]
Chia-I Wu4ea339e2014-08-08 21:56:26 +08001/*
2 * XGL
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
Chia-I Wu44e42362014-09-02 08:32:09 +080023 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
Chia-I Wu4ea339e2014-08-08 21:56:26 +080026 */
27
Chia-I Wu1db76e02014-09-15 14:21:14 +080028#include <unistd.h>
Chia-I Wue46da3e2014-08-08 21:52:48 +080029#include "kmd/winsys.h"
30#include "dev.h"
31#include "gpu.h"
Chia-I Wu1db76e02014-09-15 14:21:14 +080032#include "mem.h"
Chia-I Wue46da3e2014-08-08 21:52:48 +080033#include "img.h"
Chia-I Wu4ea339e2014-08-08 21:56:26 +080034
Chia-I Wu4ea339e2014-08-08 21:56:26 +080035/*
36 * From the Ivy Bridge PRM, volume 1 part 1, page 105:
37 *
38 * "In addition to restrictions on maximum height, width, and depth,
39 * surfaces are also restricted to a maximum size in bytes. This
40 * maximum is 2 GB for all products and all surface types."
41 */
Chia-I Wue46da3e2014-08-08 21:52:48 +080042static const size_t intel_max_resource_size = 1u << 31;
Chia-I Wu4ea339e2014-08-08 21:56:26 +080043
Chia-I Wufeb441f2014-08-08 21:27:38 +080044static void img_destroy(struct intel_obj *obj)
45{
46 struct intel_img *img = intel_img_from_obj(obj);
47
48 intel_img_destroy(img);
49}
50
51static XGL_RESULT img_get_info(struct intel_base *base, int type,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060052 size_t *size, void *data)
Chia-I Wufeb441f2014-08-08 21:27:38 +080053{
54 struct intel_img *img = intel_img_from_base(base);
55 XGL_RESULT ret = XGL_SUCCESS;
56
57 switch (type) {
58 case XGL_INFO_TYPE_MEMORY_REQUIREMENTS:
59 {
60 XGL_MEMORY_REQUIREMENTS *mem_req = data;
61
Jon Ashburn408daec2014-12-05 09:23:52 -070062 *size = sizeof(XGL_MEMORY_REQUIREMENTS);
63 if (data == NULL)
64 return ret;
Chia-I Wu9b752e12014-08-15 16:21:44 +080065 mem_req->size = img->total_size;
Chia-I Wufeb441f2014-08-08 21:27:38 +080066 mem_req->alignment = 4096;
Courtney Goeltzenleuchter4f73aae2015-02-25 13:54:22 -070067 if (img->format_class == XGL_IMAGE_FORMAT_CLASS_LINEAR) {
68 mem_req->memType = XGL_MEMORY_TYPE_BUFFER;
69 } else {
70 mem_req->memType = XGL_MEMORY_TYPE_IMAGE;
71 }
Chia-I Wufeb441f2014-08-08 21:27:38 +080072 }
73 break;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -070074 case XGL_INFO_TYPE_IMAGE_MEMORY_REQUIREMENTS:
75 {
76 XGL_IMAGE_MEMORY_REQUIREMENTS *img_req = data;
77
78 *size = sizeof(XGL_IMAGE_MEMORY_REQUIREMENTS);
79 if (data == NULL)
80 return ret;
81 img_req->usage = img->usage;
82 img_req->formatClass = img->format_class;
83 img_req->samples = img->samples;
84 }
85 break;
86 case XGL_INFO_TYPE_BUFFER_MEMORY_REQUIREMENTS:
87 {
88 XGL_BUFFER_MEMORY_REQUIREMENTS *buf_req = data;
89
Courtney Goeltzenleuchterca83e1d2015-02-18 11:40:27 -070090 *size = sizeof(XGL_BUFFER_MEMORY_REQUIREMENTS);
Jon Ashburnc6ae13d2015-01-19 15:00:26 -070091 if (data == NULL)
92 return ret;
93 buf_req->usage = img->usage;
94 }
95 break;
Chia-I Wufeb441f2014-08-08 21:27:38 +080096 default:
97 ret = intel_base_get_info(base, type, size, data);
98 break;
99 }
100
101 return ret;
102}
103
104XGL_RESULT intel_img_create(struct intel_dev *dev,
105 const XGL_IMAGE_CREATE_INFO *info,
Chia-I Wu794d12a2014-09-15 14:55:25 +0800106 bool scanout,
Chia-I Wufeb441f2014-08-08 21:27:38 +0800107 struct intel_img **img_ret)
108{
Chia-I Wufeb441f2014-08-08 21:27:38 +0800109 struct intel_img *img;
Chia-I Wu37cba152014-08-15 16:03:10 +0800110 struct intel_layout *layout;
Chia-I Wufeb441f2014-08-08 21:27:38 +0800111
Chia-I Wu545c2e12015-02-22 13:19:54 +0800112 img = (struct intel_img *) intel_base_create(&dev->base.handle,
113 sizeof(*img), dev->base.dbg, XGL_DBG_OBJECT_IMAGE, info, 0);
Chia-I Wufeb441f2014-08-08 21:27:38 +0800114 if (!img)
115 return XGL_ERROR_OUT_OF_MEMORY;
116
Chia-I Wu37cba152014-08-15 16:03:10 +0800117 layout = &img->layout;
118
Chia-I Wueb2da592014-08-16 14:19:39 +0800119 img->type = info->imageType;
Chia-I Wu73e326f2014-08-21 11:07:57 +0800120 img->depth = info->extent.depth;
Chia-I Wuaa759372014-10-18 12:47:35 +0800121 img->mip_levels = info->mipLevels;
Chia-I Wueb2da592014-08-16 14:19:39 +0800122 img->array_size = info->arraySize;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700123 img->usage = info->usage;
Jon Ashburn3cda13b2015-01-20 17:22:07 -0700124 if (info->tiling == XGL_LINEAR_TILING)
125 img->format_class = XGL_IMAGE_FORMAT_CLASS_LINEAR;
126 else
127 img->format_class = icd_format_get_class(info->format);
Chia-I Wueb2da592014-08-16 14:19:39 +0800128 img->samples = info->samples;
Chia-I Wu794d12a2014-09-15 14:55:25 +0800129 intel_layout_init(layout, dev, info, scanout);
Chia-I Wu37cba152014-08-15 16:03:10 +0800130
131 if (layout->bo_stride > intel_max_resource_size / layout->bo_height) {
132 intel_dev_log(dev, XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0,
133 XGL_NULL_HANDLE, 0, 0, "image too big");
134 intel_img_destroy(img);
135 return XGL_ERROR_INVALID_MEMORY_SIZE;
136 }
Chia-I Wufeb441f2014-08-08 21:27:38 +0800137
Chia-I Wu9b752e12014-08-15 16:21:44 +0800138 img->total_size = img->layout.bo_stride * img->layout.bo_height;
139
Chia-I Wu457d0a62014-08-18 13:02:26 +0800140 if (layout->aux != INTEL_LAYOUT_AUX_NONE) {
Chia-I Wu9b752e12014-08-15 16:21:44 +0800141 img->aux_offset = u_align(img->total_size, 4096);
142 img->total_size = img->aux_offset +
143 layout->aux_stride * layout->aux_height;
144 }
145
146 if (layout->separate_stencil) {
147 XGL_IMAGE_CREATE_INFO s8_info;
148
Chia-I Wuf9c81ef2015-02-22 13:49:15 +0800149 img->s8_layout = intel_alloc(img, sizeof(*img->s8_layout), 0,
Chia-I Wu9b752e12014-08-15 16:21:44 +0800150 XGL_SYSTEM_ALLOC_INTERNAL);
151 if (!img->s8_layout) {
152 intel_img_destroy(img);
153 return XGL_ERROR_OUT_OF_MEMORY;
154 }
155
156 s8_info = *info;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700157 s8_info.format = XGL_FMT_S8_UINT;
158 assert(icd_format_is_ds(info->format));
Chia-I Wu9b752e12014-08-15 16:21:44 +0800159
Chia-I Wu794d12a2014-09-15 14:55:25 +0800160 intel_layout_init(img->s8_layout, dev, &s8_info, scanout);
Chia-I Wu9b752e12014-08-15 16:21:44 +0800161
162 img->s8_offset = u_align(img->total_size, 4096);
163 img->total_size = img->s8_offset +
164 img->s8_layout->bo_stride * img->s8_layout->bo_height;
Chia-I Wufeb441f2014-08-08 21:27:38 +0800165 }
166
Chia-I Wufeb441f2014-08-08 21:27:38 +0800167 img->obj.destroy = img_destroy;
168 img->obj.base.get_info = img_get_info;
169
Chia-I Wu1db76e02014-09-15 14:21:14 +0800170#ifdef ENABLE_WSI_X11
171 img->x11_prime_fd = -1;
172#endif
173
Chia-I Wufeb441f2014-08-08 21:27:38 +0800174 *img_ret = img;
175
176 return XGL_SUCCESS;
177}
178
179void intel_img_destroy(struct intel_img *img)
180{
Chia-I Wu1db76e02014-09-15 14:21:14 +0800181#ifdef ENABLE_WSI_X11
182 if (img->x11_prime_fd >= 0) {
183 close(img->x11_prime_fd);
184 intel_mem_free(img->obj.mem);
185 }
186#endif
187
Chia-I Wu9b752e12014-08-15 16:21:44 +0800188 if (img->s8_layout)
Chia-I Wuf9c81ef2015-02-22 13:49:15 +0800189 intel_free(img, img->s8_layout);
Chia-I Wu9b752e12014-08-15 16:21:44 +0800190
Chia-I Wufeb441f2014-08-08 21:27:38 +0800191 intel_base_destroy(&img->obj.base);
192}
193
Chia-I Wu96177272015-01-03 15:27:41 +0800194ICD_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(
Chia-I Wu251e7d92014-08-19 13:35:42 +0800195 XGL_DEVICE device,
196 const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo,
197 XGL_IMAGE* pImage,
198 XGL_GPU_MEMORY* pMem)
199{
200 return XGL_ERROR_UNAVAILABLE;
201}
202
Chia-I Wu96177272015-01-03 15:27:41 +0800203ICD_EXPORT XGL_RESULT XGLAPI xglCreateImage(
Chia-I Wufeb441f2014-08-08 21:27:38 +0800204 XGL_DEVICE device,
205 const XGL_IMAGE_CREATE_INFO* pCreateInfo,
206 XGL_IMAGE* pImage)
207{
208 struct intel_dev *dev = intel_dev(device);
209
Chia-I Wu794d12a2014-09-15 14:55:25 +0800210 return intel_img_create(dev, pCreateInfo, false,
211 (struct intel_img **) pImage);
Chia-I Wufeb441f2014-08-08 21:27:38 +0800212}
213
Chia-I Wu96177272015-01-03 15:27:41 +0800214ICD_EXPORT XGL_RESULT XGLAPI xglGetImageSubresourceInfo(
Chia-I Wufeb441f2014-08-08 21:27:38 +0800215 XGL_IMAGE image,
216 const XGL_IMAGE_SUBRESOURCE* pSubresource,
217 XGL_SUBRESOURCE_INFO_TYPE infoType,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600218 size_t* pDataSize,
219 void* pData)
Chia-I Wufeb441f2014-08-08 21:27:38 +0800220{
221 const struct intel_img *img = intel_img(image);
222 XGL_RESULT ret = XGL_SUCCESS;
223
224 switch (infoType) {
225 case XGL_INFO_TYPE_SUBRESOURCE_LAYOUT:
226 {
227 XGL_SUBRESOURCE_LAYOUT *layout = (XGL_SUBRESOURCE_LAYOUT *) pData;
Chia-I Wu2b685d72014-08-14 13:45:37 +0800228 unsigned x, y;
229
230 intel_layout_get_slice_pos(&img->layout, pSubresource->mipLevel,
231 pSubresource->arraySlice, &x, &y);
232 intel_layout_pos_to_mem(&img->layout, x, y, &x, &y);
Chia-I Wufeb441f2014-08-08 21:27:38 +0800233
234 *pDataSize = sizeof(XGL_SUBRESOURCE_LAYOUT);
235
Jon Ashburnbf4182c2014-12-04 15:22:01 -0700236 if (pData == NULL)
237 return ret;
Chia-I Wu457d0a62014-08-18 13:02:26 +0800238 layout->offset = intel_layout_mem_to_linear(&img->layout, x, y);
Chia-I Wu2b685d72014-08-14 13:45:37 +0800239 layout->size = intel_layout_get_slice_size(&img->layout,
240 pSubresource->mipLevel);
241 layout->rowPitch = img->layout.bo_stride;
242 layout->depthPitch = intel_layout_get_slice_stride(&img->layout,
243 pSubresource->mipLevel);
Chia-I Wufeb441f2014-08-08 21:27:38 +0800244 }
245 break;
246 default:
247 ret = XGL_ERROR_INVALID_VALUE;
248 break;
249 }
250
251 return ret;
252}
Mark Lobodzinski46658d92015-01-28 13:29:48 -0600253
254ICD_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(
255 XGL_IMAGE image,
256 const float color[4])
257{
258 struct intel_img *img = intel_img(image);
259
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600260 memcpy(img->clear_color, &color, sizeof(float) * 4);
Mark Lobodzinski46658d92015-01-28 13:29:48 -0600261
262 return XGL_SUCCESS;
263}
264
265ICD_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(
266 XGL_IMAGE image,
267 const float depth)
268{
269 struct intel_img *img = intel_img(image);
270
271 img->clear_depth = depth;
272
273 return XGL_SUCCESS;
274}