1/*
2 * Copyright © 2022 Imagination Technologies Ltd.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 * SOFTWARE.
22 */
23
24#ifndef PVR_TEX_STATE_H
25#define PVR_TEX_STATE_H
26
27#include <stdint.h>
28#include <vulkan/vulkan.h>
29
30#include "hwdef/rogue_hw_defs.h"
31#include "pvr_private.h"
32#include "pvr_types.h"
33#include "util/macros.h"
34
35/**
36 * Texture requires 32bit index lookups instead of texture coordinate access.
37 */
38#define PVR_TEXFLAGS_INDEX_LOOKUP BITFIELD_BIT(0U)
39
40/** Texture has border texels present. */
41#define PVR_TEXFLAGS_BORDER BITFIELD_BIT(1U)
42
43/**
44 * Resource is actually a buffer, not a texture, and therefore LOD is ignored.
45 * Coordinates are integers.
46 */
47#define PVR_TEXFLAGS_BUFFER BITFIELD_BIT(2U)
48
49/** Parameters for #pvr_pack_tex_state(). */
50struct pvr_texture_state_info {
51   VkFormat format;
52   enum pvr_memlayout mem_layout;
53   uint32_t flags;
54   VkImageViewType type;
55   bool is_cube;
56   enum pvr_texture_state tex_state_type;
57   VkExtent3D extent;
58
59   /**
60    * For array textures, this holds the array dimension, in elements. This can
61    * be zero if texture is not an array.
62    */
63   uint32_t array_size;
64
65   /** Base mipmap level. This is the miplevel you want as the top level. */
66   uint32_t base_level;
67
68   /**
69    * Number of mipmap levels that should be accessed by HW. This is not
70    * necessarily the number of levels that are in memory. (See
71    * mipmaps_present)
72    */
73   uint32_t mip_levels;
74
75   /**
76    * True if the texture is mipmapped.
77    * Note: This is based on the number of mip levels the texture contains, not
78    * on the mip levels that are being used i.e. mip_levels.
79    */
80   bool mipmaps_present;
81
82   /**
83    * Number of samples per texel for multisampling. This should be 1 for none
84    * multisampled textures.
85    */
86   uint32_t sample_count;
87
88   /** Stride, in pixels. Only valid if mem_layout is stride or tiled. */
89   uint32_t stride;
90
91   /**
92    * For buffers, where TPU_BUFFER_LOOKUP is present, this defines
93    * the offset for the buffer, in texels.
94    */
95   uint32_t offset;
96
97   /**
98    * Precomputed (composed from createinfo->components and format swizzle)
99    * swizzles to pass in to the texture state.
100    */
101   uint8_t swizzle[4];
102
103   /** Address of texture, which must be aligned to at least 32bits. */
104   pvr_dev_addr_t addr;
105};
106
107VkResult
108pvr_pack_tex_state(struct pvr_device *device,
109                   struct pvr_texture_state_info *info,
110                   uint64_t state[static const ROGUE_NUM_TEXSTATE_IMAGE_WORDS]);
111
112#endif /* PVR_TEX_STATE_H */
113