Compare commits
62 Commits
mesa-25.0.
...
mesa-18.1.
Author | SHA1 | Date | |
---|---|---|---|
|
630559e054 | ||
|
36c24a608e | ||
|
1def4eaa5c | ||
|
421aedcc59 | ||
|
5391c4f5fd | ||
|
e4c54e1031 | ||
|
3b9b1175aa | ||
|
7da026cb98 | ||
|
2c140183d4 | ||
|
e3106b460e | ||
|
5519bb3c65 | ||
|
5fc5b1dab8 | ||
|
e90f0d711c | ||
|
0d2d5d2ffa | ||
|
8c384f62a2 | ||
|
312c2f047e | ||
|
eea5ec86d5 | ||
|
2136602167 | ||
|
3cdbd79dcc | ||
|
795fffc2df | ||
|
817414b00b | ||
|
bf24436c6d | ||
|
95474b31c4 | ||
|
f366968e86 | ||
|
227fbe2799 | ||
|
ea1d5faa96 | ||
|
d90d4e61e2 | ||
|
cd1435aa9d | ||
|
0d15a443fa | ||
|
1e5c3fa29b | ||
|
57aebd4283 | ||
|
e334caa4be | ||
|
b3f3d605c8 | ||
|
c760bbff20 | ||
|
63953cc0fb | ||
|
4cf3a2b064 | ||
|
2fe5a43995 | ||
|
7a1f220b26 | ||
|
171753ff5d | ||
|
7d6ed8d0dd | ||
|
66f64177b2 | ||
|
c2768b8a51 | ||
|
b049689a1d | ||
|
7ef0933099 | ||
|
3f1847459b | ||
|
0ec061bbea | ||
|
9ec980063c | ||
|
a85b00e278 | ||
|
b74d10534e | ||
|
6278c88395 | ||
|
f2b72b6fdc | ||
|
d76507298f | ||
|
297caed81d | ||
|
dde47f6d19 | ||
|
7a6e084b41 | ||
|
762c07b5a0 | ||
|
8ac80de5f2 | ||
|
08e8556f54 | ||
|
d6a312e288 | ||
|
d844b2a656 | ||
|
a829747276 | ||
|
ff1ecebb1d |
@@ -21,7 +21,7 @@ env:
|
||||
- LIBXCB_VERSION=libxcb-1.13
|
||||
- LIBXSHMFENCE_VERSION=libxshmfence-1.2
|
||||
- LIBVDPAU_VERSION=libvdpau-1.1
|
||||
- LIBVA_VERSION=libva-1.6.2
|
||||
- LIBVA_VERSION=libva-1.7.0
|
||||
- LIBWAYLAND_VERSION=wayland-1.11.1
|
||||
- WAYLAND_PROTOCOLS_VERSION=wayland-protocols-1.8
|
||||
- PKG_CONFIG_PATH=$HOME/prefix/lib/pkgconfig:$HOME/prefix/share/pkgconfig
|
||||
|
@@ -16,7 +16,7 @@ latest_branchpoint=`git merge-base origin/master HEAD`
|
||||
git log --reverse --pretty=%H $latest_branchpoint > already_landed
|
||||
|
||||
# ... and the ones cherry-picked.
|
||||
git log --reverse --grep="cherry picked from commit" $latest_branchpoint..HEAD |\
|
||||
git log --reverse --pretty=medium --grep="cherry picked from commit" $latest_branchpoint..HEAD |\
|
||||
grep "cherry picked from commit" |\
|
||||
sed -e 's/^[[:space:]]*(cherry picked from commit[[:space:]]*//' -e 's/)//' > already_picked
|
||||
|
||||
@@ -38,7 +38,7 @@ do
|
||||
|
||||
# Place every "fixes:" tag on its own line and join with the next word
|
||||
# on its line or a later one.
|
||||
fixes=`git show -s $sha | tr -d "\n" | sed -e 's/fixes:[[:space:]]*/\nfixes:/Ig' | grep "fixes:" | sed -e 's/\(fixes:[a-zA-Z0-9]*\).*$/\1/'`
|
||||
fixes=`git show --pretty=medium -s $sha | tr -d "\n" | sed -e 's/fixes:[[:space:]]*/\nfixes:/Ig' | grep "fixes:" | sed -e 's/\(fixes:[a-zA-Z0-9]*\).*$/\1/'`
|
||||
|
||||
# For each one try to extract the tag
|
||||
fixes_count=`echo "$fixes" | wc -l`
|
||||
|
@@ -12,7 +12,7 @@
|
||||
latest_branchpoint=`git merge-base origin/master HEAD`
|
||||
|
||||
# Grep for commits with "cherry picked from commit" in the commit message.
|
||||
git log --reverse --grep="cherry picked from commit" $latest_branchpoint..HEAD |\
|
||||
git log --reverse --pretty=medium --grep="cherry picked from commit" $latest_branchpoint..HEAD |\
|
||||
grep "cherry picked from commit" |\
|
||||
sed -e 's/^[[:space:]]*(cherry picked from commit[[:space:]]*//' -e 's/)//' > already_picked
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding=utf-8
|
||||
# Copyright © 2017 Intel Corporation
|
||||
# Copyright © 2017-2018 Intel Corporation
|
||||
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -35,7 +35,11 @@ def main():
|
||||
parser.add_argument('drivers', nargs='+')
|
||||
args = parser.parse_args()
|
||||
|
||||
to = os.path.join(os.environ.get('MESON_INSTALL_DESTDIR_PREFIX'), args.libdir)
|
||||
if os.path.isabs(args.libdir):
|
||||
to = os.path.join(os.environ.get('DESTDIR', '/'), args.libdir[1:])
|
||||
else:
|
||||
to = os.path.join(os.environ['MESON_INSTALL_DESTDIR_PREFIX'], args.libdir)
|
||||
|
||||
master = os.path.join(to, os.path.basename(args.megadriver))
|
||||
|
||||
if not os.path.exists(to):
|
||||
|
@@ -86,7 +86,7 @@ DRI2PROTO_REQUIRED=2.8
|
||||
GLPROTO_REQUIRED=1.4.14
|
||||
LIBOMXIL_BELLAGIO_REQUIRED=0.0
|
||||
LIBOMXIL_TIZONIA_REQUIRED=0.10.0
|
||||
LIBVA_REQUIRED=0.38.0
|
||||
LIBVA_REQUIRED=0.39.0
|
||||
VDPAU_REQUIRED=1.1
|
||||
WAYLAND_REQUIRED=1.11
|
||||
WAYLAND_PROTOCOLS_REQUIRED=1.8
|
||||
|
@@ -584,7 +584,7 @@ endif
|
||||
with_gallium_va = _va == 'true'
|
||||
dep_va = null_dep
|
||||
if with_gallium_va
|
||||
dep_va = dependency('libva', version : '>= 0.38.0')
|
||||
dep_va = dependency('libva', version : '>= 0.39.0')
|
||||
dep_va_headers = declare_dependency(
|
||||
compile_args : run_command(prog_pkgconfig, ['libva', '--cflags']).stdout().split()
|
||||
)
|
||||
|
@@ -1521,6 +1521,20 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
|
||||
LLVMValueRef addr;
|
||||
unsigned num_addr = 0;
|
||||
|
||||
if (a->opcode == ac_image_get_lod) {
|
||||
switch (a->dim) {
|
||||
case ac_image_1darray:
|
||||
num_coords = 1;
|
||||
break;
|
||||
case ac_image_2darray:
|
||||
case ac_image_cube:
|
||||
num_coords = 2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (a->offset)
|
||||
args[num_addr++] = ac_to_integer(ctx, a->offset);
|
||||
if (a->bias)
|
||||
|
@@ -1307,6 +1307,14 @@ static LLVMValueRef build_tex_intrinsic(struct ac_nir_context *ctx,
|
||||
}
|
||||
}
|
||||
|
||||
/* Fixup for GFX9 which allocates 1D textures as 2D. */
|
||||
if (instr->op == nir_texop_lod && ctx->ac.chip_class >= GFX9) {
|
||||
if ((args->dim == ac_image_2darray ||
|
||||
args->dim == ac_image_2d) && !args->coords[1]) {
|
||||
args->coords[1] = ctx->ac.i32_0;
|
||||
}
|
||||
}
|
||||
|
||||
args->attributes = AC_FUNC_ATTR_READNONE;
|
||||
return ac_build_image_opcode(&ctx->ac, args);
|
||||
}
|
||||
@@ -3397,6 +3405,13 @@ static void visit_tex(struct ac_nir_context *ctx, nir_tex_instr *instr)
|
||||
}
|
||||
|
||||
/* Texture coordinates fixups */
|
||||
if (instr->coord_components > 1 &&
|
||||
instr->sampler_dim == GLSL_SAMPLER_DIM_1D &&
|
||||
instr->is_array &&
|
||||
instr->op != nir_texop_txf) {
|
||||
args.coords[1] = apply_round_slice(&ctx->ac, args.coords[1]);
|
||||
}
|
||||
|
||||
if (instr->coord_components > 2 &&
|
||||
(instr->sampler_dim == GLSL_SAMPLER_DIM_2D ||
|
||||
instr->sampler_dim == GLSL_SAMPLER_DIM_MS ||
|
||||
|
@@ -463,15 +463,6 @@ VkResult radv_CreateInstance(
|
||||
client_version = VK_MAKE_VERSION(1, 0, 0);
|
||||
}
|
||||
|
||||
if (VK_MAKE_VERSION(1, 0, 0) > client_version ||
|
||||
client_version > VK_MAKE_VERSION(1, 1, 0xfff)) {
|
||||
return vk_errorf(VK_ERROR_INCOMPATIBLE_DRIVER,
|
||||
"Client requested version %d.%d.%d",
|
||||
VK_VERSION_MAJOR(client_version),
|
||||
VK_VERSION_MINOR(client_version),
|
||||
VK_VERSION_PATCH(client_version));
|
||||
}
|
||||
|
||||
instance = vk_zalloc2(&default_alloc, pAllocator, sizeof(*instance), 8,
|
||||
VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
|
||||
if (!instance)
|
||||
|
@@ -205,7 +205,7 @@ radv_entrypoint_is_enabled(int index, uint32_t core_version,
|
||||
% if not e.device_command:
|
||||
if (device) return false;
|
||||
% endif
|
||||
% if e.name == 'vkCreateInstance' or e.name == 'vkEnumerateInstanceExtensionProperties' or e.name == 'vkEnumerateInstanceLayerProperties':
|
||||
% if e.name == 'vkCreateInstance' or e.name == 'vkEnumerateInstanceExtensionProperties' or e.name == 'vkEnumerateInstanceLayerProperties' or e.name == 'vkEnumerateInstanceVersion':
|
||||
return !device;
|
||||
% elif e.core_version:
|
||||
return instance && ${e.core_version.c_vk_version()} <= core_version;
|
||||
|
@@ -133,12 +133,12 @@ radv_use_dcc_for_image(struct radv_device *device,
|
||||
if (create_info->scanout)
|
||||
return false;
|
||||
|
||||
/* FIXME: DCC for MSAA with 4x and 8x samples doesn't work yet. */
|
||||
if (pCreateInfo->samples > 2)
|
||||
return false;
|
||||
|
||||
/* TODO: Enable DCC for MSAA textures. */
|
||||
if (!device->physical_device->dcc_msaa_allowed)
|
||||
/* FIXME: DCC for MSAA with 4x and 8x samples doesn't work yet, while
|
||||
* 2x can be enabled with an option.
|
||||
*/
|
||||
if (pCreateInfo->samples > 2 ||
|
||||
(pCreateInfo->samples == 2 &&
|
||||
!device->physical_device->dcc_msaa_allowed))
|
||||
return false;
|
||||
|
||||
/* Determine if the formats are DCC compatible. */
|
||||
@@ -968,7 +968,7 @@ radv_image_create(VkDevice _device,
|
||||
image->info.samples = pCreateInfo->samples;
|
||||
image->info.array_size = pCreateInfo->arrayLayers;
|
||||
image->info.levels = pCreateInfo->mipLevels;
|
||||
image->info.num_channels = 4; /* TODO: set this correctly */
|
||||
image->info.num_channels = vk_format_get_nr_components(pCreateInfo->format);
|
||||
|
||||
image->vk_format = pCreateInfo->format;
|
||||
image->tiling = pCreateInfo->tiling;
|
||||
|
@@ -100,7 +100,8 @@ blit2d_bind_src(struct radv_cmd_buffer *cmd_buffer,
|
||||
struct radv_meta_blit2d_buffer *src_buf,
|
||||
struct blit2d_src_temps *tmp,
|
||||
enum blit2d_src_type src_type, VkFormat depth_format,
|
||||
VkImageAspectFlagBits aspects)
|
||||
VkImageAspectFlagBits aspects,
|
||||
uint32_t log2_samples)
|
||||
{
|
||||
struct radv_device *device = cmd_buffer->device;
|
||||
|
||||
@@ -108,7 +109,7 @@ blit2d_bind_src(struct radv_cmd_buffer *cmd_buffer,
|
||||
create_bview(cmd_buffer, src_buf, &tmp->bview, depth_format);
|
||||
|
||||
radv_meta_push_descriptor_set(cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||
device->meta_state.blit2d.p_layouts[src_type],
|
||||
device->meta_state.blit2d[log2_samples].p_layouts[src_type],
|
||||
0, /* set */
|
||||
1, /* descriptorWriteCount */
|
||||
(VkWriteDescriptorSet[]) {
|
||||
@@ -123,7 +124,7 @@ blit2d_bind_src(struct radv_cmd_buffer *cmd_buffer,
|
||||
});
|
||||
|
||||
radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer),
|
||||
device->meta_state.blit2d.p_layouts[src_type],
|
||||
device->meta_state.blit2d[log2_samples].p_layouts[src_type],
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT, 16, 4,
|
||||
&src_buf->pitch);
|
||||
} else {
|
||||
@@ -131,12 +132,12 @@ blit2d_bind_src(struct radv_cmd_buffer *cmd_buffer,
|
||||
|
||||
if (src_type == BLIT2D_SRC_TYPE_IMAGE_3D)
|
||||
radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer),
|
||||
device->meta_state.blit2d.p_layouts[src_type],
|
||||
device->meta_state.blit2d[log2_samples].p_layouts[src_type],
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT, 16, 4,
|
||||
&src_img->layer);
|
||||
|
||||
radv_meta_push_descriptor_set(cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||
device->meta_state.blit2d.p_layouts[src_type],
|
||||
device->meta_state.blit2d[log2_samples].p_layouts[src_type],
|
||||
0, /* set */
|
||||
1, /* descriptorWriteCount */
|
||||
(VkWriteDescriptorSet[]) {
|
||||
@@ -190,10 +191,11 @@ blit2d_bind_dst(struct radv_cmd_buffer *cmd_buffer,
|
||||
|
||||
static void
|
||||
bind_pipeline(struct radv_cmd_buffer *cmd_buffer,
|
||||
enum blit2d_src_type src_type, unsigned fs_key)
|
||||
enum blit2d_src_type src_type, unsigned fs_key,
|
||||
uint32_t log2_samples)
|
||||
{
|
||||
VkPipeline pipeline =
|
||||
cmd_buffer->device->meta_state.blit2d.pipelines[src_type][fs_key];
|
||||
cmd_buffer->device->meta_state.blit2d[log2_samples].pipelines[src_type][fs_key];
|
||||
|
||||
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer),
|
||||
VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
||||
@@ -201,10 +203,11 @@ bind_pipeline(struct radv_cmd_buffer *cmd_buffer,
|
||||
|
||||
static void
|
||||
bind_depth_pipeline(struct radv_cmd_buffer *cmd_buffer,
|
||||
enum blit2d_src_type src_type)
|
||||
enum blit2d_src_type src_type,
|
||||
uint32_t log2_samples)
|
||||
{
|
||||
VkPipeline pipeline =
|
||||
cmd_buffer->device->meta_state.blit2d.depth_only_pipeline[src_type];
|
||||
cmd_buffer->device->meta_state.blit2d[log2_samples].depth_only_pipeline[src_type];
|
||||
|
||||
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer),
|
||||
VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
||||
@@ -212,10 +215,11 @@ bind_depth_pipeline(struct radv_cmd_buffer *cmd_buffer,
|
||||
|
||||
static void
|
||||
bind_stencil_pipeline(struct radv_cmd_buffer *cmd_buffer,
|
||||
enum blit2d_src_type src_type)
|
||||
enum blit2d_src_type src_type,
|
||||
uint32_t log2_samples)
|
||||
{
|
||||
VkPipeline pipeline =
|
||||
cmd_buffer->device->meta_state.blit2d.stencil_only_pipeline[src_type];
|
||||
cmd_buffer->device->meta_state.blit2d[log2_samples].stencil_only_pipeline[src_type];
|
||||
|
||||
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer),
|
||||
VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
||||
@@ -227,7 +231,8 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer,
|
||||
struct radv_meta_blit2d_buffer *src_buf,
|
||||
struct radv_meta_blit2d_surf *dst,
|
||||
unsigned num_rects,
|
||||
struct radv_meta_blit2d_rect *rects, enum blit2d_src_type src_type)
|
||||
struct radv_meta_blit2d_rect *rects, enum blit2d_src_type src_type,
|
||||
uint32_t log2_samples)
|
||||
{
|
||||
struct radv_device *device = cmd_buffer->device;
|
||||
|
||||
@@ -241,7 +246,7 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer,
|
||||
else if (aspect_mask == VK_IMAGE_ASPECT_DEPTH_BIT)
|
||||
depth_format = vk_format_depth_only(dst->image->vk_format);
|
||||
struct blit2d_src_temps src_temps;
|
||||
blit2d_bind_src(cmd_buffer, src_img, src_buf, &src_temps, src_type, depth_format, aspect_mask);
|
||||
blit2d_bind_src(cmd_buffer, src_img, src_buf, &src_temps, src_type, depth_format, aspect_mask, log2_samples);
|
||||
|
||||
struct blit2d_dst_temps dst_temps;
|
||||
blit2d_bind_dst(cmd_buffer, dst, rects[r].dst_x + rects[r].width,
|
||||
@@ -255,7 +260,7 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer,
|
||||
};
|
||||
|
||||
radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer),
|
||||
device->meta_state.blit2d.p_layouts[src_type],
|
||||
device->meta_state.blit2d[log2_samples].p_layouts[src_type],
|
||||
VK_SHADER_STAGE_VERTEX_BIT, 0, 16,
|
||||
vertex_push_constants);
|
||||
|
||||
@@ -266,7 +271,7 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer,
|
||||
radv_CmdBeginRenderPass(radv_cmd_buffer_to_handle(cmd_buffer),
|
||||
&(VkRenderPassBeginInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
|
||||
.renderPass = device->meta_state.blit2d.render_passes[fs_key][dst_layout],
|
||||
.renderPass = device->meta_state.blit2d_render_passes[fs_key][dst_layout],
|
||||
.framebuffer = dst_temps.fb,
|
||||
.renderArea = {
|
||||
.offset = { rects[r].dst_x, rects[r].dst_y, },
|
||||
@@ -277,13 +282,13 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer,
|
||||
}, VK_SUBPASS_CONTENTS_INLINE);
|
||||
|
||||
|
||||
bind_pipeline(cmd_buffer, src_type, fs_key);
|
||||
bind_pipeline(cmd_buffer, src_type, fs_key, log2_samples);
|
||||
} else if (aspect_mask == VK_IMAGE_ASPECT_DEPTH_BIT) {
|
||||
enum radv_blit_ds_layout ds_layout = radv_meta_blit_ds_to_type(dst->current_layout);
|
||||
radv_CmdBeginRenderPass(radv_cmd_buffer_to_handle(cmd_buffer),
|
||||
&(VkRenderPassBeginInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
|
||||
.renderPass = device->meta_state.blit2d.depth_only_rp[ds_layout],
|
||||
.renderPass = device->meta_state.blit2d_depth_only_rp[ds_layout],
|
||||
.framebuffer = dst_temps.fb,
|
||||
.renderArea = {
|
||||
.offset = { rects[r].dst_x, rects[r].dst_y, },
|
||||
@@ -294,14 +299,14 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer,
|
||||
}, VK_SUBPASS_CONTENTS_INLINE);
|
||||
|
||||
|
||||
bind_depth_pipeline(cmd_buffer, src_type);
|
||||
bind_depth_pipeline(cmd_buffer, src_type, log2_samples);
|
||||
|
||||
} else if (aspect_mask == VK_IMAGE_ASPECT_STENCIL_BIT) {
|
||||
enum radv_blit_ds_layout ds_layout = radv_meta_blit_ds_to_type(dst->current_layout);
|
||||
radv_CmdBeginRenderPass(radv_cmd_buffer_to_handle(cmd_buffer),
|
||||
&(VkRenderPassBeginInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
|
||||
.renderPass = device->meta_state.blit2d.stencil_only_rp[ds_layout],
|
||||
.renderPass = device->meta_state.blit2d_stencil_only_rp[ds_layout],
|
||||
.framebuffer = dst_temps.fb,
|
||||
.renderArea = {
|
||||
.offset = { rects[r].dst_x, rects[r].dst_y, },
|
||||
@@ -312,7 +317,7 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer,
|
||||
}, VK_SUBPASS_CONTENTS_INLINE);
|
||||
|
||||
|
||||
bind_stencil_pipeline(cmd_buffer, src_type);
|
||||
bind_stencil_pipeline(cmd_buffer, src_type, log2_samples);
|
||||
} else
|
||||
unreachable("Processing blit2d with multiple aspects.");
|
||||
|
||||
@@ -332,7 +337,24 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer,
|
||||
|
||||
|
||||
|
||||
radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0);
|
||||
if (log2_samples > 0) {
|
||||
for (uint32_t sample = 0; sample < src_img->image->info.samples; sample++) {
|
||||
uint32_t sample_mask = 1 << sample;
|
||||
radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer),
|
||||
device->meta_state.blit2d[log2_samples].p_layouts[src_type],
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT, 20, 4,
|
||||
&sample);
|
||||
|
||||
radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer),
|
||||
device->meta_state.blit2d[log2_samples].p_layouts[src_type],
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT, 24, 4,
|
||||
&sample_mask);
|
||||
|
||||
radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0);
|
||||
radv_CmdEndRenderPass(radv_cmd_buffer_to_handle(cmd_buffer));
|
||||
|
||||
/* At the point where we emit the draw call, all data from the
|
||||
@@ -358,7 +380,8 @@ radv_meta_blit2d(struct radv_cmd_buffer *cmd_buffer,
|
||||
enum blit2d_src_type src_type = src_buf ? BLIT2D_SRC_TYPE_BUFFER :
|
||||
use_3d ? BLIT2D_SRC_TYPE_IMAGE_3D : BLIT2D_SRC_TYPE_IMAGE;
|
||||
radv_meta_blit2d_normal_dst(cmd_buffer, src_img, src_buf, dst,
|
||||
num_rects, rects, src_type);
|
||||
num_rects, rects, src_type,
|
||||
src_img ? util_logbase2(src_img->image->info.samples) : 0);
|
||||
}
|
||||
|
||||
static nir_shader *
|
||||
@@ -421,13 +444,14 @@ build_nir_vertex_shader(void)
|
||||
|
||||
typedef nir_ssa_def* (*texel_fetch_build_func)(struct nir_builder *,
|
||||
struct radv_device *,
|
||||
nir_ssa_def *, bool);
|
||||
nir_ssa_def *, bool, bool);
|
||||
|
||||
static nir_ssa_def *
|
||||
build_nir_texel_fetch(struct nir_builder *b, struct radv_device *device,
|
||||
nir_ssa_def *tex_pos, bool is_3d)
|
||||
nir_ssa_def *tex_pos, bool is_3d, bool is_multisampled)
|
||||
{
|
||||
enum glsl_sampler_dim dim = is_3d ? GLSL_SAMPLER_DIM_3D : GLSL_SAMPLER_DIM_2D;
|
||||
enum glsl_sampler_dim dim =
|
||||
is_3d ? GLSL_SAMPLER_DIM_3D : is_multisampled ? GLSL_SAMPLER_DIM_MS : GLSL_SAMPLER_DIM_2D;
|
||||
const struct glsl_type *sampler_type =
|
||||
glsl_sampler_type(dim, false, false, GLSL_TYPE_UINT);
|
||||
nir_variable *sampler = nir_variable_create(b->shader, nir_var_uniform,
|
||||
@@ -436,6 +460,7 @@ build_nir_texel_fetch(struct nir_builder *b, struct radv_device *device,
|
||||
sampler->data.binding = 0;
|
||||
|
||||
nir_ssa_def *tex_pos_3d = NULL;
|
||||
nir_intrinsic_instr *sample_idx = NULL;
|
||||
if (is_3d) {
|
||||
nir_intrinsic_instr *layer = nir_intrinsic_instr_create(b->shader, nir_intrinsic_load_push_constant);
|
||||
nir_intrinsic_set_base(layer, 16);
|
||||
@@ -451,13 +476,26 @@ build_nir_texel_fetch(struct nir_builder *b, struct radv_device *device,
|
||||
chans[2] = &layer->dest.ssa;
|
||||
tex_pos_3d = nir_vec(b, chans, 3);
|
||||
}
|
||||
nir_tex_instr *tex = nir_tex_instr_create(b->shader, 2);
|
||||
if (is_multisampled) {
|
||||
sample_idx = nir_intrinsic_instr_create(b->shader, nir_intrinsic_load_push_constant);
|
||||
nir_intrinsic_set_base(sample_idx, 20);
|
||||
nir_intrinsic_set_range(sample_idx, 4);
|
||||
sample_idx->src[0] = nir_src_for_ssa(nir_imm_int(b, 0));
|
||||
sample_idx->num_components = 1;
|
||||
nir_ssa_dest_init(&sample_idx->instr, &sample_idx->dest, 1, 32, "sample_idx");
|
||||
nir_builder_instr_insert(b, &sample_idx->instr);
|
||||
}
|
||||
nir_tex_instr *tex = nir_tex_instr_create(b->shader, is_multisampled ? 3 : 2);
|
||||
tex->sampler_dim = dim;
|
||||
tex->op = nir_texop_txf;
|
||||
tex->op = is_multisampled ? nir_texop_txf_ms : nir_texop_txf;
|
||||
tex->src[0].src_type = nir_tex_src_coord;
|
||||
tex->src[0].src = nir_src_for_ssa(is_3d ? tex_pos_3d : tex_pos);
|
||||
tex->src[1].src_type = nir_tex_src_lod;
|
||||
tex->src[1].src = nir_src_for_ssa(nir_imm_int(b, 0));
|
||||
tex->src[1].src_type = is_multisampled ? nir_tex_src_ms_index : nir_tex_src_lod;
|
||||
tex->src[1].src = nir_src_for_ssa(is_multisampled ? &sample_idx->dest.ssa : nir_imm_int(b, 0));
|
||||
if (is_multisampled) {
|
||||
tex->src[2].src_type = nir_tex_src_lod;
|
||||
tex->src[2].src = nir_src_for_ssa(nir_imm_int(b, 0));
|
||||
}
|
||||
tex->dest_type = nir_type_uint;
|
||||
tex->is_array = false;
|
||||
tex->coord_components = is_3d ? 3 : 2;
|
||||
@@ -473,7 +511,7 @@ build_nir_texel_fetch(struct nir_builder *b, struct radv_device *device,
|
||||
|
||||
static nir_ssa_def *
|
||||
build_nir_buffer_fetch(struct nir_builder *b, struct radv_device *device,
|
||||
nir_ssa_def *tex_pos, bool is_3d)
|
||||
nir_ssa_def *tex_pos, bool is_3d, bool is_multisampled)
|
||||
{
|
||||
const struct glsl_type *sampler_type =
|
||||
glsl_sampler_type(GLSL_SAMPLER_DIM_BUF, false, false, GLSL_TYPE_UINT);
|
||||
@@ -519,9 +557,31 @@ static const VkPipelineVertexInputStateCreateInfo normal_vi_create_info = {
|
||||
.vertexAttributeDescriptionCount = 0,
|
||||
};
|
||||
|
||||
static void
|
||||
build_nir_store_sample_mask(struct nir_builder *b)
|
||||
{
|
||||
nir_intrinsic_instr *sample_mask = nir_intrinsic_instr_create(b->shader, nir_intrinsic_load_push_constant);
|
||||
nir_intrinsic_set_base(sample_mask, 24);
|
||||
nir_intrinsic_set_range(sample_mask, 4);
|
||||
sample_mask->src[0] = nir_src_for_ssa(nir_imm_int(b, 0));
|
||||
sample_mask->num_components = 1;
|
||||
nir_ssa_dest_init(&sample_mask->instr, &sample_mask->dest, 1, 32, "sample_mask");
|
||||
nir_builder_instr_insert(b, &sample_mask->instr);
|
||||
|
||||
const struct glsl_type *sample_mask_out_type = glsl_uint_type();
|
||||
|
||||
nir_variable *sample_mask_out =
|
||||
nir_variable_create(b->shader, nir_var_shader_out,
|
||||
sample_mask_out_type, "sample_mask_out");
|
||||
sample_mask_out->data.location = FRAG_RESULT_SAMPLE_MASK;
|
||||
|
||||
nir_store_var(b, sample_mask_out, &sample_mask->dest.ssa, 0x1);
|
||||
}
|
||||
|
||||
static nir_shader *
|
||||
build_nir_copy_fragment_shader(struct radv_device *device,
|
||||
texel_fetch_build_func txf_func, const char* name, bool is_3d)
|
||||
texel_fetch_build_func txf_func, const char* name, bool is_3d,
|
||||
bool is_multisampled)
|
||||
{
|
||||
const struct glsl_type *vec4 = glsl_vec4_type();
|
||||
const struct glsl_type *vec2 = glsl_vector_type(GLSL_TYPE_FLOAT, 2);
|
||||
@@ -538,11 +598,15 @@ build_nir_copy_fragment_shader(struct radv_device *device,
|
||||
vec4, "f_color");
|
||||
color_out->data.location = FRAG_RESULT_DATA0;
|
||||
|
||||
if (is_multisampled) {
|
||||
build_nir_store_sample_mask(&b);
|
||||
}
|
||||
|
||||
nir_ssa_def *pos_int = nir_f2i32(&b, nir_load_var(&b, tex_pos_in));
|
||||
unsigned swiz[4] = { 0, 1 };
|
||||
nir_ssa_def *tex_pos = nir_swizzle(&b, pos_int, swiz, 2, false);
|
||||
|
||||
nir_ssa_def *color = txf_func(&b, device, tex_pos, is_3d);
|
||||
nir_ssa_def *color = txf_func(&b, device, tex_pos, is_3d, is_multisampled);
|
||||
nir_store_var(&b, color_out, color, 0xf);
|
||||
|
||||
return b.shader;
|
||||
@@ -550,7 +614,8 @@ build_nir_copy_fragment_shader(struct radv_device *device,
|
||||
|
||||
static nir_shader *
|
||||
build_nir_copy_fragment_shader_depth(struct radv_device *device,
|
||||
texel_fetch_build_func txf_func, const char* name, bool is_3d)
|
||||
texel_fetch_build_func txf_func, const char* name, bool is_3d,
|
||||
bool is_multisampled)
|
||||
{
|
||||
const struct glsl_type *vec4 = glsl_vec4_type();
|
||||
const struct glsl_type *vec2 = glsl_vector_type(GLSL_TYPE_FLOAT, 2);
|
||||
@@ -567,11 +632,15 @@ build_nir_copy_fragment_shader_depth(struct radv_device *device,
|
||||
vec4, "f_color");
|
||||
color_out->data.location = FRAG_RESULT_DEPTH;
|
||||
|
||||
if (is_multisampled) {
|
||||
build_nir_store_sample_mask(&b);
|
||||
}
|
||||
|
||||
nir_ssa_def *pos_int = nir_f2i32(&b, nir_load_var(&b, tex_pos_in));
|
||||
unsigned swiz[4] = { 0, 1 };
|
||||
nir_ssa_def *tex_pos = nir_swizzle(&b, pos_int, swiz, 2, false);
|
||||
|
||||
nir_ssa_def *color = txf_func(&b, device, tex_pos, is_3d);
|
||||
nir_ssa_def *color = txf_func(&b, device, tex_pos, is_3d, is_multisampled);
|
||||
nir_store_var(&b, color_out, color, 0x1);
|
||||
|
||||
return b.shader;
|
||||
@@ -579,7 +648,8 @@ build_nir_copy_fragment_shader_depth(struct radv_device *device,
|
||||
|
||||
static nir_shader *
|
||||
build_nir_copy_fragment_shader_stencil(struct radv_device *device,
|
||||
texel_fetch_build_func txf_func, const char* name, bool is_3d)
|
||||
texel_fetch_build_func txf_func, const char* name, bool is_3d,
|
||||
bool is_multisampled)
|
||||
{
|
||||
const struct glsl_type *vec4 = glsl_vec4_type();
|
||||
const struct glsl_type *vec2 = glsl_vector_type(GLSL_TYPE_FLOAT, 2);
|
||||
@@ -596,11 +666,15 @@ build_nir_copy_fragment_shader_stencil(struct radv_device *device,
|
||||
vec4, "f_color");
|
||||
color_out->data.location = FRAG_RESULT_STENCIL;
|
||||
|
||||
if (is_multisampled) {
|
||||
build_nir_store_sample_mask(&b);
|
||||
}
|
||||
|
||||
nir_ssa_def *pos_int = nir_f2i32(&b, nir_load_var(&b, tex_pos_in));
|
||||
unsigned swiz[4] = { 0, 1 };
|
||||
nir_ssa_def *tex_pos = nir_swizzle(&b, pos_int, swiz, 2, false);
|
||||
|
||||
nir_ssa_def *color = txf_func(&b, device, tex_pos, is_3d);
|
||||
nir_ssa_def *color = txf_func(&b, device, tex_pos, is_3d, is_multisampled);
|
||||
nir_store_var(&b, color_out, color, 0x1);
|
||||
|
||||
return b.shader;
|
||||
@@ -614,45 +688,48 @@ radv_device_finish_meta_blit2d_state(struct radv_device *device)
|
||||
for(unsigned j = 0; j < NUM_META_FS_KEYS; ++j) {
|
||||
for (unsigned k = 0; k < RADV_META_DST_LAYOUT_COUNT; ++k) {
|
||||
radv_DestroyRenderPass(radv_device_to_handle(device),
|
||||
state->blit2d.render_passes[j][k],
|
||||
&state->alloc);
|
||||
state->blit2d_render_passes[j][k],
|
||||
&state->alloc);
|
||||
}
|
||||
}
|
||||
|
||||
for (enum radv_blit_ds_layout j = RADV_BLIT_DS_LAYOUT_TILE_ENABLE; j < RADV_BLIT_DS_LAYOUT_COUNT; j++) {
|
||||
radv_DestroyRenderPass(radv_device_to_handle(device),
|
||||
state->blit2d.depth_only_rp[j], &state->alloc);
|
||||
state->blit2d_depth_only_rp[j], &state->alloc);
|
||||
radv_DestroyRenderPass(radv_device_to_handle(device),
|
||||
state->blit2d.stencil_only_rp[j], &state->alloc);
|
||||
state->blit2d_stencil_only_rp[j], &state->alloc);
|
||||
}
|
||||
|
||||
for (unsigned src = 0; src < BLIT2D_NUM_SRC_TYPES; src++) {
|
||||
radv_DestroyPipelineLayout(radv_device_to_handle(device),
|
||||
state->blit2d.p_layouts[src],
|
||||
&state->alloc);
|
||||
radv_DestroyDescriptorSetLayout(radv_device_to_handle(device),
|
||||
state->blit2d.ds_layouts[src],
|
||||
&state->alloc);
|
||||
for (unsigned log2_samples = 0; log2_samples < 1 + MAX_SAMPLES_LOG2; ++log2_samples) {
|
||||
for (unsigned src = 0; src < BLIT2D_NUM_SRC_TYPES; src++) {
|
||||
radv_DestroyPipelineLayout(radv_device_to_handle(device),
|
||||
state->blit2d[log2_samples].p_layouts[src],
|
||||
&state->alloc);
|
||||
radv_DestroyDescriptorSetLayout(radv_device_to_handle(device),
|
||||
state->blit2d[log2_samples].ds_layouts[src],
|
||||
&state->alloc);
|
||||
|
||||
for (unsigned j = 0; j < NUM_META_FS_KEYS; ++j) {
|
||||
radv_DestroyPipeline(radv_device_to_handle(device),
|
||||
state->blit2d[log2_samples].pipelines[src][j],
|
||||
&state->alloc);
|
||||
}
|
||||
|
||||
for (unsigned j = 0; j < NUM_META_FS_KEYS; ++j) {
|
||||
radv_DestroyPipeline(radv_device_to_handle(device),
|
||||
state->blit2d.pipelines[src][j],
|
||||
state->blit2d[log2_samples].depth_only_pipeline[src],
|
||||
&state->alloc);
|
||||
radv_DestroyPipeline(radv_device_to_handle(device),
|
||||
state->blit2d[log2_samples].stencil_only_pipeline[src],
|
||||
&state->alloc);
|
||||
}
|
||||
|
||||
radv_DestroyPipeline(radv_device_to_handle(device),
|
||||
state->blit2d.depth_only_pipeline[src],
|
||||
&state->alloc);
|
||||
radv_DestroyPipeline(radv_device_to_handle(device),
|
||||
state->blit2d.stencil_only_pipeline[src],
|
||||
&state->alloc);
|
||||
}
|
||||
}
|
||||
|
||||
static VkResult
|
||||
blit2d_init_color_pipeline(struct radv_device *device,
|
||||
enum blit2d_src_type src_type,
|
||||
VkFormat format)
|
||||
VkFormat format,
|
||||
uint32_t log2_samples)
|
||||
{
|
||||
VkResult result;
|
||||
unsigned fs_key = radv_format_meta_fs_key(format);
|
||||
@@ -681,7 +758,7 @@ blit2d_init_color_pipeline(struct radv_device *device,
|
||||
struct radv_shader_module fs = { .nir = NULL };
|
||||
|
||||
|
||||
fs.nir = build_nir_copy_fragment_shader(device, src_func, name, src_type == BLIT2D_SRC_TYPE_IMAGE_3D);
|
||||
fs.nir = build_nir_copy_fragment_shader(device, src_func, name, src_type == BLIT2D_SRC_TYPE_IMAGE_3D, log2_samples > 0);
|
||||
vi_create_info = &normal_vi_create_info;
|
||||
|
||||
struct radv_shader_module vs = {
|
||||
@@ -705,7 +782,7 @@ blit2d_init_color_pipeline(struct radv_device *device,
|
||||
};
|
||||
|
||||
for (unsigned dst_layout = 0; dst_layout < RADV_META_DST_LAYOUT_COUNT; ++dst_layout) {
|
||||
if (!device->meta_state.blit2d.render_passes[fs_key][dst_layout]) {
|
||||
if (!device->meta_state.blit2d_render_passes[fs_key][dst_layout]) {
|
||||
VkImageLayout layout = radv_meta_dst_layout_to_layout(dst_layout);
|
||||
|
||||
result = radv_CreateRenderPass(radv_device_to_handle(device),
|
||||
@@ -737,7 +814,7 @@ blit2d_init_color_pipeline(struct radv_device *device,
|
||||
.pPreserveAttachments = (uint32_t[]) { 0 },
|
||||
},
|
||||
.dependencyCount = 0,
|
||||
}, &device->meta_state.alloc, &device->meta_state.blit2d.render_passes[fs_key][dst_layout]);
|
||||
}, &device->meta_state.alloc, &device->meta_state.blit2d_render_passes[fs_key][dst_layout]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -765,7 +842,7 @@ blit2d_init_color_pipeline(struct radv_device *device,
|
||||
},
|
||||
.pMultisampleState = &(VkPipelineMultisampleStateCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
|
||||
.rasterizationSamples = 1,
|
||||
.rasterizationSamples = 1 << log2_samples,
|
||||
.sampleShadingEnable = false,
|
||||
.pSampleMask = (VkSampleMask[]) { UINT32_MAX },
|
||||
},
|
||||
@@ -796,8 +873,8 @@ blit2d_init_color_pipeline(struct radv_device *device,
|
||||
},
|
||||
},
|
||||
.flags = 0,
|
||||
.layout = device->meta_state.blit2d.p_layouts[src_type],
|
||||
.renderPass = device->meta_state.blit2d.render_passes[fs_key][0],
|
||||
.layout = device->meta_state.blit2d[log2_samples].p_layouts[src_type],
|
||||
.renderPass = device->meta_state.blit2d_render_passes[fs_key][0],
|
||||
.subpass = 0,
|
||||
};
|
||||
|
||||
@@ -809,7 +886,7 @@ blit2d_init_color_pipeline(struct radv_device *device,
|
||||
radv_pipeline_cache_to_handle(&device->meta_state.cache),
|
||||
&vk_pipeline_info, &radv_pipeline_info,
|
||||
&device->meta_state.alloc,
|
||||
&device->meta_state.blit2d.pipelines[src_type][fs_key]);
|
||||
&device->meta_state.blit2d[log2_samples].pipelines[src_type][fs_key]);
|
||||
|
||||
|
||||
ralloc_free(vs.nir);
|
||||
@@ -820,7 +897,8 @@ blit2d_init_color_pipeline(struct radv_device *device,
|
||||
|
||||
static VkResult
|
||||
blit2d_init_depth_only_pipeline(struct radv_device *device,
|
||||
enum blit2d_src_type src_type)
|
||||
enum blit2d_src_type src_type,
|
||||
uint32_t log2_samples)
|
||||
{
|
||||
VkResult result;
|
||||
const char *name;
|
||||
@@ -847,7 +925,7 @@ blit2d_init_depth_only_pipeline(struct radv_device *device,
|
||||
const VkPipelineVertexInputStateCreateInfo *vi_create_info;
|
||||
struct radv_shader_module fs = { .nir = NULL };
|
||||
|
||||
fs.nir = build_nir_copy_fragment_shader_depth(device, src_func, name, src_type == BLIT2D_SRC_TYPE_IMAGE_3D);
|
||||
fs.nir = build_nir_copy_fragment_shader_depth(device, src_func, name, src_type == BLIT2D_SRC_TYPE_IMAGE_3D, log2_samples > 0);
|
||||
vi_create_info = &normal_vi_create_info;
|
||||
|
||||
struct radv_shader_module vs = {
|
||||
@@ -871,7 +949,7 @@ blit2d_init_depth_only_pipeline(struct radv_device *device,
|
||||
};
|
||||
|
||||
for (enum radv_blit_ds_layout ds_layout = RADV_BLIT_DS_LAYOUT_TILE_ENABLE; ds_layout < RADV_BLIT_DS_LAYOUT_COUNT; ds_layout++) {
|
||||
if (!device->meta_state.blit2d.depth_only_rp[ds_layout]) {
|
||||
if (!device->meta_state.blit2d_depth_only_rp[ds_layout]) {
|
||||
VkImageLayout layout = radv_meta_blit_ds_to_layout(ds_layout);
|
||||
result = radv_CreateRenderPass(radv_device_to_handle(device),
|
||||
&(VkRenderPassCreateInfo) {
|
||||
@@ -899,7 +977,7 @@ blit2d_init_depth_only_pipeline(struct radv_device *device,
|
||||
.pPreserveAttachments = (uint32_t[]) { 0 },
|
||||
},
|
||||
.dependencyCount = 0,
|
||||
}, &device->meta_state.alloc, &device->meta_state.blit2d.depth_only_rp[ds_layout]);
|
||||
}, &device->meta_state.alloc, &device->meta_state.blit2d_depth_only_rp[ds_layout]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -927,7 +1005,7 @@ blit2d_init_depth_only_pipeline(struct radv_device *device,
|
||||
},
|
||||
.pMultisampleState = &(VkPipelineMultisampleStateCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
|
||||
.rasterizationSamples = 1,
|
||||
.rasterizationSamples = 1 << log2_samples,
|
||||
.sampleShadingEnable = false,
|
||||
.pSampleMask = (VkSampleMask[]) { UINT32_MAX },
|
||||
},
|
||||
@@ -958,8 +1036,8 @@ blit2d_init_depth_only_pipeline(struct radv_device *device,
|
||||
},
|
||||
},
|
||||
.flags = 0,
|
||||
.layout = device->meta_state.blit2d.p_layouts[src_type],
|
||||
.renderPass = device->meta_state.blit2d.depth_only_rp[0],
|
||||
.layout = device->meta_state.blit2d[log2_samples].p_layouts[src_type],
|
||||
.renderPass = device->meta_state.blit2d_depth_only_rp[0],
|
||||
.subpass = 0,
|
||||
};
|
||||
|
||||
@@ -971,7 +1049,7 @@ blit2d_init_depth_only_pipeline(struct radv_device *device,
|
||||
radv_pipeline_cache_to_handle(&device->meta_state.cache),
|
||||
&vk_pipeline_info, &radv_pipeline_info,
|
||||
&device->meta_state.alloc,
|
||||
&device->meta_state.blit2d.depth_only_pipeline[src_type]);
|
||||
&device->meta_state.blit2d[log2_samples].depth_only_pipeline[src_type]);
|
||||
|
||||
|
||||
ralloc_free(vs.nir);
|
||||
@@ -982,7 +1060,8 @@ blit2d_init_depth_only_pipeline(struct radv_device *device,
|
||||
|
||||
static VkResult
|
||||
blit2d_init_stencil_only_pipeline(struct radv_device *device,
|
||||
enum blit2d_src_type src_type)
|
||||
enum blit2d_src_type src_type,
|
||||
uint32_t log2_samples)
|
||||
{
|
||||
VkResult result;
|
||||
const char *name;
|
||||
@@ -1009,7 +1088,7 @@ blit2d_init_stencil_only_pipeline(struct radv_device *device,
|
||||
const VkPipelineVertexInputStateCreateInfo *vi_create_info;
|
||||
struct radv_shader_module fs = { .nir = NULL };
|
||||
|
||||
fs.nir = build_nir_copy_fragment_shader_stencil(device, src_func, name, src_type == BLIT2D_SRC_TYPE_IMAGE_3D);
|
||||
fs.nir = build_nir_copy_fragment_shader_stencil(device, src_func, name, src_type == BLIT2D_SRC_TYPE_IMAGE_3D, log2_samples > 0);
|
||||
vi_create_info = &normal_vi_create_info;
|
||||
|
||||
struct radv_shader_module vs = {
|
||||
@@ -1033,7 +1112,7 @@ blit2d_init_stencil_only_pipeline(struct radv_device *device,
|
||||
};
|
||||
|
||||
for (enum radv_blit_ds_layout ds_layout = RADV_BLIT_DS_LAYOUT_TILE_ENABLE; ds_layout < RADV_BLIT_DS_LAYOUT_COUNT; ds_layout++) {
|
||||
if (!device->meta_state.blit2d.stencil_only_rp[ds_layout]) {
|
||||
if (!device->meta_state.blit2d_stencil_only_rp[ds_layout]) {
|
||||
VkImageLayout layout = radv_meta_blit_ds_to_layout(ds_layout);
|
||||
result = radv_CreateRenderPass(radv_device_to_handle(device),
|
||||
&(VkRenderPassCreateInfo) {
|
||||
@@ -1061,7 +1140,7 @@ blit2d_init_stencil_only_pipeline(struct radv_device *device,
|
||||
.pPreserveAttachments = (uint32_t[]) { 0 },
|
||||
},
|
||||
.dependencyCount = 0,
|
||||
}, &device->meta_state.alloc, &device->meta_state.blit2d.stencil_only_rp[ds_layout]);
|
||||
}, &device->meta_state.alloc, &device->meta_state.blit2d_stencil_only_rp[ds_layout]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1089,7 +1168,7 @@ blit2d_init_stencil_only_pipeline(struct radv_device *device,
|
||||
},
|
||||
.pMultisampleState = &(VkPipelineMultisampleStateCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
|
||||
.rasterizationSamples = 1,
|
||||
.rasterizationSamples = 1 << log2_samples,
|
||||
.sampleShadingEnable = false,
|
||||
.pSampleMask = (VkSampleMask[]) { UINT32_MAX },
|
||||
},
|
||||
@@ -1136,8 +1215,8 @@ blit2d_init_stencil_only_pipeline(struct radv_device *device,
|
||||
},
|
||||
},
|
||||
.flags = 0,
|
||||
.layout = device->meta_state.blit2d.p_layouts[src_type],
|
||||
.renderPass = device->meta_state.blit2d.stencil_only_rp[0],
|
||||
.layout = device->meta_state.blit2d[log2_samples].p_layouts[src_type],
|
||||
.renderPass = device->meta_state.blit2d_stencil_only_rp[0],
|
||||
.subpass = 0,
|
||||
};
|
||||
|
||||
@@ -1149,7 +1228,7 @@ blit2d_init_stencil_only_pipeline(struct radv_device *device,
|
||||
radv_pipeline_cache_to_handle(&device->meta_state.cache),
|
||||
&vk_pipeline_info, &radv_pipeline_info,
|
||||
&device->meta_state.alloc,
|
||||
&device->meta_state.blit2d.stencil_only_pipeline[src_type]);
|
||||
&device->meta_state.blit2d[log2_samples].stencil_only_pipeline[src_type]);
|
||||
|
||||
|
||||
ralloc_free(vs.nir);
|
||||
@@ -1175,15 +1254,16 @@ static VkFormat pipeline_formats[] = {
|
||||
|
||||
static VkResult
|
||||
meta_blit2d_create_pipe_layout(struct radv_device *device,
|
||||
int idx)
|
||||
int idx,
|
||||
uint32_t log2_samples)
|
||||
{
|
||||
VkResult result;
|
||||
VkDescriptorType desc_type = (idx == BLIT2D_SRC_TYPE_BUFFER) ? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
|
||||
const VkPushConstantRange push_constant_ranges[] = {
|
||||
{VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
|
||||
{VK_SHADER_STAGE_FRAGMENT_BIT, 16, 4},
|
||||
{VK_SHADER_STAGE_FRAGMENT_BIT, 16, 12},
|
||||
};
|
||||
int num_push_constant_range = (idx != BLIT2D_SRC_TYPE_IMAGE) ? 2 : 1;
|
||||
int num_push_constant_range = (idx != BLIT2D_SRC_TYPE_IMAGE || log2_samples > 0) ? 2 : 1;
|
||||
|
||||
result = radv_CreateDescriptorSetLayout(radv_device_to_handle(device),
|
||||
&(VkDescriptorSetLayoutCreateInfo) {
|
||||
@@ -1199,7 +1279,7 @@ meta_blit2d_create_pipe_layout(struct radv_device *device,
|
||||
.pImmutableSamplers = NULL
|
||||
},
|
||||
}
|
||||
}, &device->meta_state.alloc, &device->meta_state.blit2d.ds_layouts[idx]);
|
||||
}, &device->meta_state.alloc, &device->meta_state.blit2d[log2_samples].ds_layouts[idx]);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
@@ -1207,11 +1287,11 @@ meta_blit2d_create_pipe_layout(struct radv_device *device,
|
||||
&(VkPipelineLayoutCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
|
||||
.setLayoutCount = 1,
|
||||
.pSetLayouts = &device->meta_state.blit2d.ds_layouts[idx],
|
||||
.pSetLayouts = &device->meta_state.blit2d[log2_samples].ds_layouts[idx],
|
||||
.pushConstantRangeCount = num_push_constant_range,
|
||||
.pPushConstantRanges = push_constant_ranges,
|
||||
},
|
||||
&device->meta_state.alloc, &device->meta_state.blit2d.p_layouts[idx]);
|
||||
&device->meta_state.alloc, &device->meta_state.blit2d[log2_samples].p_layouts[idx]);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
return VK_SUCCESS;
|
||||
@@ -1225,27 +1305,33 @@ radv_device_init_meta_blit2d_state(struct radv_device *device)
|
||||
VkResult result;
|
||||
bool create_3d = device->physical_device->rad_info.chip_class >= GFX9;
|
||||
|
||||
for (unsigned src = 0; src < BLIT2D_NUM_SRC_TYPES; src++) {
|
||||
if (src == BLIT2D_SRC_TYPE_IMAGE_3D && !create_3d)
|
||||
continue;
|
||||
for (unsigned log2_samples = 0; log2_samples < 1 + MAX_SAMPLES_LOG2; log2_samples++) {
|
||||
for (unsigned src = 0; src < BLIT2D_NUM_SRC_TYPES; src++) {
|
||||
if (src == BLIT2D_SRC_TYPE_IMAGE_3D && !create_3d)
|
||||
continue;
|
||||
|
||||
result = meta_blit2d_create_pipe_layout(device, src);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
/* Don't need to handle copies between buffers and multisample images. */
|
||||
if (src == BLIT2D_SRC_TYPE_BUFFER && log2_samples > 0)
|
||||
continue;
|
||||
|
||||
for (unsigned j = 0; j < ARRAY_SIZE(pipeline_formats); ++j) {
|
||||
result = blit2d_init_color_pipeline(device, src, pipeline_formats[j]);
|
||||
result = meta_blit2d_create_pipe_layout(device, src, log2_samples);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
for (unsigned j = 0; j < ARRAY_SIZE(pipeline_formats); ++j) {
|
||||
result = blit2d_init_color_pipeline(device, src, pipeline_formats[j], log2_samples);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
result = blit2d_init_depth_only_pipeline(device, src, log2_samples);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
result = blit2d_init_stencil_only_pipeline(device, src, log2_samples);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
result = blit2d_init_depth_only_pipeline(device, src);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
result = blit2d_init_stencil_only_pipeline(device, src);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
return VK_SUCCESS;
|
||||
|
@@ -87,8 +87,8 @@ VkResult radv_CreateRenderPass(
|
||||
subpass_attachment_count +=
|
||||
desc->inputAttachmentCount +
|
||||
desc->colorAttachmentCount +
|
||||
/* Count colorAttachmentCount again for resolve_attachments */
|
||||
desc->colorAttachmentCount;
|
||||
(desc->pResolveAttachments ? desc->colorAttachmentCount : 0) +
|
||||
(desc->pDepthStencilAttachment != NULL);
|
||||
}
|
||||
|
||||
if (subpass_attachment_count) {
|
||||
|
@@ -465,18 +465,18 @@ struct radv_meta_state {
|
||||
} blit;
|
||||
|
||||
struct {
|
||||
VkRenderPass render_passes[NUM_META_FS_KEYS][RADV_META_DST_LAYOUT_COUNT];
|
||||
VkPipelineLayout p_layouts[5];
|
||||
VkDescriptorSetLayout ds_layouts[5];
|
||||
VkPipeline pipelines[5][NUM_META_FS_KEYS];
|
||||
|
||||
VkPipelineLayout p_layouts[3];
|
||||
VkDescriptorSetLayout ds_layouts[3];
|
||||
VkPipeline pipelines[3][NUM_META_FS_KEYS];
|
||||
VkPipeline depth_only_pipeline[5];
|
||||
|
||||
VkRenderPass depth_only_rp[RADV_BLIT_DS_LAYOUT_COUNT];
|
||||
VkPipeline depth_only_pipeline[3];
|
||||
VkPipeline stencil_only_pipeline[5];
|
||||
} blit2d[1 + MAX_SAMPLES_LOG2];
|
||||
|
||||
VkRenderPass stencil_only_rp[RADV_BLIT_DS_LAYOUT_COUNT];
|
||||
VkPipeline stencil_only_pipeline[3];
|
||||
} blit2d;
|
||||
VkRenderPass blit2d_render_passes[NUM_META_FS_KEYS][RADV_META_DST_LAYOUT_COUNT];
|
||||
VkRenderPass blit2d_depth_only_rp[RADV_BLIT_DS_LAYOUT_COUNT];
|
||||
VkRenderPass blit2d_stencil_only_rp[RADV_BLIT_DS_LAYOUT_COUNT];
|
||||
|
||||
struct {
|
||||
VkPipelineLayout img_p_layout;
|
||||
|
@@ -488,4 +488,11 @@ vk_to_non_srgb_format(VkFormat format)
|
||||
}
|
||||
}
|
||||
|
||||
static inline unsigned
|
||||
vk_format_get_nr_components(VkFormat format)
|
||||
{
|
||||
const struct vk_format_description *desc = vk_format_description(format);
|
||||
return desc->nr_channels;
|
||||
}
|
||||
|
||||
#endif /* VK_FORMAT_H */
|
||||
|
@@ -501,6 +501,7 @@ radv_amdgpu_winsys_bo_from_fd(struct radeon_winsys *_ws,
|
||||
bo->size = result.alloc_size;
|
||||
bo->is_shared = true;
|
||||
bo->ws = ws;
|
||||
bo->ref_count = 1;
|
||||
radv_amdgpu_add_buffer_to_global_list(bo);
|
||||
return (struct radeon_winsys_bo *)bo;
|
||||
error_va_map:
|
||||
|
@@ -474,7 +474,13 @@ enum {
|
||||
|
||||
struct ast_type_qualifier {
|
||||
DECLARE_RALLOC_CXX_OPERATORS(ast_type_qualifier);
|
||||
DECLARE_BITSET_T(bitset_t, 128);
|
||||
/* Note: this bitset needs to have at least as many bits as the 'q'
|
||||
* struct has flags, below. Previously, the size was 128 instead of 96.
|
||||
* But an apparent bug in GCC 5.4.0 causes bad SSE code generation
|
||||
* elsewhere, leading to a crash. 96 bits works around the issue.
|
||||
* See https://bugs.freedesktop.org/show_bug.cgi?id=105497
|
||||
*/
|
||||
DECLARE_BITSET_T(bitset_t, 96);
|
||||
|
||||
union flags {
|
||||
struct {
|
||||
|
@@ -78,7 +78,8 @@ def _valgrind(glcpp, filename):
|
||||
extra_args = parse_test_file(filename, nl_format='\n')
|
||||
|
||||
try:
|
||||
_, tmpfile = tempfile.mkstemp()
|
||||
fd, tmpfile = tempfile.mkstemp()
|
||||
os.close(fd)
|
||||
with open(filename, 'rb') as f:
|
||||
proc = subprocess.Popen(
|
||||
['valgrind', '--error-exitcode=31', '--log-file', tmpfile, glcpp] + extra_args,
|
||||
@@ -135,7 +136,8 @@ def _replace_test(args, replace):
|
||||
total += 1
|
||||
testfile = os.path.join(args.testdir, filename)
|
||||
try:
|
||||
_, tmpfile = tempfile.mkstemp()
|
||||
fd, tmpfile = tempfile.mkstemp()
|
||||
os.close(fd)
|
||||
with io.open(testfile, 'rt') as f:
|
||||
contents = f.read()
|
||||
with io.open(tmpfile, 'wt') as f:
|
||||
|
@@ -37,6 +37,8 @@ struct lower_returns_state {
|
||||
* needs to be predicated on the return flag variable.
|
||||
*/
|
||||
bool has_predicated_return;
|
||||
|
||||
bool removed_unreachable_code;
|
||||
};
|
||||
|
||||
static bool lower_returns_in_cf_list(struct exec_list *cf_list,
|
||||
@@ -162,8 +164,9 @@ lower_returns_in_block(nir_block *block, struct lower_returns_state *state)
|
||||
*/
|
||||
return false;
|
||||
} else {
|
||||
state->removed_unreachable_code = true;
|
||||
nir_cf_delete(&list);
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,9 +265,11 @@ nir_lower_returns_impl(nir_function_impl *impl)
|
||||
state.loop = NULL;
|
||||
state.return_flag = NULL;
|
||||
state.has_predicated_return = false;
|
||||
state.removed_unreachable_code = false;
|
||||
nir_builder_init(&state.builder, impl);
|
||||
|
||||
bool progress = lower_returns_in_cf_list(&impl->body, &state);
|
||||
progress = progress || state.removed_unreachable_code;
|
||||
|
||||
if (progress) {
|
||||
nir_metadata_preserve(impl, nir_metadata_none);
|
||||
|
@@ -1419,11 +1419,11 @@ apply_var_decoration(struct vtn_builder *b, nir_variable *nir_var,
|
||||
case SpvBuiltInTessLevelInner:
|
||||
nir_var->data.compact = true;
|
||||
break;
|
||||
case SpvBuiltInSamplePosition:
|
||||
nir_var->data.origin_upper_left = b->origin_upper_left;
|
||||
/* fallthrough */
|
||||
case SpvBuiltInFragCoord:
|
||||
nir_var->data.pixel_center_integer = b->pixel_center_integer;
|
||||
/* fallthrough */
|
||||
case SpvBuiltInSamplePosition:
|
||||
nir_var->data.origin_upper_left = b->origin_upper_left;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@@ -864,19 +864,22 @@ dri2_x11_swap_buffers_msc(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw,
|
||||
if (draw->Type == EGL_PIXMAP_BIT || draw->Type == EGL_PBUFFER_BIT)
|
||||
return 0;
|
||||
|
||||
if (draw->SwapBehavior == EGL_BUFFER_PRESERVED || !dri2_dpy->swap_available)
|
||||
return dri2_copy_region(drv, disp, draw, dri2_surf->region) ? 0 : -1;
|
||||
if (draw->SwapBehavior == EGL_BUFFER_PRESERVED || !dri2_dpy->swap_available) {
|
||||
swap_count = dri2_copy_region(drv, disp, draw, dri2_surf->region) ? 0 : -1;
|
||||
} else {
|
||||
dri2_flush_drawable_for_swapbuffers(disp, draw);
|
||||
|
||||
dri2_flush_drawable_for_swapbuffers(disp, draw);
|
||||
cookie = xcb_dri2_swap_buffers_unchecked(dri2_dpy->conn,
|
||||
dri2_surf->drawable, msc_hi,
|
||||
msc_lo, divisor_hi, divisor_lo,
|
||||
remainder_hi, remainder_lo);
|
||||
|
||||
cookie = xcb_dri2_swap_buffers_unchecked(dri2_dpy->conn, dri2_surf->drawable,
|
||||
msc_hi, msc_lo, divisor_hi, divisor_lo, remainder_hi, remainder_lo);
|
||||
reply = xcb_dri2_swap_buffers_reply(dri2_dpy->conn, cookie, NULL);
|
||||
|
||||
reply = xcb_dri2_swap_buffers_reply(dri2_dpy->conn, cookie, NULL);
|
||||
|
||||
if (reply) {
|
||||
swap_count = (((int64_t)reply->swap_hi) << 32) | reply->swap_lo;
|
||||
free(reply);
|
||||
if (reply) {
|
||||
swap_count = (((int64_t)reply->swap_hi) << 32) | reply->swap_lo;
|
||||
free(reply);
|
||||
}
|
||||
}
|
||||
|
||||
/* Since we aren't watching for the server's invalidate events like we're
|
||||
|
@@ -207,6 +207,7 @@ pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd)
|
||||
if (ddev->lib)
|
||||
util_dl_close(ddev->lib);
|
||||
#endif
|
||||
FREE(ddev->base.driver_name);
|
||||
FREE(ddev);
|
||||
return false;
|
||||
}
|
||||
|
@@ -270,6 +270,23 @@ util_hash_table_foreach(struct util_hash_table *ht,
|
||||
}
|
||||
|
||||
|
||||
static enum pipe_error
|
||||
util_hash_inc(void *k, void *v, void *d)
|
||||
{
|
||||
++*(size_t *)d;
|
||||
return PIPE_OK;
|
||||
}
|
||||
|
||||
|
||||
size_t
|
||||
util_hash_table_count(struct util_hash_table *ht)
|
||||
{
|
||||
size_t count = 0;
|
||||
util_hash_table_foreach(ht, util_hash_inc, &count);
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
util_hash_table_destroy(struct util_hash_table *ht)
|
||||
{
|
||||
|
@@ -85,6 +85,11 @@ util_hash_table_foreach(struct util_hash_table *ht,
|
||||
(void *key, void *value, void *data),
|
||||
void *data);
|
||||
|
||||
|
||||
size_t
|
||||
util_hash_table_count(struct util_hash_table *ht);
|
||||
|
||||
|
||||
void
|
||||
util_hash_table_destroy(struct util_hash_table *ht);
|
||||
|
||||
|
@@ -138,8 +138,7 @@ u_transfer_helper_resource_destroy(struct pipe_screen *pscreen,
|
||||
if (helper->vtbl->get_stencil) {
|
||||
struct pipe_resource *stencil = helper->vtbl->get_stencil(prsc);
|
||||
|
||||
if (stencil)
|
||||
helper->vtbl->resource_destroy(pscreen, stencil);
|
||||
pipe_resource_reference(&stencil, NULL);
|
||||
}
|
||||
|
||||
helper->vtbl->resource_destroy(pscreen, prsc);
|
||||
|
@@ -461,11 +461,10 @@ static void evergreen_delete_compute_state(struct pipe_context *ctx, void *state
|
||||
} else {
|
||||
#ifdef HAVE_OPENCL
|
||||
radeon_shader_binary_clean(&shader->binary);
|
||||
pipe_resource_reference(&shader->code_bo, NULL);
|
||||
pipe_resource_reference(&shader->kernel_param, NULL);
|
||||
#endif
|
||||
r600_destroy_shader(&shader->bc);
|
||||
|
||||
/* TODO destroy shader->code_bo, shader->const_bo
|
||||
* we'll need something like r600_buffer_free */
|
||||
}
|
||||
FREE(shader);
|
||||
}
|
||||
|
@@ -2202,7 +2202,7 @@ static void evergreen_emit_constant_buffers(struct r600_context *rctx,
|
||||
radeon_emit(cs, PKT3(PKT3_SET_RESOURCE, 8, 0) | pkt_flags);
|
||||
radeon_emit(cs, (buffer_id_base + buffer_index) * 8);
|
||||
radeon_emit(cs, va); /* RESOURCEi_WORD0 */
|
||||
radeon_emit(cs, rbuffer->b.b.width0 - cb->buffer_offset - 1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, cb->buffer_size -1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, /* RESOURCEi_WORD2 */
|
||||
S_030008_ENDIAN_SWAP(gs_ring_buffer ? ENDIAN_NONE : r600_endian_swap(32)) |
|
||||
S_030008_STRIDE(gs_ring_buffer ? 4 : 16) |
|
||||
|
@@ -65,7 +65,7 @@ static const struct debug_named_value r600_debug_options[] = {
|
||||
static void r600_destroy_context(struct pipe_context *context)
|
||||
{
|
||||
struct r600_context *rctx = (struct r600_context *)context;
|
||||
unsigned sh;
|
||||
unsigned sh, i;
|
||||
|
||||
r600_isa_destroy(rctx->isa);
|
||||
|
||||
@@ -104,6 +104,10 @@ static void r600_destroy_context(struct pipe_context *context)
|
||||
}
|
||||
util_unreference_framebuffer_state(&rctx->framebuffer.state);
|
||||
|
||||
for (sh = 0; sh < PIPE_SHADER_TYPES; ++sh)
|
||||
for (i = 0; i < PIPE_MAX_CONSTANT_BUFFERS; ++i)
|
||||
rctx->b.b.set_constant_buffer(context, sh, i, NULL);
|
||||
|
||||
if (rctx->blitter) {
|
||||
util_blitter_destroy(rctx->blitter);
|
||||
}
|
||||
|
@@ -1729,7 +1729,7 @@ static void r600_emit_constant_buffers(struct r600_context *rctx,
|
||||
radeon_emit(cs, PKT3(PKT3_SET_RESOURCE, 7, 0));
|
||||
radeon_emit(cs, (buffer_id_base + buffer_index) * 7);
|
||||
radeon_emit(cs, offset); /* RESOURCEi_WORD0 */
|
||||
radeon_emit(cs, rbuffer->b.b.width0 - offset - 1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, cb->buffer_size - 1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, /* RESOURCEi_WORD2 */
|
||||
S_038008_ENDIAN_SWAP(gs_ring_buffer ? ENDIAN_NONE : r600_endian_swap(32)) |
|
||||
S_038008_STRIDE(gs_ring_buffer ? 4 : 16));
|
||||
|
@@ -477,12 +477,28 @@ static int si_get_shader_param(struct pipe_screen* pscreen,
|
||||
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
/* TODO: Indirect indexing of GS inputs is unimplemented. */
|
||||
return shader != PIPE_SHADER_GEOMETRY &&
|
||||
(sscreen->llvm_has_working_vgpr_indexing ||
|
||||
/* TCS and TES load inputs directly from LDS or
|
||||
* offchip memory, so indirect indexing is trivial. */
|
||||
shader == PIPE_SHADER_TESS_CTRL ||
|
||||
shader == PIPE_SHADER_TESS_EVAL);
|
||||
if (shader == PIPE_SHADER_GEOMETRY)
|
||||
return 0;
|
||||
|
||||
if (shader == PIPE_SHADER_VERTEX &&
|
||||
!sscreen->llvm_has_working_vgpr_indexing)
|
||||
return 0;
|
||||
|
||||
/* Doing indirect indexing on GFX9 with LLVM 6.0 hangs.
|
||||
* This means we don't support INTERP instructions with
|
||||
* indirect indexing on inputs.
|
||||
*/
|
||||
if (shader == PIPE_SHADER_FRAGMENT &&
|
||||
!sscreen->llvm_has_working_vgpr_indexing &&
|
||||
HAVE_LLVM < 0x0700)
|
||||
return 0;
|
||||
|
||||
/* TCS and TES load inputs directly from LDS or offchip
|
||||
* memory, so indirect indexing is always supported.
|
||||
* PS has to support indirect indexing, because we can't
|
||||
* lower that to TEMPs for INTERP instructions.
|
||||
*/
|
||||
return 1;
|
||||
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
return sscreen->llvm_has_working_vgpr_indexing ||
|
||||
|
@@ -353,7 +353,7 @@ OMX_ERRORTYPE enc_LoadImage_common(vid_enc_PrivateType * priv, OMX_VIDEO_PORTDEF
|
||||
blit.src.resource = inp->resource;
|
||||
blit.src.format = inp->resource->format;
|
||||
|
||||
blit.src.box.x = 0;
|
||||
blit.src.box.x = -1;
|
||||
blit.src.box.y = def->nFrameHeight;
|
||||
blit.src.box.width = def->nFrameWidth;
|
||||
blit.src.box.height = def->nFrameHeight / 2 ;
|
||||
@@ -367,11 +367,11 @@ OMX_ERRORTYPE enc_LoadImage_common(vid_enc_PrivateType * priv, OMX_VIDEO_PORTDEF
|
||||
blit.dst.box.depth = 1;
|
||||
blit.filter = PIPE_TEX_FILTER_NEAREST;
|
||||
|
||||
blit.mask = PIPE_MASK_G;
|
||||
blit.mask = PIPE_MASK_R;
|
||||
priv->s_pipe->blit(priv->s_pipe, &blit);
|
||||
|
||||
blit.src.box.x = 1;
|
||||
blit.mask = PIPE_MASK_R;
|
||||
blit.src.box.x = 0;
|
||||
blit.mask = PIPE_MASK_G;
|
||||
priv->s_pipe->blit(priv->s_pipe, &blit);
|
||||
priv->s_pipe->flush(priv->s_pipe, NULL, 0);
|
||||
|
||||
|
@@ -21,10 +21,9 @@
|
||||
libgraw_xlib = shared_library(
|
||||
'graw_xlib',
|
||||
['graw_xlib.c'],
|
||||
c_args : ['-DGALLIUM_TRACE', '-DGALLIUM_RBUG'],
|
||||
include_directories : [inc_common, inc_gallium_drivers, inc_gallium_winsys],
|
||||
link_with : [
|
||||
libgraw_util, libtrace, librbug, libmesa_util, libgallium, libws_xlib
|
||||
libgraw_util, libmesa_util, libgallium, libws_xlib
|
||||
],
|
||||
dependencies : [dep_thread, driver_swrast],
|
||||
version : '1.0',
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
include $(top_srcdir)/src/gallium/Automake.inc
|
||||
|
||||
EXTRA_DIST = SConscript
|
||||
EXTRA_DIST = SConscript meson.build
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(GALLIUM_CFLAGS)
|
||||
@@ -32,5 +32,3 @@ u_format_test_SOURCES = u_format_test.c
|
||||
u_format_compatible_test_SOURCES = u_format_compatible_test.c
|
||||
|
||||
translate_test_SOURCES = translate_test.c
|
||||
|
||||
EXTRA_DIST = meson.build
|
||||
|
@@ -220,8 +220,13 @@ static bool amdgpu_winsys_unref(struct radeon_winsys *rws)
|
||||
simple_mtx_lock(&dev_tab_mutex);
|
||||
|
||||
destroy = pipe_reference(&ws->reference, NULL);
|
||||
if (destroy && dev_tab)
|
||||
if (destroy && dev_tab) {
|
||||
util_hash_table_remove(dev_tab, ws->dev);
|
||||
if (util_hash_table_count(dev_tab) == 0) {
|
||||
util_hash_table_destroy(dev_tab);
|
||||
dev_tab = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
simple_mtx_unlock(&dev_tab_mutex);
|
||||
return destroy;
|
||||
|
@@ -719,8 +719,13 @@ static bool radeon_winsys_unref(struct radeon_winsys *ws)
|
||||
mtx_lock(&fd_tab_mutex);
|
||||
|
||||
destroy = pipe_reference(&rws->reference, NULL);
|
||||
if (destroy && fd_tab)
|
||||
if (destroy && fd_tab) {
|
||||
util_hash_table_remove(fd_tab, intptr_to_pointer(rws->fd));
|
||||
if (util_hash_table_count(fd_tab) == 0) {
|
||||
util_hash_table_destroy(fd_tab);
|
||||
fd_tab = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
mtx_unlock(&fd_tab_mutex);
|
||||
return destroy;
|
||||
|
@@ -64,10 +64,12 @@ EXTRA_DIST += \
|
||||
vulkan/TODO
|
||||
|
||||
vulkan/dev_icd.json : vulkan/anv_extensions.py vulkan/anv_icd.py
|
||||
$(MKDIR_GEN)
|
||||
$(AM_V_GEN)$(PYTHON2) $(srcdir)/vulkan/anv_icd.py \
|
||||
--lib-path="${abs_top_builddir}/${LIB_DIR}" --out $@
|
||||
|
||||
vulkan/intel_icd.@host_cpu@.json : vulkan/anv_extensions.py vulkan/anv_icd.py
|
||||
$(MKDIR_GEN)
|
||||
$(AM_V_GEN)$(PYTHON2) $(srcdir)/vulkan/anv_icd.py \
|
||||
--lib-path="${libdir}" --out $@
|
||||
|
||||
|
@@ -842,6 +842,8 @@ fs_inst::size_read(int arg) const
|
||||
case SHADER_OPCODE_TYPED_ATOMIC:
|
||||
case SHADER_OPCODE_TYPED_SURFACE_READ:
|
||||
case SHADER_OPCODE_TYPED_SURFACE_WRITE:
|
||||
case FS_OPCODE_INTERPOLATE_AT_SAMPLE:
|
||||
case FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET:
|
||||
case FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET:
|
||||
case SHADER_OPCODE_BYTE_SCATTERED_WRITE:
|
||||
case SHADER_OPCODE_BYTE_SCATTERED_READ:
|
||||
|
@@ -334,6 +334,31 @@ public:
|
||||
opcode != BRW_OPCODE_IF &&
|
||||
opcode != BRW_OPCODE_WHILE));
|
||||
}
|
||||
|
||||
bool reads_g0_implicitly() const
|
||||
{
|
||||
switch (opcode) {
|
||||
case SHADER_OPCODE_TEX:
|
||||
case SHADER_OPCODE_TXL:
|
||||
case SHADER_OPCODE_TXD:
|
||||
case SHADER_OPCODE_TXF:
|
||||
case SHADER_OPCODE_TXF_CMS_W:
|
||||
case SHADER_OPCODE_TXF_CMS:
|
||||
case SHADER_OPCODE_TXF_MCS:
|
||||
case SHADER_OPCODE_TXS:
|
||||
case SHADER_OPCODE_TG4:
|
||||
case SHADER_OPCODE_TG4_OFFSET:
|
||||
case SHADER_OPCODE_SAMPLEINFO:
|
||||
case VS_OPCODE_PULL_CONSTANT_LOAD:
|
||||
case GS_OPCODE_SET_PRIMITIVE_ID:
|
||||
case GS_OPCODE_GET_INSTANCE_ID:
|
||||
case SHADER_OPCODE_GEN4_SCRATCH_READ:
|
||||
case SHADER_OPCODE_GEN4_SCRATCH_WRITE:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -705,7 +705,7 @@ static inline struct brw_reg
|
||||
brw_imm_w(int16_t w)
|
||||
{
|
||||
struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_W);
|
||||
imm.d = w | (w << 16);
|
||||
imm.ud = (uint16_t)w | (uint32_t)(uint16_t)w << 16;
|
||||
return imm;
|
||||
}
|
||||
|
||||
|
@@ -1267,6 +1267,9 @@ vec4_instruction_scheduler::calculate_deps()
|
||||
}
|
||||
}
|
||||
|
||||
if (inst->reads_g0_implicitly())
|
||||
add_dep(last_fixed_grf_write, n);
|
||||
|
||||
if (!inst->is_send_from_grf()) {
|
||||
for (int i = 0; i < inst->mlen; i++) {
|
||||
/* It looks like the MRF regs are released in the send
|
||||
|
@@ -580,9 +580,11 @@ brw_negate_immediate(enum brw_reg_type type, struct brw_reg *reg)
|
||||
reg->d = -reg->d;
|
||||
return true;
|
||||
case BRW_REGISTER_TYPE_W:
|
||||
case BRW_REGISTER_TYPE_UW:
|
||||
reg->d = -(int16_t)reg->ud;
|
||||
case BRW_REGISTER_TYPE_UW: {
|
||||
uint16_t value = -(int16_t)reg->ud;
|
||||
reg->ud = value | (uint32_t)value << 16;
|
||||
return true;
|
||||
}
|
||||
case BRW_REGISTER_TYPE_F:
|
||||
reg->f = -reg->f;
|
||||
return true;
|
||||
@@ -618,9 +620,11 @@ brw_abs_immediate(enum brw_reg_type type, struct brw_reg *reg)
|
||||
case BRW_REGISTER_TYPE_D:
|
||||
reg->d = abs(reg->d);
|
||||
return true;
|
||||
case BRW_REGISTER_TYPE_W:
|
||||
reg->d = abs((int16_t)reg->ud);
|
||||
case BRW_REGISTER_TYPE_W: {
|
||||
uint16_t value = abs((int16_t)reg->ud);
|
||||
reg->ud = value | (uint32_t)value << 16;
|
||||
return true;
|
||||
}
|
||||
case BRW_REGISTER_TYPE_F:
|
||||
reg->f = fabsf(reg->f);
|
||||
return true;
|
||||
|
@@ -1044,11 +1044,7 @@ gen_device_info_update_from_topology(struct gen_device_info *devinfo,
|
||||
for (int b = 0; b < eu_mask_len; b++)
|
||||
n_eus += __builtin_popcount(devinfo->eu_masks[b]);
|
||||
|
||||
/* We expect the total number of EUs to be uniformly distributed throughout
|
||||
* the subslices.
|
||||
*/
|
||||
assert(n_subslices && (n_eus % n_subslices) == 0);
|
||||
devinfo->num_eu_per_subslice = n_eus / n_subslices;
|
||||
devinfo->num_eu_per_subslice = DIV_ROUND_UP(n_eus, n_subslices);
|
||||
}
|
||||
|
||||
bool
|
||||
|
@@ -508,12 +508,12 @@ anv_block_pool_grow(struct anv_block_pool *pool, struct anv_block_state *state)
|
||||
assert(center_bo_offset >= back_used);
|
||||
|
||||
/* Make sure we don't shrink the back end of the pool */
|
||||
if (center_bo_offset < pool->back_state.end)
|
||||
center_bo_offset = pool->back_state.end;
|
||||
if (center_bo_offset < back_required)
|
||||
center_bo_offset = back_required;
|
||||
|
||||
/* Make sure that we don't shrink the front end of the pool */
|
||||
if (size - center_bo_offset < pool->state.end)
|
||||
center_bo_offset = size - pool->state.end;
|
||||
if (size - center_bo_offset < front_required)
|
||||
center_bo_offset = size - front_required;
|
||||
}
|
||||
|
||||
assert(center_bo_offset % PAGE_SIZE == 0);
|
||||
|
@@ -1179,6 +1179,7 @@ PFN_vkVoidFunction anv_GetInstanceProcAddr(
|
||||
|
||||
LOOKUP_ANV_ENTRYPOINT(EnumerateInstanceExtensionProperties);
|
||||
LOOKUP_ANV_ENTRYPOINT(EnumerateInstanceLayerProperties);
|
||||
LOOKUP_ANV_ENTRYPOINT(EnumerateInstanceVersion);
|
||||
LOOKUP_ANV_ENTRYPOINT(CreateInstance);
|
||||
|
||||
#undef LOOKUP_ANV_ENTRYPOINT
|
||||
|
@@ -1420,10 +1420,18 @@ genX(BeginCommandBuffer)(
|
||||
* context restore, so the mentioned hang doesn't happen. However,
|
||||
* software must program push constant commands for all stages prior to
|
||||
* rendering anything. So we flag them dirty in BeginCommandBuffer.
|
||||
*
|
||||
* Finally, we also make sure to stall at pixel scoreboard to make sure the
|
||||
* constants have been loaded into the EUs prior to disable the push constants
|
||||
* so that it doesn't hang a previous 3DPRIMITIVE.
|
||||
*/
|
||||
static void
|
||||
emit_isp_disable(struct anv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
||||
pc.StallAtPixelScoreboard = true;
|
||||
pc.CommandStreamerStallEnable = true;
|
||||
}
|
||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
||||
pc.IndirectStatePointersDisable = true;
|
||||
pc.CommandStreamerStallEnable = true;
|
||||
|
@@ -420,13 +420,6 @@ dri3_handle_present_event(struct loader_dri3_drawable *draw,
|
||||
|
||||
if (buf && buf->pixmap == ie->pixmap)
|
||||
buf->busy = 0;
|
||||
|
||||
if (buf && draw->cur_blit_source != b && !buf->busy &&
|
||||
(buf->reallocate ||
|
||||
(draw->num_back <= b && b < LOADER_DRI3_MAX_BACK))) {
|
||||
dri3_free_render_buffer(draw, buf);
|
||||
draw->buffers[b] = NULL;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -559,7 +552,6 @@ dri3_find_back(struct loader_dri3_drawable *draw)
|
||||
/* Check whether we need to reuse the current back buffer as new back.
|
||||
* In that case, wait until it's not busy anymore.
|
||||
*/
|
||||
dri3_update_num_back(draw);
|
||||
num_to_consider = draw->num_back;
|
||||
if (!loader_dri3_have_image_blit(draw) && draw->cur_blit_source != -1) {
|
||||
num_to_consider = 1;
|
||||
@@ -1813,6 +1805,7 @@ loader_dri3_get_buffers(__DRIdrawable *driDrawable,
|
||||
{
|
||||
struct loader_dri3_drawable *draw = loaderPrivate;
|
||||
struct loader_dri3_buffer *front, *back;
|
||||
int buf_id;
|
||||
|
||||
buffers->image_mask = 0;
|
||||
buffers->front = NULL;
|
||||
@@ -1824,6 +1817,16 @@ loader_dri3_get_buffers(__DRIdrawable *driDrawable,
|
||||
if (!dri3_update_drawable(driDrawable, draw))
|
||||
return false;
|
||||
|
||||
dri3_update_num_back(draw);
|
||||
|
||||
/* Free no longer needed back buffers */
|
||||
for (buf_id = draw->num_back; buf_id < LOADER_DRI3_MAX_BACK; buf_id++) {
|
||||
if (draw->cur_blit_source != buf_id && draw->buffers[buf_id]) {
|
||||
dri3_free_render_buffer(draw, draw->buffers[buf_id]);
|
||||
draw->buffers[buf_id] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* pixmaps always have front buffers.
|
||||
* Exchange swaps also mandate fake front buffers.
|
||||
*/
|
||||
|
@@ -1108,7 +1108,6 @@ intelDestroyContext(__DRIcontext * driContextPriv)
|
||||
struct brw_context *brw =
|
||||
(struct brw_context *) driContextPriv->driverPrivate;
|
||||
struct gl_context *ctx = &brw->ctx;
|
||||
const struct gen_device_info *devinfo = &brw->screen->devinfo;
|
||||
|
||||
_mesa_meta_free(&brw->ctx);
|
||||
|
||||
@@ -1120,8 +1119,7 @@ intelDestroyContext(__DRIcontext * driContextPriv)
|
||||
brw_destroy_shader_time(brw);
|
||||
}
|
||||
|
||||
if (devinfo->gen >= 6)
|
||||
blorp_finish(&brw->blorp);
|
||||
blorp_finish(&brw->blorp);
|
||||
|
||||
brw_destroy_state(brw);
|
||||
brw_draw_destroy(brw);
|
||||
|
@@ -349,10 +349,18 @@ gen7_emit_vs_workaround_flush(struct brw_context *brw)
|
||||
* context restore, so the mentioned hang doesn't happen. However,
|
||||
* software must program push constant commands for all stages prior to
|
||||
* rendering anything, so we flag them as dirty.
|
||||
*
|
||||
* Finally, we also make sure to stall at pixel scoreboard to make sure the
|
||||
* constants have been loaded into the EUs prior to disable the push constants
|
||||
* so that it doesn't hang a previous 3DPRIMITIVE.
|
||||
*/
|
||||
void
|
||||
gen10_emit_isp_disable(struct brw_context *brw)
|
||||
{
|
||||
brw_emit_pipe_control(brw,
|
||||
PIPE_CONTROL_STALL_AT_SCOREBOARD |
|
||||
PIPE_CONTROL_CS_STALL,
|
||||
NULL, 0, 0);
|
||||
brw_emit_pipe_control(brw,
|
||||
PIPE_CONTROL_ISP_DIS |
|
||||
PIPE_CONTROL_CS_STALL,
|
||||
|
@@ -927,7 +927,7 @@ intelCompressedTexSubImage(struct gl_context *ctx, GLuint dims,
|
||||
!_mesa_is_srgb_format(gl_format);
|
||||
struct brw_context *brw = (struct brw_context*) ctx;
|
||||
const struct gen_device_info *devinfo = &brw->screen->devinfo;
|
||||
if (devinfo->gen == 9 && is_linear_astc)
|
||||
if (devinfo->gen == 9 && !gen_device_info_is_9lp(devinfo) && is_linear_astc)
|
||||
flush_astc_denorms(ctx, dims, texImage,
|
||||
xoffset, yoffset, zoffset,
|
||||
width, height, depth);
|
||||
|
@@ -1488,45 +1488,66 @@ _mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param)
|
||||
}
|
||||
|
||||
static bool
|
||||
_pname_valid_for_default_framebuffer(struct gl_context *ctx,
|
||||
GLenum pname)
|
||||
validate_get_framebuffer_parameteriv_pname(struct gl_context *ctx,
|
||||
struct gl_framebuffer *fb,
|
||||
GLuint pname, const char *func)
|
||||
{
|
||||
if (!_mesa_is_desktop_gl(ctx))
|
||||
return false;
|
||||
bool cannot_be_winsys_fbo = true;
|
||||
|
||||
switch (pname) {
|
||||
case GL_FRAMEBUFFER_DEFAULT_LAYERS:
|
||||
/*
|
||||
* According to the OpenGL ES 3.1 specification section 9.2.3, the
|
||||
* GL_FRAMEBUFFER_LAYERS parameter name is not supported.
|
||||
*/
|
||||
if (_mesa_is_gles31(ctx) && !ctx->Extensions.OES_geometry_shader) {
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case GL_FRAMEBUFFER_DEFAULT_WIDTH:
|
||||
case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
|
||||
case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
|
||||
case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
|
||||
break;
|
||||
case GL_DOUBLEBUFFER:
|
||||
case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
|
||||
case GL_IMPLEMENTATION_COLOR_READ_TYPE:
|
||||
case GL_SAMPLES:
|
||||
case GL_SAMPLE_BUFFERS:
|
||||
case GL_STEREO:
|
||||
return true;
|
||||
/* From OpenGL 4.5 spec, section 9.2.3 "Framebuffer Object Queries:
|
||||
*
|
||||
* "An INVALID_OPERATION error is generated by GetFramebufferParameteriv
|
||||
* if the default framebuffer is bound to target and pname is not one
|
||||
* of the accepted values from table 23.73, other than
|
||||
* SAMPLE_POSITION."
|
||||
*
|
||||
* For OpenGL ES, using default framebuffer raises INVALID_OPERATION
|
||||
* for any pname.
|
||||
*/
|
||||
cannot_be_winsys_fbo = !_mesa_is_desktop_gl(ctx);
|
||||
break;
|
||||
default:
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (cannot_be_winsys_fbo && _mesa_is_winsys_fbo(fb)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"%s(invalid pname=0x%x for default framebuffer)", func, pname);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
get_framebuffer_parameteriv(struct gl_context *ctx, struct gl_framebuffer *fb,
|
||||
GLenum pname, GLint *params, const char *func)
|
||||
{
|
||||
/* From OpenGL 4.5 spec, section 9.2.3 "Framebuffer Object Queries:
|
||||
*
|
||||
* "An INVALID_OPERATION error is generated by GetFramebufferParameteriv
|
||||
* if the default framebuffer is bound to target and pname is not one
|
||||
* of the accepted values from table 23.73, other than
|
||||
* SAMPLE_POSITION."
|
||||
*
|
||||
* For OpenGL ES, using default framebuffer still raises INVALID_OPERATION
|
||||
* for any pname.
|
||||
*/
|
||||
if (_mesa_is_winsys_fbo(fb) &&
|
||||
!_pname_valid_for_default_framebuffer(ctx, pname)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"%s(invalid pname=0x%x for default framebuffer)", func, pname);
|
||||
if (!validate_get_framebuffer_parameteriv_pname(ctx, fb, pname, func))
|
||||
return;
|
||||
}
|
||||
|
||||
switch (pname) {
|
||||
case GL_FRAMEBUFFER_DEFAULT_WIDTH:
|
||||
@@ -1536,14 +1557,6 @@ get_framebuffer_parameteriv(struct gl_context *ctx, struct gl_framebuffer *fb,
|
||||
*params = fb->DefaultGeometry.Height;
|
||||
break;
|
||||
case GL_FRAMEBUFFER_DEFAULT_LAYERS:
|
||||
/*
|
||||
* According to the OpenGL ES 3.1 specification section 9.2.3, the
|
||||
* GL_FRAMEBUFFER_LAYERS parameter name is not supported.
|
||||
*/
|
||||
if (_mesa_is_gles31(ctx) && !ctx->Extensions.OES_geometry_shader) {
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
|
||||
break;
|
||||
}
|
||||
*params = fb->DefaultGeometry.Layers;
|
||||
break;
|
||||
case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
|
||||
@@ -1570,9 +1583,6 @@ get_framebuffer_parameteriv(struct gl_context *ctx, struct gl_framebuffer *fb,
|
||||
case GL_STEREO:
|
||||
*params = fb->Visual.stereoMode;
|
||||
break;
|
||||
default:
|
||||
_mesa_error(ctx, GL_INVALID_ENUM,
|
||||
"%s(pname=0x%x)", func, pname);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -62,6 +62,7 @@ _mesa_Fogiv(GLenum pname, const GLint *params )
|
||||
case GL_FOG_END:
|
||||
case GL_FOG_INDEX:
|
||||
case GL_FOG_COORDINATE_SOURCE_EXT:
|
||||
case GL_FOG_DISTANCE_MODE_NV:
|
||||
p[0] = (GLfloat) *params;
|
||||
break;
|
||||
case GL_FOG_COLOR:
|
||||
|
@@ -105,6 +105,8 @@ enum value_type {
|
||||
TYPE_ENUM,
|
||||
TYPE_ENUM_2,
|
||||
TYPE_BOOLEAN,
|
||||
TYPE_UBYTE,
|
||||
TYPE_SHORT,
|
||||
TYPE_BIT_0,
|
||||
TYPE_BIT_1,
|
||||
TYPE_BIT_2,
|
||||
@@ -188,6 +190,8 @@ union value {
|
||||
GLint value_int_4[4];
|
||||
GLint64 value_int64;
|
||||
GLenum value_enum;
|
||||
GLubyte value_ubyte;
|
||||
GLshort value_short;
|
||||
|
||||
/* Sigh, see GL_COMPRESSED_TEXTURE_FORMATS_ARB handling */
|
||||
struct {
|
||||
@@ -235,10 +239,13 @@ union value {
|
||||
#define CONTEXT_MATRIX(field) CONTEXT_FIELD(field, TYPE_MATRIX)
|
||||
#define CONTEXT_MATRIX_T(field) CONTEXT_FIELD(field, TYPE_MATRIX_T)
|
||||
|
||||
/* Vertex array fields */
|
||||
#define ARRAY_INT(field) ARRAY_FIELD(field, TYPE_INT)
|
||||
#define ARRAY_ENUM(field) ARRAY_FIELD(field, TYPE_ENUM)
|
||||
#define ARRAY_ENUM16(field) ARRAY_FIELD(field, TYPE_ENUM16)
|
||||
#define ARRAY_BOOL(field) ARRAY_FIELD(field, TYPE_BOOLEAN)
|
||||
#define ARRAY_UBYTE(field) ARRAY_FIELD(field, TYPE_UBYTE)
|
||||
#define ARRAY_SHORT(field) ARRAY_FIELD(field, TYPE_SHORT)
|
||||
|
||||
#define EXT(f) \
|
||||
offsetof(struct gl_extensions, f)
|
||||
@@ -1517,6 +1524,10 @@ get_value_size(enum value_type type, const union value *v)
|
||||
return sizeof(GLenum) * 2;
|
||||
case TYPE_BOOLEAN:
|
||||
return sizeof(GLboolean);
|
||||
case TYPE_UBYTE:
|
||||
return sizeof(GLubyte);
|
||||
case TYPE_SHORT:
|
||||
return sizeof(GLshort);
|
||||
case TYPE_BIT_0:
|
||||
case TYPE_BIT_1:
|
||||
case TYPE_BIT_2:
|
||||
@@ -1628,6 +1639,14 @@ _mesa_GetBooleanv(GLenum pname, GLboolean *params)
|
||||
params[0] = ((GLboolean*) p)[0];
|
||||
break;
|
||||
|
||||
case TYPE_UBYTE:
|
||||
params[0] = INT_TO_BOOLEAN(((GLubyte *) p)[0]);
|
||||
break;
|
||||
|
||||
case TYPE_SHORT:
|
||||
params[0] = INT_TO_BOOLEAN(((GLshort *) p)[0]);
|
||||
break;
|
||||
|
||||
case TYPE_MATRIX:
|
||||
m = *(GLmatrix **) p;
|
||||
for (i = 0; i < 16; i++)
|
||||
@@ -1735,6 +1754,14 @@ _mesa_GetFloatv(GLenum pname, GLfloat *params)
|
||||
params[0] = BOOLEAN_TO_FLOAT(*(GLboolean*) p);
|
||||
break;
|
||||
|
||||
case TYPE_UBYTE:
|
||||
params[0] = (GLfloat) ((GLubyte *) p)[0];
|
||||
break;
|
||||
|
||||
case TYPE_SHORT:
|
||||
params[0] = (GLfloat) ((GLshort *) p)[0];
|
||||
break;
|
||||
|
||||
case TYPE_MATRIX:
|
||||
m = *(GLmatrix **) p;
|
||||
for (i = 0; i < 16; i++)
|
||||
@@ -1842,6 +1869,14 @@ _mesa_GetIntegerv(GLenum pname, GLint *params)
|
||||
params[0] = BOOLEAN_TO_INT(*(GLboolean*) p);
|
||||
break;
|
||||
|
||||
case TYPE_UBYTE:
|
||||
params[0] = ((GLubyte *) p)[0];
|
||||
break;
|
||||
|
||||
case TYPE_SHORT:
|
||||
params[0] = ((GLshort *) p)[0];
|
||||
break;
|
||||
|
||||
case TYPE_MATRIX:
|
||||
m = *(GLmatrix **) p;
|
||||
for (i = 0; i < 16; i++)
|
||||
@@ -2062,6 +2097,14 @@ _mesa_GetDoublev(GLenum pname, GLdouble *params)
|
||||
params[0] = *(GLboolean*) p;
|
||||
break;
|
||||
|
||||
case TYPE_UBYTE:
|
||||
params[0] = ((GLubyte *) p)[0];
|
||||
break;
|
||||
|
||||
case TYPE_SHORT:
|
||||
params[0] = ((GLshort *) p)[0];
|
||||
break;
|
||||
|
||||
case TYPE_MATRIX:
|
||||
m = *(GLmatrix **) p;
|
||||
for (i = 0; i < 16; i++)
|
||||
@@ -2141,6 +2184,8 @@ _mesa_GetUnsignedBytevEXT(GLenum pname, GLubyte *data)
|
||||
case TYPE_ENUM:
|
||||
case TYPE_ENUM_2:
|
||||
case TYPE_BOOLEAN:
|
||||
case TYPE_UBYTE:
|
||||
case TYPE_SHORT:
|
||||
case TYPE_FLOAT:
|
||||
case TYPE_FLOATN:
|
||||
case TYPE_FLOAT_2:
|
||||
@@ -2790,6 +2835,14 @@ _mesa_GetFloati_v(GLenum pname, GLuint index, GLfloat *params)
|
||||
params[0] = BOOLEAN_TO_FLOAT(v.value_bool);
|
||||
break;
|
||||
|
||||
case TYPE_UBYTE:
|
||||
params[0] = (GLfloat) v.value_ubyte;
|
||||
break;
|
||||
|
||||
case TYPE_SHORT:
|
||||
params[0] = (GLfloat) v.value_short;
|
||||
break;
|
||||
|
||||
case TYPE_MATRIX:
|
||||
m = *(GLmatrix **) &v;
|
||||
for (i = 0; i < 16; i++)
|
||||
@@ -2873,6 +2926,14 @@ _mesa_GetDoublei_v(GLenum pname, GLuint index, GLdouble *params)
|
||||
params[0] = (GLdouble) BOOLEAN_TO_FLOAT(v.value_bool);
|
||||
break;
|
||||
|
||||
case TYPE_UBYTE:
|
||||
params[0] = (GLdouble) v.value_ubyte;
|
||||
break;
|
||||
|
||||
case TYPE_SHORT:
|
||||
params[0] = (GLdouble) v.value_short;
|
||||
break;
|
||||
|
||||
case TYPE_MATRIX:
|
||||
m = *(GLmatrix **) &v;
|
||||
for (i = 0; i < 16; i++)
|
||||
@@ -2925,6 +2986,8 @@ _mesa_GetUnsignedBytei_vEXT(GLenum target, GLuint index, GLubyte *data)
|
||||
case TYPE_ENUM:
|
||||
case TYPE_ENUM_2:
|
||||
case TYPE_BOOLEAN:
|
||||
case TYPE_UBYTE:
|
||||
case TYPE_SHORT:
|
||||
case TYPE_FLOAT:
|
||||
case TYPE_FLOATN:
|
||||
case TYPE_FLOAT_2:
|
||||
@@ -3018,6 +3081,14 @@ _mesa_GetFixedv(GLenum pname, GLfixed *params)
|
||||
params[0] = BOOLEAN_TO_FIXED(((GLboolean*) p)[0]);
|
||||
break;
|
||||
|
||||
case TYPE_UBYTE:
|
||||
params[0] = INT_TO_FIXED(((GLubyte *) p)[0]);
|
||||
break;
|
||||
|
||||
case TYPE_SHORT:
|
||||
params[0] = INT_TO_FIXED(((GLshort *) p)[0]);
|
||||
break;
|
||||
|
||||
case TYPE_MATRIX:
|
||||
m = *(GLmatrix **) p;
|
||||
for (i = 0; i < 16; i++)
|
||||
|
@@ -212,20 +212,20 @@ descriptor=[
|
||||
[ "TEXTURE_MATRIX", "LOC_CUSTOM, TYPE_MATRIX, 0, extra_valid_texture_unit" ],
|
||||
[ "TEXTURE_STACK_DEPTH", "LOC_CUSTOM, TYPE_INT, 0, extra_valid_texture_unit" ],
|
||||
[ "VERTEX_ARRAY", "ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_POS].Enabled), NO_EXTRA" ],
|
||||
[ "VERTEX_ARRAY_SIZE", "ARRAY_INT(VertexAttrib[VERT_ATTRIB_POS].Size), NO_EXTRA" ],
|
||||
[ "VERTEX_ARRAY_SIZE", "ARRAY_UBYTE(VertexAttrib[VERT_ATTRIB_POS].Size), NO_EXTRA" ],
|
||||
[ "VERTEX_ARRAY_TYPE", "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_POS].Type), NO_EXTRA" ],
|
||||
[ "VERTEX_ARRAY_STRIDE", "ARRAY_INT(VertexAttrib[VERT_ATTRIB_POS].Stride), NO_EXTRA" ],
|
||||
[ "VERTEX_ARRAY_STRIDE", "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_POS].Stride), NO_EXTRA" ],
|
||||
[ "NORMAL_ARRAY", "ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_NORMAL].Enabled), NO_EXTRA" ],
|
||||
[ "NORMAL_ARRAY_TYPE", "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_NORMAL].Type), NO_EXTRA" ],
|
||||
[ "NORMAL_ARRAY_STRIDE", "ARRAY_INT(VertexAttrib[VERT_ATTRIB_NORMAL].Stride), NO_EXTRA" ],
|
||||
[ "NORMAL_ARRAY_STRIDE", "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_NORMAL].Stride), NO_EXTRA" ],
|
||||
[ "COLOR_ARRAY", "ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_COLOR0].Enabled), NO_EXTRA" ],
|
||||
[ "COLOR_ARRAY_SIZE", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ],
|
||||
[ "COLOR_ARRAY_TYPE", "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_COLOR0].Type), NO_EXTRA" ],
|
||||
[ "COLOR_ARRAY_STRIDE", "ARRAY_INT(VertexAttrib[VERT_ATTRIB_COLOR0].Stride), NO_EXTRA" ],
|
||||
[ "COLOR_ARRAY_STRIDE", "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_COLOR0].Stride), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY", "LOC_CUSTOM, TYPE_BOOLEAN, offsetof(struct gl_array_attributes, Enabled), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_SIZE", "LOC_CUSTOM, TYPE_INT, offsetof(struct gl_array_attributes, Size), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_SIZE", "LOC_CUSTOM, TYPE_UBYTE, offsetof(struct gl_array_attributes, Size), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_TYPE", "LOC_CUSTOM, TYPE_ENUM16, offsetof(struct gl_array_attributes, Type), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_STRIDE", "LOC_CUSTOM, TYPE_INT, offsetof(struct gl_array_attributes, Stride), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_STRIDE", "LOC_CUSTOM, TYPE_SHORT, offsetof(struct gl_array_attributes, Stride), NO_EXTRA" ],
|
||||
|
||||
# GL_ARB_multitexture
|
||||
[ "MAX_TEXTURE_UNITS", "CONTEXT_INT(Const.MaxTextureUnits), NO_EXTRA" ],
|
||||
@@ -255,7 +255,7 @@ descriptor=[
|
||||
# OES_point_size_array
|
||||
[ "POINT_SIZE_ARRAY_OES", "ARRAY_FIELD(VertexAttrib[VERT_ATTRIB_POINT_SIZE].Enabled, TYPE_BOOLEAN), NO_EXTRA" ],
|
||||
[ "POINT_SIZE_ARRAY_TYPE_OES", "ARRAY_FIELD(VertexAttrib[VERT_ATTRIB_POINT_SIZE].Type, TYPE_ENUM16), NO_EXTRA" ],
|
||||
[ "POINT_SIZE_ARRAY_STRIDE_OES", "ARRAY_FIELD(VertexAttrib[VERT_ATTRIB_POINT_SIZE].Stride, TYPE_INT), NO_EXTRA" ],
|
||||
[ "POINT_SIZE_ARRAY_STRIDE_OES", "ARRAY_FIELD(VertexAttrib[VERT_ATTRIB_POINT_SIZE].Stride, TYPE_SHORT), NO_EXTRA" ],
|
||||
[ "POINT_SIZE_ARRAY_BUFFER_BINDING_OES", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ],
|
||||
]},
|
||||
|
||||
@@ -777,11 +777,11 @@ descriptor=[
|
||||
[ "COLOR_ARRAY_COUNT_EXT", "CONST(0), NO_EXTRA" ],
|
||||
[ "INDEX_ARRAY", "ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled), NO_EXTRA" ],
|
||||
[ "INDEX_ARRAY_TYPE", "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Type), NO_EXTRA" ],
|
||||
[ "INDEX_ARRAY_STRIDE", "ARRAY_INT(VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Stride), NO_EXTRA" ],
|
||||
[ "INDEX_ARRAY_STRIDE", "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Stride), NO_EXTRA" ],
|
||||
[ "INDEX_ARRAY_COUNT_EXT", "CONST(0), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_COUNT_EXT", "CONST(0), NO_EXTRA" ],
|
||||
[ "EDGE_FLAG_ARRAY", "ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_EDGEFLAG].Enabled), NO_EXTRA" ],
|
||||
[ "EDGE_FLAG_ARRAY_STRIDE", "ARRAY_INT(VertexAttrib[VERT_ATTRIB_EDGEFLAG].Stride), NO_EXTRA" ],
|
||||
[ "EDGE_FLAG_ARRAY_STRIDE", "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_EDGEFLAG].Stride), NO_EXTRA" ],
|
||||
[ "EDGE_FLAG_ARRAY_COUNT_EXT", "CONST(0), NO_EXTRA" ],
|
||||
|
||||
# GL_ARB_texture_compression
|
||||
@@ -811,14 +811,14 @@ descriptor=[
|
||||
[ "CURRENT_SECONDARY_COLOR", "CONTEXT_FIELD(Current.Attrib[VERT_ATTRIB_COLOR1][0], TYPE_FLOATN_4), extra_flush_current" ],
|
||||
[ "SECONDARY_COLOR_ARRAY", "ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_COLOR1].Enabled), NO_EXTRA" ],
|
||||
[ "SECONDARY_COLOR_ARRAY_TYPE", "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_COLOR1].Type), NO_EXTRA" ],
|
||||
[ "SECONDARY_COLOR_ARRAY_STRIDE", "ARRAY_INT(VertexAttrib[VERT_ATTRIB_COLOR1].Stride), NO_EXTRA" ],
|
||||
[ "SECONDARY_COLOR_ARRAY_STRIDE", "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_COLOR1].Stride), NO_EXTRA" ],
|
||||
[ "SECONDARY_COLOR_ARRAY_SIZE", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ],
|
||||
|
||||
# GL_EXT_fog_coord
|
||||
[ "CURRENT_FOG_COORDINATE", "CONTEXT_FLOAT(Current.Attrib[VERT_ATTRIB_FOG][0]), extra_flush_current" ],
|
||||
[ "FOG_COORDINATE_ARRAY", "ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_FOG].Enabled), NO_EXTRA" ],
|
||||
[ "FOG_COORDINATE_ARRAY_TYPE", "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_FOG].Type), NO_EXTRA" ],
|
||||
[ "FOG_COORDINATE_ARRAY_STRIDE", "ARRAY_INT(VertexAttrib[VERT_ATTRIB_FOG].Stride), NO_EXTRA" ],
|
||||
[ "FOG_COORDINATE_ARRAY_STRIDE", "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_FOG].Stride), NO_EXTRA" ],
|
||||
[ "FOG_COORDINATE_SOURCE", "CONTEXT_ENUM16(Fog.FogCoordinateSource), NO_EXTRA" ],
|
||||
|
||||
# GL_NV_fog_distance
|
||||
|
@@ -732,6 +732,6 @@ endif
|
||||
if with_glx == 'xlib'
|
||||
subdir('drivers/x11')
|
||||
endif
|
||||
if with_tests
|
||||
if with_tests and dri_drivers != []
|
||||
subdir('main/tests')
|
||||
endif
|
||||
|
@@ -82,7 +82,9 @@ if with_gallium
|
||||
subdir('gallium')
|
||||
# This has to be here since it requires libgallium, and subdir cannot
|
||||
# contain ..
|
||||
subdir('mesa/state_tracker/tests')
|
||||
if with_tests
|
||||
subdir('mesa/state_tracker/tests')
|
||||
endif
|
||||
endif
|
||||
|
||||
# This must be after at least mesa, glx, and gallium, since libgl will be
|
||||
|
@@ -311,6 +311,7 @@ util_queue_init(struct util_queue *queue,
|
||||
goto fail;
|
||||
|
||||
(void) mtx_init(&queue->lock, mtx_plain);
|
||||
(void) mtx_init(&queue->finish_lock, mtx_plain);
|
||||
|
||||
queue->num_queued = 0;
|
||||
cnd_init(&queue->has_queued_cond);
|
||||
@@ -398,6 +399,7 @@ util_queue_destroy(struct util_queue *queue)
|
||||
|
||||
cnd_destroy(&queue->has_space_cond);
|
||||
cnd_destroy(&queue->has_queued_cond);
|
||||
mtx_destroy(&queue->finish_lock);
|
||||
mtx_destroy(&queue->lock);
|
||||
free(queue->jobs);
|
||||
free(queue->threads);
|
||||
@@ -529,6 +531,12 @@ util_queue_finish(struct util_queue *queue)
|
||||
|
||||
util_barrier_init(&barrier, queue->num_threads);
|
||||
|
||||
/* If 2 threads were adding jobs for 2 different barries at the same time,
|
||||
* a deadlock would happen, because 1 barrier requires that all threads
|
||||
* wait for it exclusively.
|
||||
*/
|
||||
mtx_lock(&queue->finish_lock);
|
||||
|
||||
for (unsigned i = 0; i < queue->num_threads; ++i) {
|
||||
util_queue_fence_init(&fences[i]);
|
||||
util_queue_add_job(queue, &barrier, &fences[i], util_queue_finish_execute, NULL);
|
||||
@@ -538,6 +546,7 @@ util_queue_finish(struct util_queue *queue)
|
||||
util_queue_fence_wait(&fences[i]);
|
||||
util_queue_fence_destroy(&fences[i]);
|
||||
}
|
||||
mtx_unlock(&queue->finish_lock);
|
||||
|
||||
util_barrier_destroy(&barrier);
|
||||
|
||||
|
@@ -200,6 +200,7 @@ struct util_queue_job {
|
||||
/* Put this into your context. */
|
||||
struct util_queue {
|
||||
const char *name;
|
||||
mtx_t finish_lock; /* only for util_queue_finish */
|
||||
mtx_t lock;
|
||||
cnd_t has_queued_cond;
|
||||
cnd_t has_space_cond;
|
||||
|
@@ -442,6 +442,7 @@ fail:
|
||||
VkResult
|
||||
wsi_create_prime_image(const struct wsi_swapchain *chain,
|
||||
const VkSwapchainCreateInfoKHR *pCreateInfo,
|
||||
bool use_modifier,
|
||||
struct wsi_image *image)
|
||||
{
|
||||
const struct wsi_device *wsi = chain->wsi;
|
||||
@@ -626,7 +627,7 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
image->drm_modifier = DRM_FORMAT_MOD_LINEAR;
|
||||
image->drm_modifier = use_modifier ? DRM_FORMAT_MOD_LINEAR : DRM_FORMAT_MOD_INVALID;
|
||||
image->num_planes = 1;
|
||||
image->sizes[0] = linear_size;
|
||||
image->row_pitches[0] = linear_stride;
|
||||
|
@@ -89,6 +89,7 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
|
||||
VkResult
|
||||
wsi_create_prime_image(const struct wsi_swapchain *chain,
|
||||
const VkSwapchainCreateInfoKHR *pCreateInfo,
|
||||
bool use_modifier,
|
||||
struct wsi_image *image);
|
||||
|
||||
void
|
||||
|
@@ -1043,7 +1043,8 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain,
|
||||
uint32_t bpp = 32;
|
||||
|
||||
if (chain->base.use_prime_blit) {
|
||||
result = wsi_create_prime_image(&chain->base, pCreateInfo, &image->base);
|
||||
bool use_modifier = num_tranches > 0;
|
||||
result = wsi_create_prime_image(&chain->base, pCreateInfo, use_modifier, &image->base);
|
||||
} else {
|
||||
result = wsi_create_native_image(&chain->base, pCreateInfo,
|
||||
num_tranches, num_modifiers, modifiers,
|
||||
|
Reference in New Issue
Block a user