Files
third_party_mesa3d/src/imagination/vulkan/usc/pvr_uscgen.h
Simon Perretta f0b47cfd65 pvr: Add support for generating transfer fragment programs
Co-authored-by: Karmjit Mahil <Karmjit.Mahil@imgtec.com>
Co-authored-by: Rajnesh Kanwal <rajnesh.kanwal@imgtec.com>
Signed-off-by: Karmjit Mahil <Karmjit.Mahil@imgtec.com>
Signed-off-by: Rajnesh Kanwal <rajnesh.kanwal@imgtec.com>
Signed-off-by: Simon Perretta <simon.perretta@imgtec.com>
Acked-by: Frank Binns <frank.binns@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21550>
2023-04-19 11:01:05 +00:00

156 lines
5.1 KiB
C

/*
* Copyright © 2023 Imagination Technologies Ltd.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef PVR_USCGEN_H
#define PVR_USCGEN_H
#include <stdbool.h>
#include <stdint.h>
#include "pvr_common.h"
#include "pvr_formats.h"
#include "util/u_dynarray.h"
enum pvr_int_coord_set_floats {
PVR_INT_COORD_SET_FLOATS_0 = 0,
PVR_INT_COORD_SET_FLOATS_4 = 1,
/* For rate changes to 0 base screen space. */
PVR_INT_COORD_SET_FLOATS_6 = 2,
PVR_INT_COORD_SET_FLOATS_NUM = 3
};
struct pvr_tq_shader_properties {
/* Controls whether this is an iterated shader. */
bool iterated;
/* Controls whether this is meant to be running at full rate. */
bool full_rate;
/* Sample specific channel of pixel. */
bool pick_component;
/* Alpha type from transfer API. */
uint32_t alpha_type;
struct pvr_tq_layer_properties {
/* Controls whether we need to send the sample count to the TPU. */
bool msaa;
/* In case we run pixel rate, to do an USC resolve - but still in MSAA TPU
* samples.
*/
uint32_t sample_count;
enum pvr_resolve_op resolve_op;
/* Selects the pixel conversion that we have to perform. */
enum pvr_transfer_pbe_pixel_src pbe_format;
/* Sampling from a 3D texture with a constant Z position. */
bool sample;
/* Number of float coefficients to get from screen space to texture space.
*/
enum pvr_int_coord_set_floats layer_floats;
/* Unaligned texture address in bytes. */
uint32_t byte_unwind;
/* Enable bilinear filter in shader. */
bool linear;
} layer_props;
};
/* All offsets are in dwords. */
/* Devices may have more than 256 sh regs but we're expecting to use vary few so
* let's use uint8_t.
*/
struct pvr_tq_frag_sh_reg_layout {
struct {
/* How many image sampler descriptors are present. */
uint8_t count;
/* TODO: See if we ever need more than one combined image sampler
* descriptor. If this is linked to the amount of layers used, we only
* ever use one layer so this wouldn't need to be an array.
*/
struct {
uint8_t image;
uint8_t sampler;
} offsets[PVR_TRANSFER_MAX_IMAGES];
} combined_image_samplers;
/* TODO: Dynamic consts are used for various things so do this properly by
* having an actual layout instead of chucking them all together using an
* implicit layout.
*/
struct {
/* How many dynamic consts regs have been allocated. */
uint8_t count;
uint8_t offset;
} dynamic_consts;
/* Total sh regs allocated by the driver. It does not include the regs
* necessary for compiler_out.
*/
uint8_t driver_total;
/* Provided by the compiler to the driver to be appended to the shareds. */
/* No offset field since these will be appended at the end so driver_total
* can be used instead.
*/
struct {
struct {
/* TODO: Remove this count and just use `compiler_out_total`? Or remove
* that one and use this one?
*/
uint8_t count;
/* TODO: The array size is chosen arbitrarily based on the max
* constants currently produced by the compiler. Make this dynamic?
*/
/* Values to fill in into each shared reg used for usc constants. */
uint32_t values[10];
} usc_constants;
} compiler_out;
/* Total extra sh regs needed by the compiler that need to be appended to the
* shareds by the driver.
*/
uint8_t compiler_out_total;
};
/* TODO: Shader caching (not pipeline caching) support. */
void pvr_uscgen_per_job_eot(uint32_t emit_count,
const uint32_t *emit_state,
unsigned *temps_used,
struct util_dynarray *binary);
void pvr_uscgen_nop(struct util_dynarray *binary);
void pvr_uscgen_tq_frag(const struct pvr_tq_shader_properties *shader_props,
struct pvr_tq_frag_sh_reg_layout *sh_reg_layout,
unsigned *temps_used,
struct util_dynarray *binary);
#endif /* PVR_USCGEN_H */