Compare commits
30 Commits
mesa-18.0.
...
mesa-18.0.
Author | SHA1 | Date | |
---|---|---|---|
|
ca0037aaef | ||
|
3f4da760f9 | ||
|
7c644f48a1 | ||
|
dfa3a7ee37 | ||
|
81bd117b3c | ||
|
714dabe317 | ||
|
aac580f7bb | ||
|
38aeeee511 | ||
|
8cf02769f5 | ||
|
1939affe51 | ||
|
42fa7cf2bb | ||
|
86e749a96e | ||
|
03eaee1529 | ||
|
8d5f09e8ef | ||
|
a93a86a434 | ||
|
6a0c2860e7 | ||
|
b582b8fc93 | ||
|
96b1ac39d5 | ||
|
f844591ee3 | ||
|
620be4d431 | ||
|
5443d85870 | ||
|
5cef37e909 | ||
|
e7b5064045 | ||
|
6ce8a775a7 | ||
|
3b7134c535 | ||
|
544a383858 | ||
|
f084db8870 | ||
|
712456cb38 | ||
|
0f7b29aa93 | ||
|
69ef6e4a75 |
@@ -65,3 +65,26 @@ b16fc6cda11576a4dd6c8d95f7bee94121c4b8e7 radv/resolve: do fmask decompress on al
|
||||
|
||||
# stable: There is a specific port for this patch for stable branch.
|
||||
3d4d388e3929d7948b62d90867357aecbfba5aeb radv: Fix up 2_10_10_10 alpha sign.
|
||||
|
||||
# stable: The commit requires earlier commit af4e9295fe which did not land in
|
||||
# branch.
|
||||
816f2dc67da72be8993e724aeda4c2ec2f5a2978 i965/miptree: Fix handling of uninitialized MCS buffers
|
||||
|
||||
# stable: Explicit 18.1 only nominations
|
||||
549e54270ba3a519b46a1fbffa4aa6b628a052d3 radv: fix VK_EXT_descriptor_indexing
|
||||
|
||||
# fixes: The commit fixes earlier commits 19a91841c3 and 9987a072cb which did
|
||||
# not land in branch.
|
||||
d89f58a6b8436b59dcf3b896c0ccddabed3f78fd mesa/st: handle vert_attrib_mask in nir case too
|
||||
|
||||
# stable: Tegra support is not part of the current branch
|
||||
bd3e97e5aad7800b8e17ed10d34a070926691945 tegra: Remove usage of non-stable UAPI
|
||||
9603d81df05105857b676f20dff964ef3ab0ecff tegra: Fix scanout resources without modifiers
|
||||
9e539012dfaa848fc4cfde83c3f3a83fee274ca4 tegra: Treat resources with modifiers as scanout
|
||||
|
||||
# stable: The commit requires earlier commit 19a91841c3 which did not land in
|
||||
# branch.
|
||||
a7d0c53ab89ca86b705014925214101f5bc4187f st/mesa: fix assertion failures with GL_UNSIGNED_INT64_ARB (v2)
|
||||
|
||||
# stable: Explicit 18.1 only nomination
|
||||
30918b77ac82ba1da7764c0375233656e0ebf9f9 nv30: ensure that displayable formats are marked accordingly
|
||||
|
@@ -31,7 +31,8 @@ because compatibility contexts are not supported.
|
||||
|
||||
<h2>SHA256 checksums</h2>
|
||||
<pre>
|
||||
TBD
|
||||
d1dc3469faccdd73439479426952d71a9e8f684e8d03b6687063c12b13430801 mesa-18.0.4.tar.gz
|
||||
1f3bcfe7cef0a5c20dae2b41df5d7e0a985e06be0183fa4d43b6068fcba2920f mesa-18.0.4.tar.xz
|
||||
</pre>
|
||||
|
||||
|
||||
|
161
docs/relnotes/18.0.5.html
Normal file
161
docs/relnotes/18.0.5.html
Normal file
@@ -0,0 +1,161 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title>Mesa Release Notes</title>
|
||||
<link rel="stylesheet" type="text/css" href="../mesa.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="header">
|
||||
<h1>The Mesa 3D Graphics Library</h1>
|
||||
</div>
|
||||
|
||||
<iframe src="../contents.html"></iframe>
|
||||
<div class="content">
|
||||
|
||||
<h1>Mesa 18.0.5 Release Notes / June 3, 2018</h1>
|
||||
|
||||
<p>
|
||||
Mesa 18.0.5 is a bug fix release which fixes bugs found since the 18.0.4 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 18.0.5 implements the OpenGL 4.5 API, but the version reported by
|
||||
glGetString(GL_VERSION) or glGetIntegerv(GL_MAJOR_VERSION) /
|
||||
glGetIntegerv(GL_MINOR_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 4.5. OpenGL
|
||||
4.5 is <strong>only</strong> available if requested at context creation
|
||||
because compatibility contexts are not supported.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>SHA256 checksums</h2>
|
||||
<pre>
|
||||
TBD
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<p>None</p>
|
||||
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=78097">Bug 78097</a> - glUniform1ui and friends not supported by display lists</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=102390">Bug 102390</a> - centroid interpolation causes broken attribute values</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=105351">Bug 105351</a> - [Gen6+] piglit's arb_shader_image_load_store-host-mem-barrier fails with a glGetTexSubImage fallback path</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=106090">Bug 106090</a> - Compiling compute shader crashes RADV</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=106315">Bug 106315</a> - The witness + dxvk suffers flickering garbage</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=106465">Bug 106465</a> - No test for Image Load/Store on format-incompatible texture buffer</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=106479">Bug 106479</a> - NDEBUG not defined for libamdgpu_addrlib</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=106481">Bug 106481</a> - No test for Image Load/Store on texture buffer sized greater than MAX_TEXTURE_BUFFER_SIZE_ARB</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=106504">Bug 106504</a> - vulkan SPIR-V parsing failed at ../src/compiler/spirv/vtn_cfg.c:381</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=106587">Bug 106587</a> - Dota2 is very dark when using vulkan render on a Intel << AMD prime setup</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=106629">Bug 106629</a> - [SNB,IVB,HSW,BDW] dEQP-EGL.functional.image.create.gles2_cubemap_negative_z_rgb_read_pixels</li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
|
||||
<p>Anuj Phogat (1):</p>
|
||||
<ul>
|
||||
<li>i965/glk: Add l3 banks count for 2x6 configuration</li>
|
||||
</ul>
|
||||
|
||||
<p>Bas Nieuwenhuizen (2):</p>
|
||||
<ul>
|
||||
<li>amd/addrlib: Use defines in autotools build.</li>
|
||||
<li>radv: Fix SRGB compute copies.</li>
|
||||
</ul>
|
||||
|
||||
<p>Dave Airlie (1):</p>
|
||||
<ul>
|
||||
<li>tgsi/scan: add hw atomic to the list of memory accessing files</li>
|
||||
</ul>
|
||||
|
||||
<p>Francisco Jerez (4):</p>
|
||||
<ul>
|
||||
<li>Revert "mesa: simplify _mesa_is_image_unit_valid for buffers"</li>
|
||||
<li>i965: Move buffer texture size calculation into a common helper function.</li>
|
||||
<li>i965: Handle non-zero texture buffer offsets in buffer object range calculation.</li>
|
||||
<li>i965: Use intel_bufferobj_buffer() wrapper in image surface state setup.</li>
|
||||
</ul>
|
||||
|
||||
<p>Jan Vesely (1):</p>
|
||||
<ul>
|
||||
<li>eg/compute: Use reference counting to handle compute memory pool.</li>
|
||||
</ul>
|
||||
|
||||
<p>Jason Ekstrand (2):</p>
|
||||
<ul>
|
||||
<li>intel/eu: Set EXECUTE_1 when setting the rounding mode in cr0</li>
|
||||
<li>intel/blorp: Support blits and clears on surfaces with offsets</li>
|
||||
</ul>
|
||||
|
||||
<p>Jose Dapena Paz (1):</p>
|
||||
<ul>
|
||||
<li>mesa: do not leak ctx->Shader.ReferencedProgram references</li>
|
||||
</ul>
|
||||
|
||||
<p>Juan A. Suarez Romero (8):</p>
|
||||
<ul>
|
||||
<li>docs: add sha256 checksums for 18.0.4</li>
|
||||
<li>cherry-ignore: i965/miptree: Fix handling of uninitialized MCS buffers</li>
|
||||
<li>cherry-ignore: add explicit 18.1 only nominations</li>
|
||||
<li>cherry-ignore: mesa/st: handle vert_attrib_mask in nir case too</li>
|
||||
<li>cherry-ignore: Tegra is not supported</li>
|
||||
<li>cherry-ignore: st/mesa: fix assertion failures with GL_UNSIGNED_INT64_ARB (v2)</li>
|
||||
<li>cherry-ignore: nv30: ensure that displayable formats are marked accordingly</li>
|
||||
<li>Update version to 18.0.5</li>
|
||||
</ul>
|
||||
|
||||
<p>Marek Olšák (3):</p>
|
||||
<ul>
|
||||
<li>st/mesa: simplify lastLevel determination in st_finalize_texture</li>
|
||||
<li>radeonsi: fix incorrect parentheses around VS-PS varying elimination</li>
|
||||
<li>mesa: handle GL_UNSIGNED_INT64_ARB properly (v2)</li>
|
||||
</ul>
|
||||
|
||||
<p>Michel Dänzer (1):</p>
|
||||
<ul>
|
||||
<li>dri3: Stricter SBC wraparound handling</li>
|
||||
</ul>
|
||||
|
||||
<p>Nanley Chery (1):</p>
|
||||
<ul>
|
||||
<li>i965/miptree: Zero-initialize CCS_D buffers</li>
|
||||
</ul>
|
||||
|
||||
<p>Samuel Pitoiset (2):</p>
|
||||
<ul>
|
||||
<li>spirv: fix visiting inner loops with same break/continue block</li>
|
||||
<li>radv: fix centroid interpolation</li>
|
||||
</ul>
|
||||
|
||||
<p>Stuart Young (1):</p>
|
||||
<ul>
|
||||
<li>etnaviv: Fix missing rnndb file in tarballs</li>
|
||||
</ul>
|
||||
|
||||
<p>Timothy Arceri (1):</p>
|
||||
<ul>
|
||||
<li>mesa: add glUniform*ui{v} support to display lists</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@@ -22,6 +22,7 @@
|
||||
ADDRLIB_LIBS = addrlib/libamdgpu_addrlib.la
|
||||
|
||||
addrlib_libamdgpu_addrlib_la_CPPFLAGS = \
|
||||
$(DEFINES) \
|
||||
-I$(top_srcdir)/src/ \
|
||||
-I$(srcdir)/common \
|
||||
-I$(srcdir)/addrlib \
|
||||
|
@@ -5523,9 +5523,6 @@ static void
|
||||
prepare_interp_optimize(struct nir_to_llvm_context *ctx,
|
||||
struct nir_shader *nir)
|
||||
{
|
||||
if (!ctx->options->key.fs.multisample)
|
||||
return;
|
||||
|
||||
bool uses_center = false;
|
||||
bool uses_centroid = false;
|
||||
nir_foreach_variable(variable, &nir->inputs) {
|
||||
|
@@ -93,6 +93,8 @@ blit_surf_for_image_level_layer(struct radv_image *image,
|
||||
!(image->surface.htile_size && image->tc_compatible_htile))
|
||||
format = vk_format_for_size(vk_format_get_blocksize(format));
|
||||
|
||||
format = vk_format_no_srgb(format);
|
||||
|
||||
return (struct radv_meta_blit2d_surf) {
|
||||
.format = format,
|
||||
.bs = vk_format_get_blocksize(format),
|
||||
|
@@ -416,6 +416,46 @@ vk_format_is_srgb(VkFormat format)
|
||||
return desc->colorspace == VK_FORMAT_COLORSPACE_SRGB;
|
||||
}
|
||||
|
||||
static inline VkFormat
|
||||
vk_format_no_srgb(VkFormat format)
|
||||
{
|
||||
switch(format) {
|
||||
case VK_FORMAT_R8_SRGB:
|
||||
return VK_FORMAT_R8_UNORM;
|
||||
case VK_FORMAT_R8G8_SRGB:
|
||||
return VK_FORMAT_R8G8_UNORM;
|
||||
case VK_FORMAT_R8G8B8_SRGB:
|
||||
return VK_FORMAT_R8G8B8_UNORM;
|
||||
case VK_FORMAT_B8G8R8_SRGB:
|
||||
return VK_FORMAT_B8G8R8_UNORM;
|
||||
case VK_FORMAT_R8G8B8A8_SRGB:
|
||||
return VK_FORMAT_R8G8B8A8_UNORM;
|
||||
case VK_FORMAT_B8G8R8A8_SRGB:
|
||||
return VK_FORMAT_B8G8R8A8_UNORM;
|
||||
case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
|
||||
return VK_FORMAT_A8B8G8R8_UNORM_PACK32;
|
||||
case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
|
||||
return VK_FORMAT_BC1_RGB_UNORM_BLOCK;
|
||||
case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
|
||||
return VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
|
||||
case VK_FORMAT_BC2_SRGB_BLOCK:
|
||||
return VK_FORMAT_BC2_UNORM_BLOCK;
|
||||
case VK_FORMAT_BC3_SRGB_BLOCK:
|
||||
return VK_FORMAT_BC3_UNORM_BLOCK;
|
||||
case VK_FORMAT_BC7_SRGB_BLOCK:
|
||||
return VK_FORMAT_BC7_UNORM_BLOCK;
|
||||
case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
|
||||
return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
|
||||
case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
|
||||
return VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
|
||||
case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
|
||||
return VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
|
||||
default:
|
||||
assert(!vk_format_is_srgb(format));
|
||||
return format;
|
||||
}
|
||||
}
|
||||
|
||||
static inline VkFormat
|
||||
vk_format_stencil_only(VkFormat format)
|
||||
{
|
||||
|
@@ -374,6 +374,19 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct list_head *cf_list,
|
||||
vtn_cfg_walk_blocks(b, &loop->cont_body, new_loop_cont, NULL, NULL,
|
||||
new_loop_break, NULL, block);
|
||||
|
||||
enum vtn_branch_type branch_type =
|
||||
vtn_get_branch_type(b, new_loop_break, switch_case, switch_break,
|
||||
loop_break, loop_cont);
|
||||
|
||||
if (branch_type != vtn_branch_type_none) {
|
||||
/* Stop walking through the CFG when this inner loop's break block
|
||||
* ends up as the same block as the outer loop's continue block
|
||||
* because we are already going to visit it.
|
||||
*/
|
||||
vtn_assert(branch_type == vtn_branch_type_loop_continue);
|
||||
return;
|
||||
}
|
||||
|
||||
block = new_loop_break;
|
||||
continue;
|
||||
}
|
||||
|
@@ -50,7 +50,8 @@ is_memory_file(unsigned file)
|
||||
return file == TGSI_FILE_SAMPLER ||
|
||||
file == TGSI_FILE_SAMPLER_VIEW ||
|
||||
file == TGSI_FILE_IMAGE ||
|
||||
file == TGSI_FILE_BUFFER;
|
||||
file == TGSI_FILE_BUFFER ||
|
||||
file == TGSI_FILE_HW_ATOMIC;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -6,6 +6,7 @@ C_SOURCES := \
|
||||
hw/state_3d.xml.h \
|
||||
hw/state_blt.xml.h \
|
||||
hw/state.xml.h \
|
||||
hw/texdesc_3d.xml.h \
|
||||
\
|
||||
etnaviv_asm.c \
|
||||
etnaviv_asm.h \
|
||||
|
@@ -26,6 +26,7 @@ files_etnaviv = files(
|
||||
'hw/state_3d.xml.h',
|
||||
'hw/state_blt.xml.h',
|
||||
'hw/state.xml.h',
|
||||
'hw/texdesc_3d.xml.h',
|
||||
'etnaviv_asm.c',
|
||||
'etnaviv_asm.h',
|
||||
'etnaviv_blend.c',
|
||||
|
@@ -91,10 +91,7 @@ void compute_memory_pool_delete(struct compute_memory_pool* pool)
|
||||
{
|
||||
COMPUTE_DBG(pool->screen, "* compute_memory_pool_delete()\n");
|
||||
free(pool->shadow);
|
||||
if (pool->bo) {
|
||||
pool->screen->b.b.resource_destroy((struct pipe_screen *)
|
||||
pool->screen, (struct pipe_resource *)pool->bo);
|
||||
}
|
||||
pipe_resource_reference(&pool->bo, NULL);
|
||||
/* In theory, all of the items were freed in compute_memory_free.
|
||||
* Just delete the list heads
|
||||
*/
|
||||
@@ -213,10 +210,8 @@ int compute_memory_grow_defrag_pool(struct compute_memory_pool *pool,
|
||||
|
||||
compute_memory_defrag(pool, src, dst, pipe);
|
||||
|
||||
pool->screen->b.b.resource_destroy(
|
||||
(struct pipe_screen *)pool->screen,
|
||||
src);
|
||||
|
||||
/* Release the old buffer */
|
||||
pipe_resource_reference(&pool->bo, NULL);
|
||||
pool->bo = temp;
|
||||
pool->size_in_dw = new_size_in_dw;
|
||||
}
|
||||
@@ -230,9 +225,8 @@ int compute_memory_grow_defrag_pool(struct compute_memory_pool *pool,
|
||||
return -1;
|
||||
|
||||
pool->size_in_dw = new_size_in_dw;
|
||||
pool->screen->b.b.resource_destroy(
|
||||
(struct pipe_screen *)pool->screen,
|
||||
(struct pipe_resource *)pool->bo);
|
||||
/* Release the old buffer */
|
||||
pipe_resource_reference(&pool->bo, NULL);
|
||||
pool->bo = r600_compute_buffer_alloc_vram(pool->screen, pool->size_in_dw * 4);
|
||||
compute_memory_shadow(pool, pipe, 0);
|
||||
|
||||
|
@@ -122,7 +122,8 @@ static void evergreen_set_rat(struct r600_pipe_compute *pipe,
|
||||
rat_templ.u.tex.first_layer = 0;
|
||||
rat_templ.u.tex.last_layer = 0;
|
||||
|
||||
/* Add the RAT the list of color buffers */
|
||||
/* Add the RAT the list of color buffers. Drop the old buffer first. */
|
||||
pipe_surface_reference(&pipe->ctx->framebuffer.state.cbufs[id], NULL);
|
||||
pipe->ctx->framebuffer.state.cbufs[id] = pipe->ctx->b.b.create_surface(
|
||||
(struct pipe_context *)pipe->ctx,
|
||||
(struct pipe_resource *)bo, &rat_templ);
|
||||
|
@@ -1193,8 +1193,8 @@ static void si_shader_selector_key_hw_vs(struct si_context *sctx,
|
||||
uint64_t inputs_read = 0;
|
||||
|
||||
/* ignore POSITION, PSIZE */
|
||||
outputs_written &= ~((1ull << si_shader_io_get_unique_index(TGSI_SEMANTIC_POSITION, 0) |
|
||||
(1ull << si_shader_io_get_unique_index(TGSI_SEMANTIC_PSIZE, 0))));
|
||||
outputs_written &= ~((1ull << si_shader_io_get_unique_index(TGSI_SEMANTIC_POSITION, 0)) |
|
||||
(1ull << si_shader_io_get_unique_index(TGSI_SEMANTIC_PSIZE, 0)));
|
||||
|
||||
if (!ps_disabled) {
|
||||
inputs_read = ps->inputs_read;
|
||||
|
@@ -137,6 +137,28 @@ brw_blorp_surface_info_init(struct blorp_context *blorp,
|
||||
*/
|
||||
if (is_render_target && blorp->isl_dev->info->gen <= 6)
|
||||
info->view.array_len = MIN2(info->view.array_len, 512);
|
||||
|
||||
if (surf->tile_x_sa || surf->tile_y_sa) {
|
||||
/* This is only allowed on simple 2D surfaces without MSAA */
|
||||
assert(info->surf.dim == ISL_SURF_DIM_2D);
|
||||
assert(info->surf.samples == 1);
|
||||
assert(info->surf.levels == 1);
|
||||
assert(info->surf.logical_level0_px.array_len == 1);
|
||||
assert(info->aux_usage == ISL_AUX_USAGE_NONE);
|
||||
|
||||
info->tile_x_sa = surf->tile_x_sa;
|
||||
info->tile_y_sa = surf->tile_y_sa;
|
||||
|
||||
/* Instead of using the X/Y Offset fields in RENDER_SURFACE_STATE, we
|
||||
* place the image at the tile boundary and offset our sampling or
|
||||
* rendering. For this reason, we need to grow the image by the offset
|
||||
* to ensure that the hardware doesn't think we've gone past the edge.
|
||||
*/
|
||||
info->surf.logical_level0_px.w += surf->tile_x_sa;
|
||||
info->surf.logical_level0_px.h += surf->tile_y_sa;
|
||||
info->surf.phys_level0_sa.w += surf->tile_x_sa;
|
||||
info->surf.phys_level0_sa.h += surf->tile_y_sa;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@@ -109,6 +109,9 @@ struct blorp_surf
|
||||
* that it contains a swizzle of RGBA and resource min LOD of 0.
|
||||
*/
|
||||
struct blorp_address clear_color_addr;
|
||||
|
||||
/* Only allowed for simple 2D non-MSAA surfaces */
|
||||
uint32_t tile_x_sa, tile_y_sa;
|
||||
};
|
||||
|
||||
void
|
||||
|
@@ -2413,7 +2413,9 @@ blorp_copy(struct blorp_batch *batch,
|
||||
dst_layer, ISL_FORMAT_UNSUPPORTED, true);
|
||||
|
||||
struct brw_blorp_blit_prog_key wm_prog_key = {
|
||||
.shader_type = BLORP_SHADER_TYPE_BLIT
|
||||
.shader_type = BLORP_SHADER_TYPE_BLIT,
|
||||
.need_src_offset = src_surf->tile_x_sa || src_surf->tile_y_sa,
|
||||
.need_dst_offset = dst_surf->tile_x_sa || dst_surf->tile_y_sa,
|
||||
};
|
||||
|
||||
const struct isl_format_layout *src_fmtl =
|
||||
|
@@ -438,6 +438,15 @@ blorp_clear(struct blorp_batch *batch,
|
||||
params.x1 = x1;
|
||||
params.y1 = y1;
|
||||
|
||||
if (params.dst.tile_x_sa || params.dst.tile_y_sa) {
|
||||
assert(params.dst.surf.samples == 1);
|
||||
assert(num_layers == 1);
|
||||
params.x0 += params.dst.tile_x_sa;
|
||||
params.y0 += params.dst.tile_y_sa;
|
||||
params.x1 += params.dst.tile_x_sa;
|
||||
params.y1 += params.dst.tile_y_sa;
|
||||
}
|
||||
|
||||
/* The MinLOD and MinimumArrayElement don't work properly for cube maps.
|
||||
* Convert them to a single slice on gen4.
|
||||
*/
|
||||
|
@@ -632,10 +632,10 @@ static const struct gen_device_info gen_device_info_glk = {
|
||||
.l3_banks = 2,
|
||||
};
|
||||
|
||||
/*TODO: Initialize l3_banks when we know the number. */
|
||||
static const struct gen_device_info gen_device_info_glk_2x6 = {
|
||||
GEN9_LP_FEATURES_2X6,
|
||||
.is_geminilake = true,
|
||||
.l3_banks = 2,
|
||||
};
|
||||
|
||||
static const struct gen_device_info gen_device_info_cfl_gt1 = {
|
||||
|
@@ -3696,6 +3696,7 @@ brw_rounding_mode(struct brw_codegen *p,
|
||||
if (bits != BRW_CR0_RND_MODE_MASK) {
|
||||
brw_inst *inst = brw_AND(p, brw_cr0_reg(0), brw_cr0_reg(0),
|
||||
brw_imm_ud(~BRW_CR0_RND_MODE_MASK));
|
||||
brw_inst_set_exec_size(p->devinfo, inst, BRW_EXECUTE_1);
|
||||
|
||||
/* From the Skylake PRM, Volume 7, page 760:
|
||||
* "Implementation Restriction on Register Access: When the control
|
||||
@@ -3710,6 +3711,7 @@ brw_rounding_mode(struct brw_codegen *p,
|
||||
if (bits) {
|
||||
brw_inst *inst = brw_OR(p, brw_cr0_reg(0), brw_cr0_reg(0),
|
||||
brw_imm_ud(bits));
|
||||
brw_inst_set_exec_size(p->devinfo, inst, BRW_EXECUTE_1);
|
||||
brw_inst_set_thread_control(p->devinfo, inst, BRW_THREAD_SWITCH);
|
||||
}
|
||||
}
|
||||
|
@@ -365,9 +365,18 @@ dri3_handle_present_event(struct loader_dri3_drawable *draw,
|
||||
* checking for wrap.
|
||||
*/
|
||||
if (ce->kind == XCB_PRESENT_COMPLETE_KIND_PIXMAP) {
|
||||
draw->recv_sbc = (draw->send_sbc & 0xffffffff00000000LL) | ce->serial;
|
||||
if (draw->recv_sbc > draw->send_sbc)
|
||||
draw->recv_sbc -= 0x100000000;
|
||||
uint64_t recv_sbc = (draw->send_sbc & 0xffffffff00000000LL) | ce->serial;
|
||||
|
||||
/* Only assume wraparound if that results in exactly the previous
|
||||
* SBC + 1, otherwise ignore received SBC > sent SBC (those are
|
||||
* probably from a previous loader_dri3_drawable instance) to avoid
|
||||
* calculating bogus target MSC values in loader_dri3_swap_buffers_msc
|
||||
*/
|
||||
if (recv_sbc <= draw->send_sbc)
|
||||
draw->recv_sbc = recv_sbc;
|
||||
else if (recv_sbc == (draw->recv_sbc + 0x100000001ULL))
|
||||
draw->recv_sbc = recv_sbc - 0x100000000ULL;
|
||||
|
||||
switch (ce->mode) {
|
||||
case XCB_PRESENT_COMPLETE_MODE_FLIP:
|
||||
draw->flipping = true;
|
||||
|
@@ -148,6 +148,8 @@ blorp_surf_for_miptree(struct brw_context *brw,
|
||||
.mocs = brw_get_bo_mocs(devinfo, mt->bo),
|
||||
},
|
||||
.aux_usage = aux_usage,
|
||||
.tile_x_sa = mt->level[*level].level_x,
|
||||
.tile_y_sa = mt->level[*level].level_y,
|
||||
};
|
||||
|
||||
struct isl_surf *aux_surf = NULL;
|
||||
|
@@ -602,26 +602,15 @@ brw_emit_buffer_surface_state(struct brw_context *brw,
|
||||
.mocs = brw_get_bo_mocs(devinfo, bo));
|
||||
}
|
||||
|
||||
void
|
||||
brw_update_buffer_texture_surface(struct gl_context *ctx,
|
||||
unsigned unit,
|
||||
uint32_t *surf_offset)
|
||||
static unsigned
|
||||
buffer_texture_range_size(struct brw_context *brw,
|
||||
struct gl_texture_object *obj)
|
||||
{
|
||||
struct brw_context *brw = brw_context(ctx);
|
||||
struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
|
||||
struct intel_buffer_object *intel_obj =
|
||||
intel_buffer_object(tObj->BufferObject);
|
||||
uint32_t size = tObj->BufferSize;
|
||||
struct brw_bo *bo = NULL;
|
||||
mesa_format format = tObj->_BufferObjectFormat;
|
||||
const enum isl_format isl_format = brw_isl_format_for_mesa_format(format);
|
||||
int texel_size = _mesa_get_format_bytes(format);
|
||||
|
||||
if (intel_obj) {
|
||||
size = MIN2(size, intel_obj->Base.Size);
|
||||
bo = intel_bufferobj_buffer(brw, intel_obj, tObj->BufferOffset, size,
|
||||
false);
|
||||
}
|
||||
assert(obj->Target == GL_TEXTURE_BUFFER);
|
||||
const unsigned texel_size = _mesa_get_format_bytes(obj->_BufferObjectFormat);
|
||||
const unsigned buffer_size = (!obj->BufferObject ? 0 :
|
||||
obj->BufferObject->Size);
|
||||
const unsigned buffer_offset = MIN2(buffer_size, obj->BufferOffset);
|
||||
|
||||
/* The ARB_texture_buffer_specification says:
|
||||
*
|
||||
@@ -639,7 +628,29 @@ brw_update_buffer_texture_surface(struct gl_context *ctx,
|
||||
* so that when ISL divides by stride to obtain the number of texels, that
|
||||
* texel count is clamped to MAX_TEXTURE_BUFFER_SIZE.
|
||||
*/
|
||||
size = MIN2(size, ctx->Const.MaxTextureBufferSize * (unsigned) texel_size);
|
||||
return MIN3((unsigned)obj->BufferSize,
|
||||
buffer_size - buffer_offset,
|
||||
brw->ctx.Const.MaxTextureBufferSize * texel_size);
|
||||
}
|
||||
|
||||
void
|
||||
brw_update_buffer_texture_surface(struct gl_context *ctx,
|
||||
unsigned unit,
|
||||
uint32_t *surf_offset)
|
||||
{
|
||||
struct brw_context *brw = brw_context(ctx);
|
||||
struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
|
||||
struct intel_buffer_object *intel_obj =
|
||||
intel_buffer_object(tObj->BufferObject);
|
||||
const unsigned size = buffer_texture_range_size(brw, tObj);
|
||||
struct brw_bo *bo = NULL;
|
||||
mesa_format format = tObj->_BufferObjectFormat;
|
||||
const enum isl_format isl_format = brw_isl_format_for_mesa_format(format);
|
||||
int texel_size = _mesa_get_format_bytes(format);
|
||||
|
||||
if (intel_obj)
|
||||
bo = intel_bufferobj_buffer(brw, intel_obj, tObj->BufferOffset, size,
|
||||
false);
|
||||
|
||||
if (isl_format == ISL_FORMAT_UNSUPPORTED) {
|
||||
_mesa_problem(NULL, "bad format %s for texture buffer\n",
|
||||
@@ -1426,8 +1437,7 @@ update_buffer_image_param(struct brw_context *brw,
|
||||
unsigned surface_idx,
|
||||
struct brw_image_param *param)
|
||||
{
|
||||
struct gl_buffer_object *obj = u->TexObj->BufferObject;
|
||||
const uint32_t size = MIN2((uint32_t)u->TexObj->BufferSize, obj->Size);
|
||||
const unsigned size = buffer_texture_range_size(brw, u->TexObj);
|
||||
update_default_image_param(brw, u, surface_idx, param);
|
||||
|
||||
param->size[0] = size / _mesa_get_format_bytes(u->_ActualFormat);
|
||||
@@ -1459,14 +1469,17 @@ update_image_surface(struct brw_context *brw,
|
||||
const unsigned format = get_image_format(brw, u->_ActualFormat, access);
|
||||
|
||||
if (obj->Target == GL_TEXTURE_BUFFER) {
|
||||
struct intel_buffer_object *intel_obj =
|
||||
intel_buffer_object(obj->BufferObject);
|
||||
const unsigned texel_size = (format == ISL_FORMAT_RAW ? 1 :
|
||||
_mesa_get_format_bytes(u->_ActualFormat));
|
||||
const unsigned buffer_size = buffer_texture_range_size(brw, obj);
|
||||
struct brw_bo *const bo = !obj->BufferObject ? NULL :
|
||||
intel_bufferobj_buffer(brw, intel_buffer_object(obj->BufferObject),
|
||||
obj->BufferOffset, buffer_size,
|
||||
access != GL_READ_ONLY);
|
||||
|
||||
brw_emit_buffer_surface_state(
|
||||
brw, surf_offset, intel_obj->buffer, obj->BufferOffset,
|
||||
format, intel_obj->Base.Size, texel_size,
|
||||
brw, surf_offset, bo, obj->BufferOffset,
|
||||
format, buffer_size, texel_size,
|
||||
access != GL_READ_ONLY ? RELOC_WRITE : 0);
|
||||
|
||||
update_buffer_image_param(brw, u, surface_idx, param);
|
||||
|
@@ -1767,13 +1767,11 @@ intel_miptree_alloc_ccs(struct brw_context *brw,
|
||||
* A CCS value of 0 indicates that the corresponding block is in the
|
||||
* pass-through state which is what we want.
|
||||
*
|
||||
* For CCS_D, on the other hand, we don't care as we're about to perform a
|
||||
* fast-clear operation. In that case, being hot in caches more useful.
|
||||
* For CCS_D, do the same thing. On gen9+, this avoids having any undefined
|
||||
* bits in the aux buffer.
|
||||
*/
|
||||
const uint32_t alloc_flags = mt->aux_usage == ISL_AUX_USAGE_CCS_E ?
|
||||
BO_ALLOC_ZEROED : BO_ALLOC_BUSY;
|
||||
mt->mcs_buf = intel_alloc_aux_buffer(brw, "ccs-miptree",
|
||||
&temp_ccs_surf, alloc_flags, mt);
|
||||
mt->mcs_buf = intel_alloc_aux_buffer(brw, "ccs-miptree", &temp_ccs_surf,
|
||||
BO_ALLOC_ZEROED, mt);
|
||||
if (!mt->mcs_buf) {
|
||||
free(aux_state);
|
||||
return false;
|
||||
|
@@ -6606,7 +6606,7 @@ save_Uniform1ui(GLint location, GLuint x)
|
||||
n[2].i = x;
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
/*CALL_Uniform1ui(ctx->Exec, (location, x));*/
|
||||
CALL_Uniform1ui(ctx->Exec, (location, x));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6623,7 +6623,7 @@ save_Uniform2ui(GLint location, GLuint x, GLuint y)
|
||||
n[3].i = y;
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
/*CALL_Uniform2ui(ctx->Exec, (location, x, y));*/
|
||||
CALL_Uniform2ui(ctx->Exec, (location, x, y));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6641,7 +6641,7 @@ save_Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z)
|
||||
n[4].i = z;
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
/*CALL_Uniform3ui(ctx->Exec, (location, x, y, z));*/
|
||||
CALL_Uniform3ui(ctx->Exec, (location, x, y, z));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6660,7 +6660,7 @@ save_Uniform4ui(GLint location, GLuint x, GLuint y, GLuint z, GLuint w)
|
||||
n[5].i = w;
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
/*CALL_Uniform4ui(ctx->Exec, (location, x, y, z, w));*/
|
||||
CALL_Uniform4ui(ctx->Exec, (location, x, y, z, w));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6679,7 +6679,7 @@ save_Uniform1uiv(GLint location, GLsizei count, const GLuint *v)
|
||||
save_pointer(&n[3], memdup(v, count * 1 * sizeof(*v)));
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
/*CALL_Uniform1uiv(ctx->Exec, (location, count, v));*/
|
||||
CALL_Uniform1uiv(ctx->Exec, (location, count, v));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6696,7 +6696,7 @@ save_Uniform2uiv(GLint location, GLsizei count, const GLuint *v)
|
||||
save_pointer(&n[3], memdup(v, count * 2 * sizeof(*v)));
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
/*CALL_Uniform2uiv(ctx->Exec, (location, count, v));*/
|
||||
CALL_Uniform2uiv(ctx->Exec, (location, count, v));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6713,7 +6713,7 @@ save_Uniform3uiv(GLint location, GLsizei count, const GLuint *v)
|
||||
save_pointer(&n[3], memdup(v, count * 3 * sizeof(*v)));
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
/*CALL_Uniform3uiv(ctx->Exec, (location, count, v));*/
|
||||
CALL_Uniform3uiv(ctx->Exec, (location, count, v));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6730,7 +6730,7 @@ save_Uniform4uiv(GLint location, GLsizei count, const GLuint *v)
|
||||
save_pointer(&n[3], memdup(v, count * 4 * sizeof(*v)));
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
/*CALL_Uniform4uiv(ctx->Exec, (location, count, v));*/
|
||||
CALL_Uniform4uiv(ctx->Exec, (location, count, v));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8742,34 +8742,29 @@ execute_list(struct gl_context *ctx, GLuint list)
|
||||
CALL_Uniform4iv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
|
||||
break;
|
||||
case OPCODE_UNIFORM_1UI:
|
||||
/*CALL_Uniform1uiARB(ctx->Exec, (n[1].i, n[2].i));*/
|
||||
CALL_Uniform1ui(ctx->Exec, (n[1].i, n[2].i));
|
||||
break;
|
||||
case OPCODE_UNIFORM_2UI:
|
||||
/*CALL_Uniform2uiARB(ctx->Exec, (n[1].i, n[2].i, n[3].i));*/
|
||||
CALL_Uniform2ui(ctx->Exec, (n[1].i, n[2].i, n[3].i));
|
||||
break;
|
||||
case OPCODE_UNIFORM_3UI:
|
||||
/*CALL_Uniform3uiARB(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));*/
|
||||
CALL_Uniform3ui(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));
|
||||
break;
|
||||
case OPCODE_UNIFORM_4UI:
|
||||
/*CALL_Uniform4uiARB(ctx->Exec,
|
||||
(n[1].i, n[2].i, n[3].i, n[4].i, n[5].i));
|
||||
*/
|
||||
CALL_Uniform4ui(ctx->Exec,
|
||||
(n[1].i, n[2].i, n[3].i, n[4].i, n[5].i));
|
||||
break;
|
||||
case OPCODE_UNIFORM_1UIV:
|
||||
/*CALL_Uniform1uivARB(ctx->Exec, (n[1].i, n[2].i,
|
||||
get_pointer(&n[3])));*/
|
||||
CALL_Uniform1uiv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
|
||||
break;
|
||||
case OPCODE_UNIFORM_2UIV:
|
||||
/*CALL_Uniform2uivARB(ctx->Exec, (n[1].i, n[2].i,
|
||||
get_pointer(&n[3])));*/
|
||||
CALL_Uniform2uiv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
|
||||
break;
|
||||
case OPCODE_UNIFORM_3UIV:
|
||||
/*CALL_Uniform3uivARB(ctx->Exec, (n[1].i, n[2].i,
|
||||
get_pointer(&n[3])));*/
|
||||
CALL_Uniform3uiv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
|
||||
break;
|
||||
case OPCODE_UNIFORM_4UIV:
|
||||
/*CALL_Uniform4uivARB(ctx->Exec, (n[1].i, n[2].i,
|
||||
get_pointer(&n[3])));*/
|
||||
CALL_Uniform4uiv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
|
||||
break;
|
||||
case OPCODE_UNIFORM_MATRIX22:
|
||||
CALL_UniformMatrix2fv(ctx->Exec,
|
||||
@@ -9949,7 +9944,6 @@ _mesa_initialize_save_table(const struct gl_context *ctx)
|
||||
SET_ClearBufferuiv(table, save_ClearBufferuiv);
|
||||
SET_ClearBufferfv(table, save_ClearBufferfv);
|
||||
SET_ClearBufferfi(table, save_ClearBufferfi);
|
||||
#if 0
|
||||
SET_Uniform1ui(table, save_Uniform1ui);
|
||||
SET_Uniform2ui(table, save_Uniform2ui);
|
||||
SET_Uniform3ui(table, save_Uniform3ui);
|
||||
@@ -9958,16 +9952,6 @@ _mesa_initialize_save_table(const struct gl_context *ctx)
|
||||
SET_Uniform2uiv(table, save_Uniform2uiv);
|
||||
SET_Uniform3uiv(table, save_Uniform3uiv);
|
||||
SET_Uniform4uiv(table, save_Uniform4uiv);
|
||||
#else
|
||||
(void) save_Uniform1ui;
|
||||
(void) save_Uniform2ui;
|
||||
(void) save_Uniform3ui;
|
||||
(void) save_Uniform4ui;
|
||||
(void) save_Uniform1uiv;
|
||||
(void) save_Uniform2uiv;
|
||||
(void) save_Uniform3uiv;
|
||||
(void) save_Uniform4uiv;
|
||||
#endif
|
||||
|
||||
/* These are: */
|
||||
SET_BeginTransformFeedback(table, save_BeginTransformFeedback);
|
||||
|
@@ -563,6 +563,8 @@ _mesa_bytes_per_vertex_attrib(GLint comps, GLenum type)
|
||||
return sizeof(GLuint);
|
||||
else
|
||||
return -1;
|
||||
case GL_UNSIGNED_INT64_ARB:
|
||||
return comps * 8;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
@@ -159,6 +159,9 @@ _mesa_free_shader_state(struct gl_context *ctx)
|
||||
{
|
||||
for (int i = 0; i < MESA_SHADER_STAGES; i++) {
|
||||
_mesa_reference_program(ctx, &ctx->Shader.CurrentProgram[i], NULL);
|
||||
_mesa_reference_shader_program(ctx,
|
||||
&ctx->Shader.ReferencedPrograms[i],
|
||||
NULL);
|
||||
}
|
||||
_mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, NULL);
|
||||
|
||||
|
@@ -477,13 +477,6 @@ _mesa_is_image_unit_valid(struct gl_context *ctx, struct gl_image_unit *u)
|
||||
if (!t)
|
||||
return GL_FALSE;
|
||||
|
||||
/* The GL 4.5 Core spec doesn't say anything about buffers. In practice,
|
||||
* the image buffer format is always compatible with the underlying
|
||||
* buffer storage.
|
||||
*/
|
||||
if (t->Target == GL_TEXTURE_BUFFER)
|
||||
return GL_TRUE;
|
||||
|
||||
if (!t->_BaseComplete && !t->_MipmapComplete)
|
||||
_mesa_test_texobj_completeness(ctx, t);
|
||||
|
||||
@@ -497,14 +490,20 @@ _mesa_is_image_unit_valid(struct gl_context *ctx, struct gl_image_unit *u)
|
||||
u->_Layer >= _mesa_get_texture_layers(t, u->Level))
|
||||
return GL_FALSE;
|
||||
|
||||
struct gl_texture_image *img = (t->Target == GL_TEXTURE_CUBE_MAP ?
|
||||
t->Image[u->_Layer][u->Level] :
|
||||
t->Image[0][u->Level]);
|
||||
if (t->Target == GL_TEXTURE_BUFFER) {
|
||||
tex_format = _mesa_get_shader_image_format(t->BufferObjectFormat);
|
||||
|
||||
if (!img || img->Border || img->NumSamples > ctx->Const.MaxImageSamples)
|
||||
return GL_FALSE;
|
||||
} else {
|
||||
struct gl_texture_image *img = (t->Target == GL_TEXTURE_CUBE_MAP ?
|
||||
t->Image[u->_Layer][u->Level] :
|
||||
t->Image[0][u->Level]);
|
||||
|
||||
if (!img || img->Border || img->NumSamples > ctx->Const.MaxImageSamples)
|
||||
return GL_FALSE;
|
||||
|
||||
tex_format = _mesa_get_shader_image_format(img->InternalFormat);
|
||||
}
|
||||
|
||||
tex_format = _mesa_get_shader_image_format(img->InternalFormat);
|
||||
if (!tex_format)
|
||||
return GL_FALSE;
|
||||
|
||||
|
@@ -2471,19 +2471,10 @@ st_finalize_texture(struct gl_context *ctx,
|
||||
if (tObj->Immutable)
|
||||
return GL_TRUE;
|
||||
|
||||
if (_mesa_is_texture_complete(tObj, &tObj->Sampler)) {
|
||||
/* The texture is complete and we know exactly how many mipmap levels
|
||||
* are present/needed. This is conditional because we may be called
|
||||
* from the st_generate_mipmap() function when the texture object is
|
||||
* incomplete. In that case, we'll have set stObj->lastLevel before
|
||||
* we get here.
|
||||
*/
|
||||
if (stObj->base.Sampler.MinFilter == GL_LINEAR ||
|
||||
stObj->base.Sampler.MinFilter == GL_NEAREST)
|
||||
stObj->lastLevel = stObj->base.BaseLevel;
|
||||
else
|
||||
stObj->lastLevel = stObj->base._MaxLevel;
|
||||
}
|
||||
if (tObj->_MipmapComplete)
|
||||
stObj->lastLevel = stObj->base._MaxLevel;
|
||||
else if (tObj->_BaseComplete)
|
||||
stObj->lastLevel = stObj->base.BaseLevel;
|
||||
|
||||
/* Skip the loop over images in the common case of no images having
|
||||
* changed. But if the GL_BASE_LEVEL or GL_MAX_LEVEL change to something we
|
||||
|
@@ -190,8 +190,8 @@ vbo_attrtype_to_double_flag(GLenum format)
|
||||
case GL_FLOAT:
|
||||
case GL_INT:
|
||||
case GL_UNSIGNED_INT:
|
||||
case GL_UNSIGNED_INT64_ARB:
|
||||
return GL_FALSE;
|
||||
case GL_UNSIGNED_INT64_ARB:
|
||||
case GL_DOUBLE:
|
||||
return GL_TRUE;
|
||||
default:
|
||||
|
Reference in New Issue
Block a user