Merge remote branch 'origin/master' into pipe-video
Conflicts: src/gallium/auxiliary/Makefile src/gallium/auxiliary/SConscript
This commit is contained in:
@@ -347,23 +347,19 @@ GALLIUM_FILES = \
|
||||
|
||||
DRI_FILES = \
|
||||
$(DIRECTORY)/include/GL/internal/dri_interface.h \
|
||||
$(DIRECTORY)/include/GL/internal/glcore.h \
|
||||
$(DIRECTORY)/include/GL/internal/sarea.h \
|
||||
$(DIRECTORY)/src/glx/Makefile \
|
||||
$(DIRECTORY)/src/glx/Makefile \
|
||||
$(DIRECTORY)/src/glx/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/Makefile.template \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/dri.pc.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/common/xmlpool/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/common/xmlpool/*.po \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*.cpp \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/Doxyfile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/server/*.[ch]
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/Doxyfile
|
||||
|
||||
SGI_GLU_FILES = \
|
||||
$(DIRECTORY)/src/glu/Makefile \
|
||||
|
||||
@@ -1737,6 +1737,19 @@ if test "x$enable_gallium_swrast" = xyes || test "x$enable_gallium_swrast" = xau
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl Gallium noop configuration
|
||||
dnl
|
||||
AC_ARG_ENABLE([gallium-noop],
|
||||
[AS_HELP_STRING([--enable-gallium-noop],
|
||||
[build gallium radeon @<:@default=disabled@:>@])],
|
||||
[enable_gallium_noop="$enableval"],
|
||||
[enable_gallium_noop=auto])
|
||||
if test "x$enable_gallium_noop" = xyes; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS noop"
|
||||
GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS dri-noop"
|
||||
fi
|
||||
|
||||
dnl prepend CORE_DIRS to SRC_DIRS
|
||||
SRC_DIRS="$CORE_DIRS $SRC_DIRS"
|
||||
|
||||
|
||||
+6
-5
@@ -20,7 +20,7 @@ Float textures, renderbuffers some infrastructure done
|
||||
Framebuffer objects (GL_EXT_framebuffer_object) DONE
|
||||
Half-float some infrastructure done
|
||||
Multisample blit DONE
|
||||
Non-normalized Integer texture/framebuffer formats not started
|
||||
Non-normalized Integer texture/framebuffer formats ~50% done
|
||||
1D/2D Texture arrays core Mesa, swrast done
|
||||
Packed depth/stencil formats DONE
|
||||
Per-buffer blend and masks (GL_EXT_draw_buffers2) DONE
|
||||
@@ -31,10 +31,11 @@ Transform feedback (GL_EXT_transform_feedback) ~50% done
|
||||
glBindBufferRange, glBindBufferBase commands
|
||||
Vertex array objects (GL_APPLE_vertex_array_object) DONE
|
||||
sRGB framebuffer format (GL_EXT_framebuffer_sRGB) not started
|
||||
glClearBuffer commands DONE, except for dispatch
|
||||
glGetStringi command DONE, except for dispatch
|
||||
glTexParameterI, glGetTexParameterI commands DONE, except for dispatch
|
||||
glVertexAttribI commands not started
|
||||
glClearBuffer commands DONE
|
||||
glGetStringi command DONE
|
||||
glTexParameterI, glGetTexParameterI commands DONE
|
||||
glVertexAttribI commands DONE (but converts int
|
||||
values to floats)
|
||||
|
||||
|
||||
GL 3.1:
|
||||
|
||||
@@ -49,7 +49,7 @@ tbd
|
||||
|
||||
<h2>Changes</h2>
|
||||
<ul>
|
||||
<li>tbd</li>
|
||||
<li>Upgraded glext.h to version 66</li>
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
|
||||
+18
-7
@@ -29,9 +29,9 @@ extern "C" {
|
||||
*/
|
||||
|
||||
/* Header file version number, required by OpenGL ABI for Linux */
|
||||
/* glext.h last updated $Date: 2010-08-03 01:30:25 -0700 (Tue, 03 Aug 2010) $ */
|
||||
/* glext.h last updated $Date: 2010-11-03 18:59:30 -0700 (Wed, 03 Nov 2010) $ */
|
||||
/* Current version at http://www.opengl.org/registry/ */
|
||||
#define GL_GLEXT_VERSION 64
|
||||
#define GL_GLEXT_VERSION 66
|
||||
/* Function declaration macros - to move into glplatform.h */
|
||||
|
||||
#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
|
||||
@@ -4840,7 +4840,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef GL_AMD_seamless_cubemap_per_texture
|
||||
/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB */
|
||||
/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */
|
||||
#endif
|
||||
|
||||
#ifndef GL_AMD_conservative_depth
|
||||
@@ -4925,6 +4925,8 @@ extern "C" {
|
||||
#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B
|
||||
#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C
|
||||
#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D
|
||||
#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E
|
||||
#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F
|
||||
#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44
|
||||
#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45
|
||||
#endif
|
||||
@@ -5019,6 +5021,11 @@ extern "C" {
|
||||
#ifndef GL_AMD_transform_feedback3_lines_triangles
|
||||
#endif
|
||||
|
||||
#ifndef GL_AMD_depth_clamp_separate
|
||||
#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E
|
||||
#define GL_DEPTH_CLAMP_FAR_AMD 0x901F
|
||||
#endif
|
||||
|
||||
|
||||
/*************************************************************/
|
||||
|
||||
@@ -8765,8 +8772,8 @@ GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdoubl
|
||||
GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v);
|
||||
GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
|
||||
GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v);
|
||||
GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLuint count, const GLdouble *v);
|
||||
GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLuint count, const GLfloat *v);
|
||||
GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v);
|
||||
GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v);
|
||||
GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs);
|
||||
GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform);
|
||||
GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer);
|
||||
@@ -8830,8 +8837,8 @@ typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint in
|
||||
typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v);
|
||||
typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
|
||||
typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v);
|
||||
typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v);
|
||||
typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v);
|
||||
typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v);
|
||||
typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v);
|
||||
typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs);
|
||||
typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform);
|
||||
typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer);
|
||||
@@ -11020,6 +11027,10 @@ typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, cons
|
||||
#define GL_AMD_transform_feedback3_lines_triangles 1
|
||||
#endif
|
||||
|
||||
#ifndef GL_AMD_depth_clamp_separate
|
||||
#define GL_AMD_depth_clamp_separate 1
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -899,10 +899,20 @@ const int i915_chip_ids[] = {
|
||||
0x29b2, /* PCI_CHIP_Q35_G */
|
||||
0x29c2, /* PCI_CHIP_G33_G */
|
||||
0x29d2, /* PCI_CHIP_Q33_G */
|
||||
0xa001, /* PCI_CHIP_IGD_G */
|
||||
0xa011, /* Pineview */
|
||||
};
|
||||
|
||||
const int i965_chip_ids[] = {
|
||||
0x0042, /* PCI_CHIP_ILD_G */
|
||||
0x0046, /* PCI_CHIP_ILM_G */
|
||||
0x0102, /* PCI_CHIP_SANDYBRIDGE_GT1 */
|
||||
0x0106, /* PCI_CHIP_SANDYBRIDGE_M_GT1 */
|
||||
0x010a, /* PCI_CHIP_SANDYBRIDGE_S */
|
||||
0x0112, /* PCI_CHIP_SANDYBRIDGE_GT2 */
|
||||
0x0116, /* PCI_CHIP_SANDYBRIDGE_M_GT2 */
|
||||
0x0122, /* PCI_CHIP_SANDYBRIDGE_GT2_PLUS */
|
||||
0x0126, /* PCI_CHIP_SANDYBRIDGE_M_GT2_PLUS */
|
||||
0x29a2, /* PCI_CHIP_I965_G */
|
||||
0x2992, /* PCI_CHIP_I965_Q */
|
||||
0x2982, /* PCI_CHIP_I965_G_1 */
|
||||
@@ -914,6 +924,8 @@ const int i965_chip_ids[] = {
|
||||
0x2e12, /* PCI_CHIP_Q45_G */
|
||||
0x2e22, /* PCI_CHIP_G45_G */
|
||||
0x2e32, /* PCI_CHIP_G41_G */
|
||||
0x2e42, /* PCI_CHIP_B43_G */
|
||||
0x2e92, /* PCI_CHIP_B43_G1 */
|
||||
};
|
||||
|
||||
const int r100_chip_ids[] = {
|
||||
|
||||
@@ -143,7 +143,6 @@ C_SOURCES = \
|
||||
util/u_transfer.c \
|
||||
util/u_resource.c \
|
||||
util/u_upload_mgr.c \
|
||||
target-helpers/wrap_screen.c \
|
||||
vl/vl_bitstream_parser.c \
|
||||
vl/vl_mpeg12_mc_renderer.c \
|
||||
vl/vl_compositor.c \
|
||||
@@ -222,3 +221,4 @@ util/u_format_table.c: util/u_format_table.py util/u_format_pack.py util/u_forma
|
||||
|
||||
util/u_half.c: util/u_half.py
|
||||
$(PYTHON2) util/u_half.py > $@
|
||||
# DO NOT DELETE
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2007 Tungsten Graphics, Inc., Bismarck, ND., USA
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
/*
|
||||
* Authors:
|
||||
* Keith Whitwell
|
||||
*/
|
||||
|
||||
#include "target-helpers/wrap_screen.h"
|
||||
#include "trace/tr_public.h"
|
||||
#include "rbug/rbug_public.h"
|
||||
#include "identity/id_public.h"
|
||||
#include "util/u_debug.h"
|
||||
|
||||
|
||||
/* Centralized code to inject common wrapping layers:
|
||||
*/
|
||||
struct pipe_screen *
|
||||
gallium_wrap_screen( struct pipe_screen *screen )
|
||||
{
|
||||
/* Screen wrapping functions are required not to fail. If it is
|
||||
* impossible to wrap a screen, the unwrapped screen should be
|
||||
* returned instead. Any failure condition should be returned in
|
||||
* an OUT argument.
|
||||
*
|
||||
* Otherwise it is really messy trying to clean up in this code.
|
||||
*/
|
||||
if (debug_get_bool_option("GALLIUM_WRAP", FALSE)) {
|
||||
screen = identity_screen_create(screen);
|
||||
}
|
||||
|
||||
/* Trace does its own checking if it should run */
|
||||
screen = trace_screen_create(screen);
|
||||
|
||||
/* Rbug does its own checking if it should run */
|
||||
screen = rbug_screen_create(screen);
|
||||
|
||||
return screen;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
#ifndef WRAP_SCREEN_HELPER_H
|
||||
#define WRAP_SCREEN_HELPER_H
|
||||
|
||||
#include "pipe/p_compiler.h"
|
||||
|
||||
struct pipe_screen;
|
||||
|
||||
/* Centralized code to inject common wrapping layers. Other layers
|
||||
* can be introduced by specific targets, but these are the generally
|
||||
* helpful ones we probably want everywhere.
|
||||
*/
|
||||
struct pipe_screen *
|
||||
gallium_wrap_screen( struct pipe_screen *screen );
|
||||
|
||||
|
||||
#endif
|
||||
@@ -383,6 +383,11 @@ tgsi_exec_get_shader_param(enum pipe_shader_cap param)
|
||||
return TGSI_EXEC_NUM_PREDS;
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1007,7 +1007,8 @@ static const char *semantic_names[TGSI_SEMANTIC_COUNT] =
|
||||
"FACE",
|
||||
"EDGEFLAG",
|
||||
"PRIM_ID",
|
||||
"INSTANCEID"
|
||||
"INSTANCEID",
|
||||
"STENCIL"
|
||||
};
|
||||
|
||||
static const char *interpolate_names[TGSI_INTERPOLATE_COUNT] =
|
||||
|
||||
@@ -973,6 +973,8 @@
|
||||
#define PCI_CHIP_G33_G 0x29C2
|
||||
#define PCI_CHIP_Q35_G 0x29B2
|
||||
#define PCI_CHIP_Q33_G 0x29D2
|
||||
#define PCI_CHIP_PINEVIEW_G 0xA001
|
||||
#define PCI_CHIP_PINEVIEW_M 0xA011
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -32,6 +32,7 @@ struct i915_screen;
|
||||
|
||||
#include "util/u_transfer.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "i915_winsys.h"
|
||||
|
||||
|
||||
struct i915_context;
|
||||
@@ -52,13 +53,12 @@ struct i915_buffer {
|
||||
struct i915_texture {
|
||||
struct u_resource b;
|
||||
|
||||
/* tiling flags */
|
||||
enum i915_winsys_buffer_tile tiling;
|
||||
unsigned stride;
|
||||
unsigned depth_stride; /* per-image on i945? */
|
||||
unsigned total_nblocksy;
|
||||
|
||||
unsigned sw_tiled; /**< tiled with software flags */
|
||||
unsigned hw_tiled; /**< tiled with hardware fences */
|
||||
|
||||
unsigned nr_images[I915_MAX_TEXTURE_2D_LEVELS];
|
||||
|
||||
/* Explicitly store the offset of each image for each cube face or
|
||||
|
||||
@@ -165,7 +165,7 @@ i9x5_scanout_layout(struct i915_texture *tex)
|
||||
if (pt->width0 >= 240) {
|
||||
tex->stride = get_pot_stride(pt->format, pt->width0);
|
||||
tex->total_nblocksy = align_nblocksy(pt->format, pt->height0, 8);
|
||||
tex->hw_tiled = I915_TILE_X;
|
||||
tex->tiling = I915_TILE_X;
|
||||
} else if (pt->width0 == 64 && pt->height0 == 64) {
|
||||
tex->stride = get_pot_stride(pt->format, pt->width0);
|
||||
tex->total_nblocksy = align_nblocksy(pt->format, pt->height0, 8);
|
||||
@@ -202,7 +202,7 @@ i9x5_display_target_layout(struct i915_texture *tex)
|
||||
|
||||
tex->stride = get_pot_stride(pt->format, pt->width0);
|
||||
tex->total_nblocksy = align_nblocksy(pt->format, pt->height0, 8);
|
||||
tex->hw_tiled = I915_TILE_X;
|
||||
tex->tiling = I915_TILE_X;
|
||||
|
||||
#if DEBUG_TEXTURE
|
||||
debug_printf("%s size: %d,%d,%d offset %d,%d (0x%x)\n", __FUNCTION__,
|
||||
@@ -790,9 +790,8 @@ i915_texture_create(struct pipe_screen *screen,
|
||||
goto fail;
|
||||
|
||||
/* setup any hw fences */
|
||||
if (tex->hw_tiled) {
|
||||
assert(tex->sw_tiled == I915_TILE_NONE);
|
||||
iws->buffer_set_fence_reg(iws, tex->buffer, tex->stride, tex->hw_tiled);
|
||||
if (tex->tiling) {
|
||||
iws->buffer_set_fence_reg(iws, tex->buffer, tex->stride, tex->tiling);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -83,6 +83,12 @@ i915_get_name(struct pipe_screen *screen)
|
||||
case PCI_CHIP_Q33_G:
|
||||
chipset = "Q33";
|
||||
break;
|
||||
case PCI_CHIP_PINEVIEW_G:
|
||||
chipset = "Pineview G";
|
||||
break;
|
||||
case PCI_CHIP_PINEVIEW_M:
|
||||
chipset = "Pineview M";
|
||||
break;
|
||||
default:
|
||||
chipset = "unknown";
|
||||
break;
|
||||
@@ -178,6 +184,11 @@ i915_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_sha
|
||||
return 0;
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 0;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 1;
|
||||
default:
|
||||
assert(0);
|
||||
return 0;
|
||||
@@ -220,10 +231,6 @@ i915_is_format_supported(struct pipe_screen *screen,
|
||||
static const enum pipe_format tex_supported[] = {
|
||||
PIPE_FORMAT_B8G8R8A8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8X8_UNORM,
|
||||
PIPE_FORMAT_R8G8B8A8_UNORM,
|
||||
#if 0
|
||||
PIPE_FORMAT_R8G8B8X8_UNORM,
|
||||
#endif
|
||||
PIPE_FORMAT_B5G6R5_UNORM,
|
||||
PIPE_FORMAT_L8_UNORM,
|
||||
PIPE_FORMAT_A8_UNORM,
|
||||
@@ -346,6 +353,8 @@ i915_screen_create(struct i915_winsys *iws)
|
||||
case PCI_CHIP_G33_G:
|
||||
case PCI_CHIP_Q33_G:
|
||||
case PCI_CHIP_Q35_G:
|
||||
case PCI_CHIP_PINEVIEW_G:
|
||||
case PCI_CHIP_PINEVIEW_M:
|
||||
is->is_i945 = TRUE;
|
||||
break;
|
||||
|
||||
|
||||
@@ -224,10 +224,6 @@ i915_emit_hardware_state(struct i915_context *i915 )
|
||||
struct i915_texture *tex = i915_texture(cbuf_surface->texture);
|
||||
assert(tex);
|
||||
|
||||
if (tex && tex->sw_tiled) {
|
||||
ctile = BUF_3D_TILED_SURFACE;
|
||||
}
|
||||
|
||||
OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
|
||||
|
||||
OUT_BATCH(BUF_3D_ID_COLOR_BACK |
|
||||
@@ -246,10 +242,6 @@ i915_emit_hardware_state(struct i915_context *i915 )
|
||||
struct i915_texture *tex = i915_texture(depth_surface->texture);
|
||||
assert(tex);
|
||||
|
||||
if (tex && tex->sw_tiled) {
|
||||
ztile = BUF_3D_TILED_SURFACE;
|
||||
}
|
||||
|
||||
OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
|
||||
|
||||
assert(tex);
|
||||
|
||||
@@ -267,11 +267,6 @@ static void update_map(struct i915_context *i915,
|
||||
assert(format);
|
||||
assert(pitch);
|
||||
|
||||
if (tex->sw_tiled) {
|
||||
assert(!((pitch - 1) & pitch));
|
||||
tiled = MS3_TILED_SURFACE;
|
||||
}
|
||||
|
||||
/* MS3 state */
|
||||
state[0] =
|
||||
(((height - 1) << MS3_HEIGHT_SHIFT)
|
||||
|
||||
@@ -235,6 +235,11 @@ brw_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shad
|
||||
return 0;
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 1;
|
||||
default:
|
||||
assert(0);
|
||||
return 0;
|
||||
|
||||
@@ -4,7 +4,10 @@
|
||||
TOP = ../../../..
|
||||
include $(TOP)/configs/current
|
||||
|
||||
LIBNAME = noop
|
||||
|
||||
C_SOURCES = \
|
||||
sw.c
|
||||
noop_pipe.c \
|
||||
noop_state.c
|
||||
|
||||
include ../../Makefile.template
|
||||
@@ -0,0 +1,15 @@
|
||||
#######################################################################
|
||||
# SConscript for noop convenience library
|
||||
|
||||
Import('*')
|
||||
|
||||
env = env.Clone()
|
||||
|
||||
noop = env.ConvenienceLibrary(
|
||||
target = 'noop',
|
||||
source = [
|
||||
'noop_pipe.c',
|
||||
'noop_state.c'
|
||||
]
|
||||
) + extra
|
||||
Export('noop')
|
||||
@@ -0,0 +1,550 @@
|
||||
/*
|
||||
* Copyright 2010 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
* license, and/or sell copies of the Software, and to permit persons to whom
|
||||
* the Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <pipe/p_defines.h>
|
||||
#include <pipe/p_state.h>
|
||||
#include <pipe/p_context.h>
|
||||
#include <pipe/p_screen.h>
|
||||
#include <util/u_memory.h>
|
||||
#include <util/u_inlines.h>
|
||||
#include <util/u_format.h>
|
||||
#include "noop_public.h"
|
||||
#include "state_tracker/sw_winsys.h"
|
||||
|
||||
void noop_init_state_functions(struct pipe_context *ctx);
|
||||
|
||||
/*
|
||||
* query
|
||||
*/
|
||||
struct noop_query {
|
||||
unsigned query;
|
||||
};
|
||||
static struct pipe_query *noop_create_query(struct pipe_context *ctx, unsigned query_type)
|
||||
{
|
||||
struct noop_query *query = CALLOC_STRUCT(noop_query);
|
||||
|
||||
return (struct pipe_query *)query;
|
||||
}
|
||||
|
||||
static void noop_destroy_query(struct pipe_context *ctx, struct pipe_query *query)
|
||||
{
|
||||
FREE(query);
|
||||
}
|
||||
|
||||
static void noop_begin_query(struct pipe_context *ctx, struct pipe_query *query)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_end_query(struct pipe_context *ctx, struct pipe_query *query)
|
||||
{
|
||||
}
|
||||
|
||||
static boolean noop_get_query_result(struct pipe_context *ctx,
|
||||
struct pipe_query *query,
|
||||
boolean wait, void *vresult)
|
||||
{
|
||||
uint64_t *result = (uint64_t*)vresult;
|
||||
|
||||
*result = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* resource
|
||||
*/
|
||||
struct noop_resource {
|
||||
struct pipe_resource base;
|
||||
unsigned size;
|
||||
char *data;
|
||||
struct sw_displaytarget *dt;
|
||||
};
|
||||
|
||||
static unsigned noop_is_resource_referenced(struct pipe_context *pipe,
|
||||
struct pipe_resource *resource,
|
||||
unsigned face, unsigned level)
|
||||
{
|
||||
return PIPE_UNREFERENCED;
|
||||
}
|
||||
|
||||
static struct pipe_resource *noop_resource_create(struct pipe_screen *screen,
|
||||
const struct pipe_resource *templ)
|
||||
{
|
||||
struct noop_resource *nresource;
|
||||
unsigned stride;
|
||||
|
||||
nresource = CALLOC_STRUCT(noop_resource);
|
||||
if (nresource == NULL)
|
||||
return NULL;
|
||||
|
||||
stride = util_format_get_stride(templ->format, templ->width0);
|
||||
nresource->base = *templ;
|
||||
nresource->base.screen = screen;
|
||||
nresource->size = stride * templ->height0 * templ->depth0;
|
||||
nresource->data = malloc(nresource->size);
|
||||
pipe_reference_init(&nresource->base.reference, 1);
|
||||
if (nresource->data == NULL) {
|
||||
FREE(nresource);
|
||||
return NULL;
|
||||
}
|
||||
#if 0
|
||||
if (nresource->base.bind & (PIPE_BIND_DISPLAY_TARGET |
|
||||
PIPE_BIND_SCANOUT |
|
||||
PIPE_BIND_SHARED)) {
|
||||
struct sw_winsys *winsys = (struct sw_winsys *)screen->winsys;
|
||||
unsigned stride;
|
||||
|
||||
nresource->dt = winsys->displaytarget_create(winsys, nresource->base.bind,
|
||||
nresource->base.format,
|
||||
nresource->base.width0,
|
||||
nresource->base.height0,
|
||||
16, &stride);
|
||||
}
|
||||
#endif
|
||||
return &nresource->base;
|
||||
}
|
||||
|
||||
static struct pipe_resource *noop_resource_from_handle(struct pipe_screen * screen,
|
||||
const struct pipe_resource *templ,
|
||||
struct winsys_handle *whandle)
|
||||
{
|
||||
struct sw_winsys *winsys = (struct sw_winsys *)screen->winsys;
|
||||
struct noop_resource *nresource;
|
||||
struct sw_displaytarget *dt;
|
||||
unsigned stride;
|
||||
|
||||
dt = winsys->displaytarget_from_handle(winsys, templ, whandle, &stride);
|
||||
if (dt == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
nresource = (struct noop_resource *)noop_resource_create(screen, templ);
|
||||
nresource->dt = dt;
|
||||
return &nresource->base;
|
||||
}
|
||||
|
||||
static boolean noop_resource_get_handle(struct pipe_screen *screen,
|
||||
struct pipe_resource *resource,
|
||||
struct winsys_handle *handle)
|
||||
{
|
||||
struct sw_winsys *winsys = (struct sw_winsys *)screen->winsys;
|
||||
struct noop_resource *nresource = (struct noop_resource *)resource;
|
||||
|
||||
if (nresource->dt == NULL)
|
||||
return FALSE;
|
||||
|
||||
return winsys->displaytarget_get_handle(winsys, nresource->dt, handle);
|
||||
}
|
||||
|
||||
static void noop_resource_destroy(struct pipe_screen *screen,
|
||||
struct pipe_resource *resource)
|
||||
{
|
||||
struct noop_resource *nresource = (struct noop_resource *)resource;
|
||||
|
||||
if (nresource->dt) {
|
||||
/* display target */
|
||||
struct sw_winsys *winsys = (struct sw_winsys *)screen->winsys;
|
||||
winsys->displaytarget_destroy(winsys, nresource->dt);
|
||||
}
|
||||
free(nresource->data);
|
||||
FREE(resource);
|
||||
}
|
||||
|
||||
static struct pipe_resource *noop_user_buffer_create(struct pipe_screen *screen,
|
||||
void *ptr, unsigned bytes,
|
||||
unsigned bind)
|
||||
{
|
||||
struct pipe_resource templ;
|
||||
|
||||
templ.target = PIPE_BUFFER;
|
||||
templ.format = PIPE_FORMAT_R8_UNORM;
|
||||
templ.usage = PIPE_USAGE_IMMUTABLE;
|
||||
templ.bind = bind;
|
||||
templ.width0 = bytes;
|
||||
templ.height0 = 1;
|
||||
templ.depth0 = 1;
|
||||
templ.flags = 0;
|
||||
return noop_resource_create(screen, &templ);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* transfer
|
||||
*/
|
||||
static struct pipe_transfer *noop_get_transfer(struct pipe_context *context,
|
||||
struct pipe_resource *resource,
|
||||
struct pipe_subresource sr,
|
||||
enum pipe_transfer_usage usage,
|
||||
const struct pipe_box *box)
|
||||
{
|
||||
struct pipe_transfer *transfer;
|
||||
|
||||
transfer = CALLOC_STRUCT(pipe_transfer);
|
||||
if (transfer == NULL)
|
||||
return NULL;
|
||||
pipe_resource_reference(&transfer->resource, resource);
|
||||
transfer->sr = sr;
|
||||
transfer->usage = usage;
|
||||
transfer->box = *box;
|
||||
transfer->stride = 1;
|
||||
transfer->slice_stride = 1;
|
||||
return transfer;
|
||||
}
|
||||
|
||||
static void *noop_transfer_map(struct pipe_context *pipe,
|
||||
struct pipe_transfer *transfer)
|
||||
{
|
||||
struct noop_resource *nresource = (struct noop_resource *)transfer->resource;
|
||||
|
||||
return nresource->data;
|
||||
}
|
||||
|
||||
static void noop_transfer_flush_region(struct pipe_context *pipe,
|
||||
struct pipe_transfer *transfer,
|
||||
const struct pipe_box *box)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_transfer_unmap(struct pipe_context *pipe,
|
||||
struct pipe_transfer *transfer)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_transfer_destroy(struct pipe_context *pipe,
|
||||
struct pipe_transfer *transfer)
|
||||
{
|
||||
pipe_resource_reference(&transfer->resource, NULL);
|
||||
FREE(transfer);
|
||||
}
|
||||
|
||||
static void noop_transfer_inline_write(struct pipe_context *pipe,
|
||||
struct pipe_resource *resource,
|
||||
struct pipe_subresource sr,
|
||||
unsigned usage,
|
||||
const struct pipe_box *box,
|
||||
const void *data,
|
||||
unsigned stride,
|
||||
unsigned slice_stride)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* clear/copy
|
||||
*/
|
||||
static void noop_clear(struct pipe_context *ctx, unsigned buffers,
|
||||
const float *rgba, double depth, unsigned stencil)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_clear_render_target(struct pipe_context *ctx,
|
||||
struct pipe_surface *dst,
|
||||
const float *rgba,
|
||||
unsigned dstx, unsigned dsty,
|
||||
unsigned width, unsigned height)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_clear_depth_stencil(struct pipe_context *ctx,
|
||||
struct pipe_surface *dst,
|
||||
unsigned clear_flags,
|
||||
double depth,
|
||||
unsigned stencil,
|
||||
unsigned dstx, unsigned dsty,
|
||||
unsigned width, unsigned height)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_resource_copy_region(struct pipe_context *ctx,
|
||||
struct pipe_resource *dst,
|
||||
struct pipe_subresource subdst,
|
||||
unsigned dstx, unsigned dsty, unsigned dstz,
|
||||
struct pipe_resource *src,
|
||||
struct pipe_subresource subsrc,
|
||||
unsigned srcx, unsigned srcy, unsigned srcz,
|
||||
unsigned width, unsigned height)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* context
|
||||
*/
|
||||
static void noop_flush(struct pipe_context *ctx, unsigned flags,
|
||||
struct pipe_fence_handle **fence)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_destroy_context(struct pipe_context *ctx)
|
||||
{
|
||||
FREE(ctx);
|
||||
}
|
||||
|
||||
static struct pipe_context *noop_create_context(struct pipe_screen *screen, void *priv)
|
||||
{
|
||||
struct pipe_context *ctx = CALLOC_STRUCT(pipe_context);
|
||||
|
||||
if (ctx == NULL)
|
||||
return NULL;
|
||||
ctx->winsys = screen->winsys;
|
||||
ctx->screen = screen;
|
||||
ctx->priv = priv;
|
||||
ctx->destroy = noop_destroy_context;
|
||||
ctx->flush = noop_flush;
|
||||
ctx->clear = noop_clear;
|
||||
ctx->clear_render_target = noop_clear_render_target;
|
||||
ctx->clear_depth_stencil = noop_clear_depth_stencil;
|
||||
ctx->resource_copy_region = noop_resource_copy_region;
|
||||
ctx->create_query = noop_create_query;
|
||||
ctx->destroy_query = noop_destroy_query;
|
||||
ctx->begin_query = noop_begin_query;
|
||||
ctx->end_query = noop_end_query;
|
||||
ctx->get_query_result = noop_get_query_result;
|
||||
ctx->get_transfer = noop_get_transfer;
|
||||
ctx->transfer_map = noop_transfer_map;
|
||||
ctx->transfer_flush_region = noop_transfer_flush_region;
|
||||
ctx->transfer_unmap = noop_transfer_unmap;
|
||||
ctx->transfer_destroy = noop_transfer_destroy;
|
||||
ctx->transfer_inline_write = noop_transfer_inline_write;
|
||||
ctx->is_resource_referenced = noop_is_resource_referenced;
|
||||
noop_init_state_functions(ctx);
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
/*
|
||||
* texture
|
||||
*/
|
||||
static struct pipe_surface *noop_get_tex_surface(struct pipe_screen *screen,
|
||||
struct pipe_resource *texture,
|
||||
unsigned face, unsigned level,
|
||||
unsigned zslice, unsigned flags)
|
||||
{
|
||||
struct pipe_surface *surface = CALLOC_STRUCT(pipe_surface);
|
||||
|
||||
if (surface == NULL)
|
||||
return NULL;
|
||||
pipe_reference_init(&surface->reference, 1);
|
||||
pipe_resource_reference(&surface->texture, texture);
|
||||
surface->format = texture->format;
|
||||
surface->width = texture->width0;
|
||||
surface->height = texture->height0;
|
||||
surface->offset = 0;
|
||||
surface->usage = flags;
|
||||
surface->zslice = zslice;
|
||||
surface->texture = texture;
|
||||
surface->face = face;
|
||||
surface->level = level;
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
static void noop_tex_surface_destroy(struct pipe_surface *surface)
|
||||
{
|
||||
pipe_resource_reference(&surface->texture, NULL);
|
||||
FREE(surface);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* pipe_screen
|
||||
*/
|
||||
static void noop_flush_frontbuffer(struct pipe_screen *_screen,
|
||||
struct pipe_surface *surface,
|
||||
void *context_private)
|
||||
{
|
||||
}
|
||||
|
||||
static const char *noop_get_vendor(struct pipe_screen* pscreen)
|
||||
{
|
||||
return "X.Org";
|
||||
}
|
||||
|
||||
static const char *noop_get_name(struct pipe_screen* pscreen)
|
||||
{
|
||||
return "NOOP";
|
||||
}
|
||||
|
||||
static int noop_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
|
||||
{
|
||||
switch (param) {
|
||||
/* Supported features (boolean caps). */
|
||||
case PIPE_CAP_NPOT_TEXTURES:
|
||||
case PIPE_CAP_TWO_SIDED_STENCIL:
|
||||
case PIPE_CAP_GLSL:
|
||||
case PIPE_CAP_OCCLUSION_QUERY:
|
||||
case PIPE_CAP_POINT_SPRITE:
|
||||
case PIPE_CAP_ANISOTROPIC_FILTER:
|
||||
case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
|
||||
case PIPE_CAP_TEXTURE_MIRROR_REPEAT:
|
||||
case PIPE_CAP_TEXTURE_SHADOW_MAP:
|
||||
case PIPE_CAP_TEXTURE_SWIZZLE:
|
||||
case PIPE_CAP_BLEND_EQUATION_SEPARATE:
|
||||
|
||||
return 1;
|
||||
case PIPE_CAP_DUAL_SOURCE_BLEND:
|
||||
|
||||
case PIPE_CAP_SM3:
|
||||
case PIPE_CAP_INDEP_BLEND_ENABLE:
|
||||
case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE:
|
||||
case PIPE_CAP_DEPTH_CLAMP:
|
||||
case PIPE_CAP_SHADER_STENCIL_EXPORT:
|
||||
case PIPE_CAP_TIMER_QUERY:
|
||||
case PIPE_CAP_STREAM_OUTPUT:
|
||||
case PIPE_CAP_PRIMITIVE_RESTART:
|
||||
case PIPE_CAP_INDEP_BLEND_FUNC:
|
||||
return 0;
|
||||
|
||||
/* Texturing. */
|
||||
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
|
||||
case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
|
||||
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
|
||||
return 14;
|
||||
case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
|
||||
return 16;
|
||||
case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
|
||||
case PIPE_CAP_MAX_COMBINED_SAMPLERS:
|
||||
return 16;
|
||||
|
||||
/* Render targets. */
|
||||
case PIPE_CAP_MAX_RENDER_TARGETS:
|
||||
return 8;
|
||||
|
||||
/* Fragment coordinate conventions. */
|
||||
case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
|
||||
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
|
||||
return 1;
|
||||
case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
|
||||
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
|
||||
return 0;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static float noop_get_paramf(struct pipe_screen* pscreen, enum pipe_cap param)
|
||||
{
|
||||
switch (param) {
|
||||
case PIPE_CAP_MAX_LINE_WIDTH:
|
||||
case PIPE_CAP_MAX_LINE_WIDTH_AA:
|
||||
case PIPE_CAP_MAX_POINT_WIDTH:
|
||||
case PIPE_CAP_MAX_POINT_WIDTH_AA:
|
||||
return 8192.0f;
|
||||
case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
|
||||
return 16.0f;
|
||||
case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
|
||||
return 16.0f;
|
||||
default:
|
||||
return 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
static int noop_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enum pipe_shader_cap param)
|
||||
{
|
||||
switch(shader)
|
||||
{
|
||||
case PIPE_SHADER_FRAGMENT:
|
||||
case PIPE_SHADER_VERTEX:
|
||||
case PIPE_SHADER_GEOMETRY:
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (param) {
|
||||
case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
|
||||
case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
|
||||
case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
|
||||
case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
|
||||
return 16384;
|
||||
case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
|
||||
return 8;
|
||||
case PIPE_SHADER_CAP_MAX_INPUTS:
|
||||
return 16;
|
||||
case PIPE_SHADER_CAP_MAX_TEMPS:
|
||||
return 256;
|
||||
case PIPE_SHADER_CAP_MAX_ADDRS:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_MAX_CONSTS:
|
||||
return 256;
|
||||
case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_MAX_PREDS:
|
||||
return 0;
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static boolean noop_is_format_supported(struct pipe_screen* screen,
|
||||
enum pipe_format format,
|
||||
enum pipe_texture_target target,
|
||||
unsigned sample_count,
|
||||
unsigned usage,
|
||||
unsigned geom_flags)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static void noop_destroy_screen(struct pipe_screen *screen)
|
||||
{
|
||||
FREE(screen);
|
||||
}
|
||||
|
||||
struct pipe_screen *noop_screen_create(struct sw_winsys *winsys)
|
||||
{
|
||||
struct pipe_screen *screen;
|
||||
|
||||
screen = CALLOC_STRUCT(pipe_screen);
|
||||
if (screen == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
screen->winsys = (struct pipe_winsys*)winsys;
|
||||
screen->destroy = noop_destroy_screen;
|
||||
screen->get_name = noop_get_name;
|
||||
screen->get_vendor = noop_get_vendor;
|
||||
screen->get_param = noop_get_param;
|
||||
screen->get_shader_param = noop_get_shader_param;
|
||||
screen->get_paramf = noop_get_paramf;
|
||||
screen->is_format_supported = noop_is_format_supported;
|
||||
screen->context_create = noop_create_context;
|
||||
screen->get_tex_surface = noop_get_tex_surface;
|
||||
screen->tex_surface_destroy = noop_tex_surface_destroy;
|
||||
screen->resource_create = noop_resource_create;
|
||||
screen->resource_from_handle = noop_resource_from_handle;
|
||||
screen->resource_get_handle = noop_resource_get_handle;
|
||||
screen->resource_destroy = noop_resource_destroy;
|
||||
screen->user_buffer_create = noop_user_buffer_create;
|
||||
screen->flush_frontbuffer = noop_flush_frontbuffer;
|
||||
|
||||
return screen;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2010 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
* license, and/or sell copies of the Software, and to permit persons to whom
|
||||
* the Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef NOOP_PUBLIC_H
|
||||
#define NOOP_PUBLIC_H
|
||||
|
||||
struct sw_winsys;
|
||||
|
||||
struct pipe_screen *noop_screen_create(struct sw_winsys *winsys);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,256 @@
|
||||
/*
|
||||
* Copyright 2010 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
* license, and/or sell copies of the Software, and to permit persons to whom
|
||||
* the Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <pipe/p_defines.h>
|
||||
#include <pipe/p_state.h>
|
||||
#include <pipe/p_context.h>
|
||||
#include <pipe/p_screen.h>
|
||||
#include <util/u_memory.h>
|
||||
#include <util/u_inlines.h>
|
||||
|
||||
static void noop_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_set_blend_color(struct pipe_context *ctx,
|
||||
const struct pipe_blend_color *state)
|
||||
{
|
||||
}
|
||||
|
||||
static void *noop_create_blend_state(struct pipe_context *ctx,
|
||||
const struct pipe_blend_state *state)
|
||||
{
|
||||
struct pipe_blend_state *nstate = CALLOC_STRUCT(pipe_blend_state);
|
||||
|
||||
if (nstate == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
*nstate = *state;
|
||||
return nstate;
|
||||
}
|
||||
|
||||
static void *noop_create_dsa_state(struct pipe_context *ctx,
|
||||
const struct pipe_depth_stencil_alpha_state *state)
|
||||
{
|
||||
struct pipe_depth_stencil_alpha_state *nstate = CALLOC_STRUCT(pipe_depth_stencil_alpha_state);
|
||||
|
||||
if (nstate == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
*nstate = *state;
|
||||
return nstate;
|
||||
}
|
||||
|
||||
static void *noop_create_rs_state(struct pipe_context *ctx,
|
||||
const struct pipe_rasterizer_state *state)
|
||||
{
|
||||
struct pipe_rasterizer_state *nstate = CALLOC_STRUCT(pipe_rasterizer_state);
|
||||
|
||||
if (nstate == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
*nstate = *state;
|
||||
return nstate;
|
||||
}
|
||||
|
||||
static void *noop_create_sampler_state(struct pipe_context *ctx,
|
||||
const struct pipe_sampler_state *state)
|
||||
{
|
||||
struct pipe_sampler_state *nstate = CALLOC_STRUCT(pipe_sampler_state);
|
||||
|
||||
if (nstate == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
*nstate = *state;
|
||||
return nstate;
|
||||
}
|
||||
|
||||
static struct pipe_sampler_view *noop_create_sampler_view(struct pipe_context *ctx,
|
||||
struct pipe_resource *texture,
|
||||
const struct pipe_sampler_view *state)
|
||||
{
|
||||
struct pipe_sampler_view *sampler_view = CALLOC_STRUCT(pipe_sampler_view);
|
||||
|
||||
if (sampler_view == NULL)
|
||||
return NULL;
|
||||
/* initialize base object */
|
||||
pipe_resource_reference(&sampler_view->texture, texture);
|
||||
pipe_reference_init(&sampler_view->reference, 1);
|
||||
sampler_view->context = ctx;
|
||||
return sampler_view;
|
||||
}
|
||||
|
||||
static void noop_set_vs_sampler_view(struct pipe_context *ctx, unsigned count,
|
||||
struct pipe_sampler_view **views)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
|
||||
struct pipe_sampler_view **views)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_bind_sampler(struct pipe_context *ctx, unsigned count, void **states)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_set_clip_state(struct pipe_context *ctx,
|
||||
const struct pipe_clip_state *state)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_set_polygon_stipple(struct pipe_context *ctx,
|
||||
const struct pipe_poly_stipple *state)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_set_scissor_state(struct pipe_context *ctx,
|
||||
const struct pipe_scissor_state *state)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_set_stencil_ref(struct pipe_context *ctx,
|
||||
const struct pipe_stencil_ref *state)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_set_viewport_state(struct pipe_context *ctx,
|
||||
const struct pipe_viewport_state *state)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_set_framebuffer_state(struct pipe_context *ctx,
|
||||
const struct pipe_framebuffer_state *state)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_set_constant_buffer(struct pipe_context *ctx,
|
||||
uint shader, uint index,
|
||||
struct pipe_resource *buffer)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static void noop_sampler_view_destroy(struct pipe_context *ctx,
|
||||
struct pipe_sampler_view *state)
|
||||
{
|
||||
pipe_resource_reference(&state->texture, NULL);
|
||||
FREE(state);
|
||||
}
|
||||
|
||||
static void noop_bind_state(struct pipe_context *ctx, void *state)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_delete_state(struct pipe_context *ctx, void *state)
|
||||
{
|
||||
FREE(state);
|
||||
}
|
||||
|
||||
static void noop_delete_vertex_element(struct pipe_context *ctx, void *state)
|
||||
{
|
||||
FREE(state);
|
||||
}
|
||||
|
||||
|
||||
static void noop_set_index_buffer(struct pipe_context *ctx,
|
||||
const struct pipe_index_buffer *ib)
|
||||
{
|
||||
}
|
||||
|
||||
static void noop_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
|
||||
const struct pipe_vertex_buffer *buffers)
|
||||
{
|
||||
}
|
||||
|
||||
static void *noop_create_vertex_elements(struct pipe_context *ctx,
|
||||
unsigned count,
|
||||
const struct pipe_vertex_element *state)
|
||||
{
|
||||
struct pipe_vertex_element *nstate = CALLOC_STRUCT(pipe_vertex_element);
|
||||
|
||||
if (nstate == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
*nstate = *state;
|
||||
return nstate;
|
||||
}
|
||||
|
||||
static void *noop_create_shader_state(struct pipe_context *ctx,
|
||||
const struct pipe_shader_state *state)
|
||||
{
|
||||
struct pipe_shader_state *nstate = CALLOC_STRUCT(pipe_shader_state);
|
||||
|
||||
if (nstate == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
*nstate = *state;
|
||||
return nstate;
|
||||
}
|
||||
|
||||
void noop_init_state_functions(struct pipe_context *ctx)
|
||||
{
|
||||
ctx->create_blend_state = noop_create_blend_state;
|
||||
ctx->create_depth_stencil_alpha_state = noop_create_dsa_state;
|
||||
ctx->create_fs_state = noop_create_shader_state;
|
||||
ctx->create_rasterizer_state = noop_create_rs_state;
|
||||
ctx->create_sampler_state = noop_create_sampler_state;
|
||||
ctx->create_sampler_view = noop_create_sampler_view;
|
||||
ctx->create_vertex_elements_state = noop_create_vertex_elements;
|
||||
ctx->create_vs_state = noop_create_shader_state;
|
||||
ctx->bind_blend_state = noop_bind_state;
|
||||
ctx->bind_depth_stencil_alpha_state = noop_bind_state;
|
||||
ctx->bind_fragment_sampler_states = noop_bind_sampler;
|
||||
ctx->bind_fs_state = noop_bind_state;
|
||||
ctx->bind_rasterizer_state = noop_bind_state;
|
||||
ctx->bind_vertex_elements_state = noop_bind_state;
|
||||
ctx->bind_vertex_sampler_states = noop_bind_sampler;
|
||||
ctx->bind_vs_state = noop_bind_state;
|
||||
ctx->delete_blend_state = noop_delete_state;
|
||||
ctx->delete_depth_stencil_alpha_state = noop_delete_state;
|
||||
ctx->delete_fs_state = noop_delete_state;
|
||||
ctx->delete_rasterizer_state = noop_delete_state;
|
||||
ctx->delete_sampler_state = noop_delete_state;
|
||||
ctx->delete_vertex_elements_state = noop_delete_vertex_element;
|
||||
ctx->delete_vs_state = noop_delete_state;
|
||||
ctx->set_blend_color = noop_set_blend_color;
|
||||
ctx->set_clip_state = noop_set_clip_state;
|
||||
ctx->set_constant_buffer = noop_set_constant_buffer;
|
||||
ctx->set_fragment_sampler_views = noop_set_ps_sampler_view;
|
||||
ctx->set_framebuffer_state = noop_set_framebuffer_state;
|
||||
ctx->set_polygon_stipple = noop_set_polygon_stipple;
|
||||
ctx->set_sample_mask = noop_set_sample_mask;
|
||||
ctx->set_scissor_state = noop_set_scissor_state;
|
||||
ctx->set_stencil_ref = noop_set_stencil_ref;
|
||||
ctx->set_vertex_buffers = noop_set_vertex_buffers;
|
||||
ctx->set_index_buffer = noop_set_index_buffer;
|
||||
ctx->set_vertex_sampler_views = noop_set_vs_sampler_view;
|
||||
ctx->set_viewport_state = noop_set_viewport_state;
|
||||
ctx->sampler_view_destroy = noop_sampler_view_destroy;
|
||||
ctx->draw_vbo = noop_draw_vbo;
|
||||
}
|
||||
@@ -171,6 +171,11 @@ nv50_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
|
||||
return NV50_CAP_MAX_PROGRAM_TEMPS;
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ nvfx_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
||||
case PIPE_CAP_POINT_SPRITE:
|
||||
return 1;
|
||||
case PIPE_CAP_MAX_RENDER_TARGETS:
|
||||
return screen->use_nv4x ? 4 : 2;
|
||||
return screen->use_nv4x ? 4 : 1;
|
||||
case PIPE_CAP_OCCLUSION_QUERY:
|
||||
return 1;
|
||||
case PIPE_CAP_TIMER_QUERY:
|
||||
@@ -119,6 +119,11 @@ nvfx_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, enum
|
||||
return 0; /* we could expose these, but nothing uses them */
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 0;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -151,6 +156,12 @@ nvfx_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, enum
|
||||
return 0; /* we could expose these, but nothing uses them */
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
return 0;
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 1;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -79,6 +79,9 @@ static void r300_release_referenced_objects(struct r300_context *r300)
|
||||
NULL);
|
||||
}
|
||||
|
||||
/* The dummy VBO. */
|
||||
pipe_resource_reference(&r300->dummy_vb, NULL);
|
||||
|
||||
/* The SWTCL VBO. */
|
||||
pipe_resource_reference(&r300->vbo, NULL);
|
||||
|
||||
@@ -488,6 +491,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
||||
rtempl.target = PIPE_TEXTURE_2D;
|
||||
rtempl.format = PIPE_FORMAT_I8_UNORM;
|
||||
rtempl.bind = PIPE_BIND_SAMPLER_VIEW;
|
||||
rtempl.usage = PIPE_USAGE_IMMUTABLE;
|
||||
rtempl.width0 = 1;
|
||||
rtempl.height0 = 1;
|
||||
rtempl.depth0 = 1;
|
||||
@@ -501,6 +505,19 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
||||
pipe_resource_reference(&tex, NULL);
|
||||
}
|
||||
|
||||
{
|
||||
struct pipe_resource vb = {};
|
||||
vb.target = PIPE_BUFFER;
|
||||
vb.format = PIPE_FORMAT_R8_UNORM;
|
||||
vb.bind = PIPE_BIND_VERTEX_BUFFER;
|
||||
vb.usage = PIPE_USAGE_IMMUTABLE;
|
||||
vb.width0 = sizeof(float) * 16;
|
||||
vb.height0 = 1;
|
||||
vb.depth0 = 1;
|
||||
|
||||
r300->dummy_vb = screen->resource_create(screen, &vb);
|
||||
}
|
||||
|
||||
return &r300->context;
|
||||
|
||||
fail:
|
||||
|
||||
@@ -480,6 +480,10 @@ struct r300_context {
|
||||
* dummy texture there. */
|
||||
struct r300_sampler_view *texkill_sampler;
|
||||
|
||||
/* When no vertex buffer is set, this one is used instead to prevent
|
||||
* hardlocks. */
|
||||
struct pipe_resource *dummy_vb;
|
||||
|
||||
/* The currently active query. */
|
||||
struct r300_query *query_current;
|
||||
/* The saved query for blitter operations. */
|
||||
|
||||
@@ -535,29 +535,8 @@ static void r300_draw_range_elements(struct pipe_context* pipe,
|
||||
r300->rws->get_value(r300->rws, R300_VID_DRM_2_3_0);
|
||||
unsigned short_count;
|
||||
int buffer_offset = 0, index_offset = 0; /* for index bias emulation */
|
||||
boolean translate = FALSE;
|
||||
unsigned new_offset;
|
||||
|
||||
if (r300->skip_rendering) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!u_trim_pipe_prim(mode, &count)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Index buffer range checking. */
|
||||
if ((start + count) * indexSize > indexBuffer->width0) {
|
||||
fprintf(stderr, "r300: Invalid index buffer range. Skipping rendering.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Set up fallback for incompatible vertex layout if needed. */
|
||||
if (r300->incompatible_vb_layout || r300->velems->incompatible_layout) {
|
||||
r300_begin_vertex_translate(r300);
|
||||
translate = TRUE;
|
||||
}
|
||||
|
||||
if (indexBias && !r500_index_bias_supported(r300)) {
|
||||
r300_split_index_bias(r300, indexBias, &buffer_offset, &index_offset);
|
||||
}
|
||||
@@ -603,10 +582,6 @@ done:
|
||||
if (indexBuffer != orgIndexBuffer) {
|
||||
pipe_resource_reference( &indexBuffer, NULL );
|
||||
}
|
||||
|
||||
if (translate) {
|
||||
r300_end_vertex_translate(r300);
|
||||
}
|
||||
}
|
||||
|
||||
static void r300_draw_arrays(struct pipe_context* pipe, unsigned mode,
|
||||
@@ -617,21 +592,6 @@ static void r300_draw_arrays(struct pipe_context* pipe, unsigned mode,
|
||||
count > 65536 &&
|
||||
r300->rws->get_value(r300->rws, R300_VID_DRM_2_3_0);
|
||||
unsigned short_count;
|
||||
boolean translate = FALSE;
|
||||
|
||||
if (r300->skip_rendering) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!u_trim_pipe_prim(mode, &count)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Set up fallback for incompatible vertex layout if needed. */
|
||||
if (r300->incompatible_vb_layout || r300->velems->incompatible_layout) {
|
||||
r300_begin_vertex_translate(r300);
|
||||
translate = TRUE;
|
||||
}
|
||||
|
||||
r300_update_derived_state(r300);
|
||||
|
||||
@@ -642,7 +602,7 @@ static void r300_draw_arrays(struct pipe_context* pipe, unsigned mode,
|
||||
if (!r300_prepare_for_rendering(r300,
|
||||
PREP_FIRST_DRAW | PREP_VALIDATE_VBOS | PREP_EMIT_AOS,
|
||||
NULL, 9, start, 0))
|
||||
goto done;
|
||||
return;
|
||||
|
||||
if (alt_num_verts || count <= 65535) {
|
||||
r300_emit_draw_arrays(r300, mode, count);
|
||||
@@ -659,32 +619,53 @@ static void r300_draw_arrays(struct pipe_context* pipe, unsigned mode,
|
||||
if (!r300_prepare_for_rendering(r300,
|
||||
PREP_VALIDATE_VBOS | PREP_EMIT_AOS, NULL, 9,
|
||||
start, 0))
|
||||
goto done;
|
||||
return;
|
||||
}
|
||||
} while (count);
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
if (translate) {
|
||||
r300_end_vertex_translate(r300);
|
||||
}
|
||||
}
|
||||
|
||||
static void r300_draw_vbo(struct pipe_context* pipe,
|
||||
const struct pipe_draw_info *info)
|
||||
{
|
||||
struct r300_context* r300 = r300_context(pipe);
|
||||
unsigned count = info->count;
|
||||
boolean translate = FALSE;
|
||||
boolean indexed = info->indexed && r300->index_buffer.buffer;
|
||||
unsigned start_indexed = 0;
|
||||
|
||||
if (!r300->velems->count || !r300->vertex_buffer_count)
|
||||
return;
|
||||
if (r300->skip_rendering) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (info->indexed && r300->index_buffer.buffer) {
|
||||
unsigned offset;
|
||||
if (!u_trim_pipe_prim(info->mode, &count)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Index buffer range checking. */
|
||||
if (indexed) {
|
||||
assert(r300->index_buffer.offset % r300->index_buffer.index_size == 0);
|
||||
offset = r300->index_buffer.offset / r300->index_buffer.index_size;
|
||||
|
||||
/* Compute start for draw_elements, taking the offset into account. */
|
||||
start_indexed =
|
||||
info->start +
|
||||
(r300->index_buffer.offset / r300->index_buffer.index_size);
|
||||
|
||||
if ((start_indexed + count) * r300->index_buffer.index_size >
|
||||
r300->index_buffer.buffer->width0) {
|
||||
fprintf(stderr, "r300: Invalid index buffer range. Skipping rendering.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up fallback for incompatible vertex layout if needed. */
|
||||
if (r300->incompatible_vb_layout || r300->velems->incompatible_layout) {
|
||||
r300_begin_vertex_translate(r300);
|
||||
translate = TRUE;
|
||||
}
|
||||
|
||||
if (indexed) {
|
||||
r300_draw_range_elements(pipe,
|
||||
r300->index_buffer.buffer,
|
||||
r300->index_buffer.index_size,
|
||||
@@ -692,14 +673,17 @@ static void r300_draw_vbo(struct pipe_context* pipe,
|
||||
info->min_index,
|
||||
info->max_index,
|
||||
info->mode,
|
||||
info->start + offset,
|
||||
info->count);
|
||||
}
|
||||
else {
|
||||
start_indexed,
|
||||
count);
|
||||
} else {
|
||||
r300_draw_arrays(pipe,
|
||||
info->mode,
|
||||
info->start,
|
||||
info->count);
|
||||
count);
|
||||
}
|
||||
|
||||
if (translate) {
|
||||
r300_end_vertex_translate(r300);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
#include "r300_winsys.h"
|
||||
#include "r300_public.h"
|
||||
|
||||
#include "draw/draw_context.h"
|
||||
|
||||
/* Return the identifier behind whom the brave coders responsible for this
|
||||
* amalgamation of code, sweat, and duct tape, routinely obscure their names.
|
||||
*
|
||||
@@ -207,9 +209,18 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e
|
||||
return is_r500 ? 1 : 0;
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case PIPE_SHADER_VERTEX:
|
||||
if (!r300screen->caps.has_tcl) {
|
||||
return draw_get_shader_param(shader, param);
|
||||
}
|
||||
|
||||
switch (param)
|
||||
{
|
||||
case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
|
||||
@@ -234,6 +245,12 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e
|
||||
return is_r500 ? 4 : 0; /* XXX guessed. */
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
return 0;
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 1;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -266,6 +283,13 @@ static float r300_get_paramf(struct pipe_screen* pscreen, enum pipe_cap param)
|
||||
return 16.0f;
|
||||
case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
|
||||
return 16.0f;
|
||||
case PIPE_CAP_GUARD_BAND_LEFT:
|
||||
case PIPE_CAP_GUARD_BAND_TOP:
|
||||
case PIPE_CAP_GUARD_BAND_RIGHT:
|
||||
case PIPE_CAP_GUARD_BAND_BOTTOM:
|
||||
/* XXX I don't know what these should be but the least we can do is
|
||||
* silence the potential error message */
|
||||
return 0.0f;
|
||||
default:
|
||||
debug_printf("r300: Warning: Unknown CAP %d in get_paramf.\n",
|
||||
param);
|
||||
|
||||
@@ -1448,6 +1448,15 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
|
||||
struct pipe_vertex_buffer *vbo;
|
||||
unsigned i, max_index = (1 << 24) - 1;
|
||||
boolean any_user_buffer = FALSE;
|
||||
struct pipe_vertex_buffer dummy_vb = {0};
|
||||
|
||||
/* There must be at least one vertex buffer set, otherwise it locks up. */
|
||||
if (!count) {
|
||||
dummy_vb.buffer = r300->dummy_vb;
|
||||
dummy_vb.max_index = r300->dummy_vb->width0 / 4;
|
||||
buffers = &dummy_vb;
|
||||
count = 1;
|
||||
}
|
||||
|
||||
if (count == r300->vertex_buffer_count &&
|
||||
memcmp(r300->vertex_buffer, buffers,
|
||||
@@ -1601,6 +1610,14 @@ static void* r300_create_vertex_elements_state(struct pipe_context* pipe,
|
||||
struct r300_vertex_element_state *velems;
|
||||
unsigned i;
|
||||
enum pipe_format *format;
|
||||
struct pipe_vertex_element dummy_attrib = {0};
|
||||
|
||||
/* R300 Programmable Stream Control (PSC) doesn't support 0 vertex elements. */
|
||||
if (!count) {
|
||||
dummy_attrib.src_format = PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
attribs = &dummy_attrib;
|
||||
count = 1;
|
||||
}
|
||||
|
||||
assert(count <= PIPE_MAX_ATTRIBS);
|
||||
velems = CALLOC_STRUCT(r300_vertex_element_state);
|
||||
@@ -1667,7 +1684,8 @@ static void* r300_create_vertex_elements_state(struct pipe_context* pipe,
|
||||
* swizzles are already set up.
|
||||
* Also compute the vertex size. */
|
||||
for (i = 0; i < count; i++) {
|
||||
/* This is OK because we check for aligned strides too. */
|
||||
/* This is OK because we check for aligned strides too
|
||||
* elsewhere. */
|
||||
velems->hw_format_size[i] =
|
||||
align(util_format_get_blocksize(velems->hw_format[i]), 4);
|
||||
velems->vertex_size_dwords += velems->hw_format_size[i] / 4;
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "util/u_math.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_pack_color.h"
|
||||
|
||||
#include "r300_context.h"
|
||||
#include "r300_fs.h"
|
||||
@@ -433,6 +434,8 @@ static void r300_update_rs_block(struct r300_context *r300)
|
||||
fp_offset++;
|
||||
col_count++;
|
||||
DBG(r300, DBG_RS, "r300: Rasterized FACE written to FS.\n");
|
||||
} else if (fs_inputs->face != ATTR_UNUSED) {
|
||||
fprintf(stderr, "r300: ERROR: FS input FACE unassigned.\n");
|
||||
}
|
||||
|
||||
/* Rasterize texture coordinates. */
|
||||
@@ -484,12 +487,10 @@ static void r300_update_rs_block(struct r300_context *r300)
|
||||
}
|
||||
}
|
||||
|
||||
if (DBG_ON(r300, DBG_RS)) {
|
||||
for (; i < ATTR_GENERIC_COUNT; i++) {
|
||||
if (fs_inputs->generic[i] != ATTR_UNUSED) {
|
||||
DBG(r300, DBG_RS,
|
||||
"r300: FS input generic %i unassigned.\n", i);
|
||||
}
|
||||
for (; i < ATTR_GENERIC_COUNT; i++) {
|
||||
if (fs_inputs->generic[i] != ATTR_UNUSED) {
|
||||
fprintf(stderr, "r300: ERROR: FS input generic %i unassigned, "
|
||||
"not enough hardware slots.\n", i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -520,7 +521,12 @@ static void r300_update_rs_block(struct r300_context *r300)
|
||||
if (fs_inputs->fog != ATTR_UNUSED) {
|
||||
fp_offset++;
|
||||
|
||||
DBG(r300, DBG_RS, "r300: FS input fog unassigned.\n");
|
||||
if (tex_count < 8) {
|
||||
DBG(r300, DBG_RS, "r300: FS input fog unassigned.\n");
|
||||
} else {
|
||||
fprintf(stderr, "r300: ERROR: FS input fog unassigned, "
|
||||
"not enough hardware slots.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -543,6 +549,11 @@ static void r300_update_rs_block(struct r300_context *r300)
|
||||
fp_offset++;
|
||||
tex_count++;
|
||||
tex_ptr += 4;
|
||||
} else {
|
||||
if (fs_inputs->wpos != ATTR_UNUSED && tex_count >= 8) {
|
||||
fprintf(stderr, "r300: ERROR: FS input WPOS unassigned, "
|
||||
"not enough hardware slots.\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Invalidate the rest of the no-TCL (GA) stream locations. */
|
||||
@@ -584,59 +595,56 @@ static uint32_t r300_get_border_color(enum pipe_format format,
|
||||
const float border[4])
|
||||
{
|
||||
const struct util_format_description *desc;
|
||||
float border_swizzled[4] = {
|
||||
border[2],
|
||||
border[1],
|
||||
border[0],
|
||||
border[3]
|
||||
};
|
||||
uint32_t r;
|
||||
float border_swizzled[4] = {0};
|
||||
unsigned i;
|
||||
union util_color uc = {0};
|
||||
|
||||
desc = util_format_description(format);
|
||||
|
||||
/* We don't use util_pack_format because it does not handle the formats
|
||||
* we want, e.g. R4G4B4A4 is non-existent in Gallium. */
|
||||
/* Apply inverse swizzle of the format. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
switch (desc->swizzle[i]) {
|
||||
case UTIL_FORMAT_SWIZZLE_X:
|
||||
border_swizzled[2] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_Y:
|
||||
border_swizzled[1] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_Z:
|
||||
border_swizzled[0] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_W:
|
||||
border_swizzled[3] = border[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (desc->channel[0].size) {
|
||||
case 4:
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xf0) >> 4) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xf0) << 0) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xf0) << 4) |
|
||||
((float_to_ubyte(border_swizzled[3]) & 0xf0) << 8);
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B4G4R4A4_UNORM, &uc);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
if (desc->channel[1].size == 5) {
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xf8) >> 3) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xf8) << 2) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xf8) << 7) |
|
||||
((float_to_ubyte(border_swizzled[3]) & 0x80) << 8);
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B5G5R5A1_UNORM, &uc);
|
||||
} else if (desc->channel[1].size == 6) {
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xf8) >> 3) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xfc) << 3) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xf8) << 8);
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B5G6R5_UNORM, &uc);
|
||||
} else {
|
||||
assert(0);
|
||||
r = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 16:
|
||||
r = ((float_to_ubyte(border_swizzled[2]) & 0xff) << 0) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xff) << 8) |
|
||||
((float_to_ubyte(border_swizzled[0]) & 0xff) << 16) |
|
||||
((float_to_ubyte(border_swizzled[3]) & 0xff) << 24);
|
||||
default:
|
||||
case 8:
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
|
||||
break;
|
||||
|
||||
case 8:
|
||||
default:
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xff) << 0) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xff) << 8) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xff) << 16) |
|
||||
((float_to_ubyte(border_swizzled[3]) & 0xff) << 24);
|
||||
case 10:
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B10G10R10A2_UNORM, &uc);
|
||||
break;
|
||||
}
|
||||
|
||||
return r;
|
||||
return uc.ui;
|
||||
}
|
||||
|
||||
static void r300_merge_textures_and_samplers(struct r300_context* r300)
|
||||
|
||||
@@ -363,10 +363,7 @@ void r300_tgsi_to_rc(struct tgsi_to_rc * ttr,
|
||||
break;
|
||||
case TGSI_TOKEN_TYPE_INSTRUCTION:
|
||||
inst = &parser.FullToken.FullInstruction;
|
||||
/* This hack with the RET opcode woudn't work with
|
||||
* conditionals. */
|
||||
if (inst->Instruction.Opcode == TGSI_OPCODE_END ||
|
||||
inst->Instruction.Opcode == TGSI_OPCODE_RET) {
|
||||
if (inst->Instruction.Opcode == TGSI_OPCODE_END) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -74,6 +74,8 @@ int eg_bc_cf_build(struct r600_bc *bc, struct r600_bc_cf *cf)
|
||||
case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END:
|
||||
case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE:
|
||||
case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK:
|
||||
case EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS:
|
||||
case EG_V_SQ_CF_WORD1_SQ_CF_INST_RETURN:
|
||||
bc->bytecode[id++] = S_SQ_CF_WORD0_ADDR(cf->cf_addr >> 1);
|
||||
bc->bytecode[id++] = S_SQ_CF_WORD1_CF_INST(cf->inst) |
|
||||
S_SQ_CF_WORD1_BARRIER(1) |
|
||||
|
||||
@@ -311,6 +311,7 @@ static inline uint32_t r600_translate_colorswap(enum pipe_format format)
|
||||
case PIPE_FORMAT_Z16_UNORM:
|
||||
return V_028C70_SWAP_STD;
|
||||
|
||||
case PIPE_FORMAT_L8A8_UNORM:
|
||||
case PIPE_FORMAT_R8G8_UNORM:
|
||||
return V_028C70_SWAP_STD;
|
||||
|
||||
@@ -400,6 +401,7 @@ static INLINE uint32_t r600_translate_colorformat(enum pipe_format format)
|
||||
case PIPE_FORMAT_Z16_UNORM:
|
||||
return V_028C70_COLOR_16;
|
||||
|
||||
case PIPE_FORMAT_L8A8_UNORM:
|
||||
case PIPE_FORMAT_R8G8_UNORM:
|
||||
return V_028C70_COLOR_8_8;
|
||||
|
||||
@@ -447,8 +449,10 @@ static INLINE uint32_t r600_translate_colorformat(enum pipe_format format)
|
||||
return V_028C70_COLOR_16_16;
|
||||
|
||||
/* 64-bit buffers. */
|
||||
case PIPE_FORMAT_R16G16B16A16_SSCALED:
|
||||
case PIPE_FORMAT_R16G16B16_USCALED:
|
||||
case PIPE_FORMAT_R16G16B16A16_USCALED:
|
||||
case PIPE_FORMAT_R16G16B16_SSCALED:
|
||||
case PIPE_FORMAT_R16G16B16A16_SSCALED:
|
||||
case PIPE_FORMAT_R16G16B16A16_UNORM:
|
||||
case PIPE_FORMAT_R16G16B16A16_SNORM:
|
||||
return V_028C70_COLOR_16_16_16_16;
|
||||
@@ -460,6 +464,7 @@ static INLINE uint32_t r600_translate_colorformat(enum pipe_format format)
|
||||
case PIPE_FORMAT_R32G32_FLOAT:
|
||||
return V_028C70_COLOR_32_32_FLOAT;
|
||||
|
||||
case PIPE_FORMAT_R32G32_USCALED:
|
||||
case PIPE_FORMAT_R32G32_SSCALED:
|
||||
return V_028C70_COLOR_32_32;
|
||||
|
||||
@@ -634,38 +639,4 @@ out_unknown:
|
||||
return ~0;
|
||||
}
|
||||
|
||||
static INLINE uint32_t r600_translate_vertex_data_swizzle(enum pipe_format format)
|
||||
{
|
||||
const struct util_format_description *desc = util_format_description(format);
|
||||
unsigned i;
|
||||
uint32_t word3;
|
||||
|
||||
assert(format);
|
||||
|
||||
if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) {
|
||||
fprintf(stderr, "r600: Bad format %s in %s:%d\n",
|
||||
util_format_short_name(format), __FUNCTION__, __LINE__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
word3 = 0;
|
||||
for (i = 0; i < desc->nr_channels; i++) {
|
||||
switch (i) {
|
||||
case 0:
|
||||
word3 |= S_03000C_DST_SEL_X(desc->swizzle[0]);
|
||||
break;
|
||||
case 1:
|
||||
word3 |= S_03000C_DST_SEL_Y(desc->swizzle[1]);
|
||||
break;
|
||||
case 2:
|
||||
word3 |= S_03000C_DST_SEL_Z(desc->swizzle[2]);
|
||||
break;
|
||||
case 3:
|
||||
word3 |= S_03000C_DST_SEL_W(desc->swizzle[3]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return word3;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -323,11 +323,11 @@ static void *evergreen_create_sampler_state(struct pipe_context *ctx,
|
||||
S_03C000_BORDER_COLOR_TYPE(uc.ui ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0), 0xFFFFFFFF, NULL);
|
||||
/* FIXME LOD it depends on texture base level ... */
|
||||
r600_pipe_state_add_reg(rstate, R_03C004_SQ_TEX_SAMPLER_WORD1_0,
|
||||
S_03C004_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 6)) |
|
||||
S_03C004_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 6)),
|
||||
S_03C004_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) |
|
||||
S_03C004_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8)),
|
||||
0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate, R_03C008_SQ_TEX_SAMPLER_WORD2_0,
|
||||
S_03C008_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 6)) |
|
||||
S_03C008_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) |
|
||||
S_03C008_TYPE(1),
|
||||
0xFFFFFFFF, NULL);
|
||||
|
||||
@@ -431,7 +431,7 @@ static void evergreen_set_vs_sampler_view(struct pipe_context *ctx, unsigned cou
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
if (resource[i]) {
|
||||
evergreen_context_pipe_state_set_vs_resource(&rctx->ctx, &resource[i]->state, i + PIPE_MAX_ATTRIBS);
|
||||
evergreen_context_pipe_state_set_vs_resource(&rctx->ctx, &resource[i]->state, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -501,16 +501,16 @@ static void evergreen_set_clip_state(struct pipe_context *ctx,
|
||||
rstate->id = R600_PIPE_STATE_CLIP;
|
||||
for (int i = 0; i < state->nr; i++) {
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_0285BC_PA_CL_UCP0_X + i * 4,
|
||||
R_0285BC_PA_CL_UCP0_X + i * 16,
|
||||
fui(state->ucp[i][0]), 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_0285C0_PA_CL_UCP0_Y + i * 4,
|
||||
R_0285C0_PA_CL_UCP0_Y + i * 16,
|
||||
fui(state->ucp[i][1]) , 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_0285C4_PA_CL_UCP0_Z + i * 4,
|
||||
R_0285C4_PA_CL_UCP0_Z + i * 16,
|
||||
fui(state->ucp[i][2]), 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_0285C8_PA_CL_UCP0_W + i * 4,
|
||||
R_0285C8_PA_CL_UCP0_W + i * 16,
|
||||
fui(state->ucp[i][3]), 0xFFFFFFFF, NULL);
|
||||
}
|
||||
r600_pipe_state_add_reg(rstate, R_028810_PA_CL_CLIP_CNTL,
|
||||
@@ -660,7 +660,7 @@ static void evergreen_cb(struct r600_pipe_context *rctx, struct r600_pipe_state
|
||||
S_028C70_COMP_SWAP(swap) |
|
||||
S_028C70_BLEND_CLAMP(1) |
|
||||
S_028C70_NUMBER_TYPE(ntype);
|
||||
if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
|
||||
if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
|
||||
color_info |= S_028C70_SOURCE_FORMAT(1);
|
||||
|
||||
/* FIXME handle enabling of CB beyond BASE8 which has different offset */
|
||||
@@ -1276,7 +1276,10 @@ void evergreen_draw(struct pipe_context *ctx, const struct pipe_draw_info *info)
|
||||
|
||||
word2 = format | S_030008_STRIDE(vertex_buffer->stride);
|
||||
|
||||
word3 = r600_translate_vertex_data_swizzle(rctx->vertex_elements->hw_format[i]);
|
||||
word3 = S_03000C_DST_SEL_X(V_03000C_SQ_SEL_X) |
|
||||
S_03000C_DST_SEL_Y(V_03000C_SQ_SEL_Y) |
|
||||
S_03000C_DST_SEL_Z(V_03000C_SQ_SEL_Z) |
|
||||
S_03000C_DST_SEL_W(V_03000C_SQ_SEL_W);
|
||||
|
||||
r600_pipe_state_add_reg(rstate, R_030000_RESOURCE0_WORD0, offset, 0xFFFFFFFF, rbuffer->bo);
|
||||
r600_pipe_state_add_reg(rstate, R_030004_RESOURCE0_WORD1, rbuffer->size - offset - 1, 0xFFFFFFFF, NULL);
|
||||
@@ -1286,7 +1289,7 @@ void evergreen_draw(struct pipe_context *ctx, const struct pipe_draw_info *info)
|
||||
r600_pipe_state_add_reg(rstate, R_030014_RESOURCE0_WORD5, 0x00000000, 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate, R_030018_RESOURCE0_WORD6, 0x00000000, 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate, R_03001C_RESOURCE0_WORD7, 0xC0000000, 0xFFFFFFFF, NULL);
|
||||
evergreen_vs_resource_set(&rctx->ctx, rstate, i);
|
||||
evergreen_fs_resource_set(&rctx->ctx, rstate, i);
|
||||
}
|
||||
|
||||
mask = 0;
|
||||
@@ -1464,8 +1467,8 @@ void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader
|
||||
S_0286E0_PERSP_CENTROID_ENA(have_centroid);
|
||||
if (have_linear)
|
||||
spi_baryc_cntl |= S_0286E0_LINEAR_CENTER_ENA(1) |
|
||||
S_0286E0_LINEAR_CENTROID_ENA(have_centroid);
|
||||
|
||||
S_0286E0_LINEAR_CENTROID_ENA(have_centroid);
|
||||
|
||||
r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0,
|
||||
spi_ps_in_control_0, 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1,
|
||||
@@ -1551,7 +1554,7 @@ void evergreen_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader
|
||||
(r600_bo_offset(shader->bo)) >> 8, 0xFFFFFFFF, shader->bo);
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_0288A4_SQ_PGM_START_FS,
|
||||
(r600_bo_offset(shader->bo)) >> 8, 0xFFFFFFFF, shader->bo);
|
||||
(r600_bo_offset(shader->bo)) >> 8, 0xFFFFFFFF, shader->bo_fetch);
|
||||
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_03A200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF,
|
||||
|
||||
@@ -264,6 +264,7 @@ void r600_context_fini(struct r600_context *ctx);
|
||||
void r600_context_pipe_state_set(struct r600_context *ctx, struct r600_pipe_state *state);
|
||||
void r600_context_pipe_state_set_ps_resource(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid);
|
||||
void r600_context_pipe_state_set_vs_resource(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid);
|
||||
void r600_context_pipe_state_set_fs_resource(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid);
|
||||
void r600_context_pipe_state_set_ps_sampler(struct r600_context *ctx, struct r600_pipe_state *state, unsigned id);
|
||||
void r600_context_pipe_state_set_vs_sampler(struct r600_context *ctx, struct r600_pipe_state *state, unsigned id);
|
||||
void r600_context_flush(struct r600_context *ctx);
|
||||
@@ -284,9 +285,11 @@ int evergreen_context_init(struct r600_context *ctx, struct radeon *radeon);
|
||||
void evergreen_context_draw(struct r600_context *ctx, const struct r600_draw *draw);
|
||||
void evergreen_ps_resource_set(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid);
|
||||
void evergreen_vs_resource_set(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid);
|
||||
void evergreen_fs_resource_set(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid);
|
||||
|
||||
void evergreen_context_pipe_state_set_ps_resource(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid);
|
||||
void evergreen_context_pipe_state_set_vs_resource(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid);
|
||||
void evergreen_context_pipe_state_set_fs_resource(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid);
|
||||
void evergreen_context_pipe_state_set_ps_sampler(struct r600_context *ctx, struct r600_pipe_state *state, unsigned id);
|
||||
void evergreen_context_pipe_state_set_vs_sampler(struct r600_context *ctx, struct r600_pipe_state *state, unsigned id);
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include "util/u_memory.h"
|
||||
#include "pipe/p_shader_tokens.h"
|
||||
#include "r600_pipe.h"
|
||||
#include "r600_sq.h"
|
||||
#include "r600_opcodes.h"
|
||||
@@ -55,8 +56,8 @@ static inline unsigned int r600_bc_get_num_operands(struct r600_bc_alu *alu)
|
||||
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4:
|
||||
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4_IEEE:
|
||||
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE:
|
||||
return 2;
|
||||
|
||||
return 2;
|
||||
|
||||
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV:
|
||||
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR:
|
||||
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT:
|
||||
@@ -74,7 +75,7 @@ static inline unsigned int r600_bc_get_num_operands(struct r600_bc_alu *alu)
|
||||
default: R600_ERR(
|
||||
"Need instruction operand number for 0x%x.\n", alu->inst);
|
||||
};
|
||||
|
||||
|
||||
return 3;
|
||||
}
|
||||
|
||||
@@ -137,20 +138,20 @@ int r600_bc_init(struct r600_bc *bc, enum radeon_family family)
|
||||
case CHIP_RV635:
|
||||
case CHIP_RS780:
|
||||
case CHIP_RS880:
|
||||
bc->chiprev = 0;
|
||||
bc->chiprev = CHIPREV_R600;
|
||||
break;
|
||||
case CHIP_RV770:
|
||||
case CHIP_RV730:
|
||||
case CHIP_RV710:
|
||||
case CHIP_RV740:
|
||||
bc->chiprev = 1;
|
||||
bc->chiprev = CHIPREV_R700;
|
||||
break;
|
||||
case CHIP_CEDAR:
|
||||
case CHIP_REDWOOD:
|
||||
case CHIP_JUNIPER:
|
||||
case CHIP_CYPRESS:
|
||||
case CHIP_HEMLOCK:
|
||||
bc->chiprev = 2;
|
||||
bc->chiprev = CHIPREV_EVERGREEN;
|
||||
break;
|
||||
default:
|
||||
R600_ERR("unknown family %d\n", bc->family);
|
||||
@@ -199,9 +200,9 @@ const unsigned bank_swizzle_vec[8] = {SQ_ALU_VEC_210, //000
|
||||
SQ_ALU_VEC_012}; //111
|
||||
|
||||
const unsigned bank_swizzle_scl[8] = {SQ_ALU_SCL_210, //000
|
||||
SQ_ALU_SCL_122, //001
|
||||
SQ_ALU_SCL_122, //001
|
||||
SQ_ALU_SCL_122, //010
|
||||
|
||||
|
||||
SQ_ALU_SCL_221, //011
|
||||
SQ_ALU_SCL_212, //100
|
||||
SQ_ALU_SCL_122, //101
|
||||
@@ -592,10 +593,34 @@ int r600_bc_add_cfinst(struct r600_bc *bc, int inst)
|
||||
/* common to all 3 families */
|
||||
static int r600_bc_vtx_build(struct r600_bc *bc, struct r600_bc_vtx *vtx, unsigned id)
|
||||
{
|
||||
bc->bytecode[id++] = S_SQ_VTX_WORD0_BUFFER_ID(vtx->buffer_id) |
|
||||
S_SQ_VTX_WORD0_SRC_GPR(vtx->src_gpr) |
|
||||
S_SQ_VTX_WORD0_SRC_SEL_X(vtx->src_sel_x) |
|
||||
S_SQ_VTX_WORD0_MEGA_FETCH_COUNT(vtx->mega_fetch_count);
|
||||
unsigned fetch_resource_start = 0;
|
||||
|
||||
/* check if we are fetch shader */
|
||||
/* fetch shader can also access vertex resource,
|
||||
* first fetch shader resource is at 160
|
||||
*/
|
||||
if (bc->type == -1) {
|
||||
switch (bc->chiprev) {
|
||||
/* r600 */
|
||||
case CHIPREV_R600:
|
||||
/* r700 */
|
||||
case CHIPREV_R700:
|
||||
fetch_resource_start = 160;
|
||||
break;
|
||||
/* evergreen */
|
||||
case CHIPREV_EVERGREEN:
|
||||
fetch_resource_start = 0;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "%s:%s:%d unknown chiprev %d\n",
|
||||
__FILE__, __func__, __LINE__, bc->chiprev);
|
||||
break;
|
||||
}
|
||||
}
|
||||
bc->bytecode[id++] = S_SQ_VTX_WORD0_BUFFER_ID(vtx->buffer_id + fetch_resource_start) |
|
||||
S_SQ_VTX_WORD0_SRC_GPR(vtx->src_gpr) |
|
||||
S_SQ_VTX_WORD0_SRC_SEL_X(vtx->src_sel_x) |
|
||||
S_SQ_VTX_WORD0_MEGA_FETCH_COUNT(vtx->mega_fetch_count);
|
||||
bc->bytecode[id++] = S_SQ_VTX_WORD1_DST_SEL_X(vtx->dst_sel_x) |
|
||||
S_SQ_VTX_WORD1_DST_SEL_Y(vtx->dst_sel_y) |
|
||||
S_SQ_VTX_WORD1_DST_SEL_Z(vtx->dst_sel_z) |
|
||||
@@ -678,8 +703,8 @@ static int r600_bc_alu_build(struct r600_bc *bc, struct r600_bc_alu *alu, unsign
|
||||
S_SQ_ALU_WORD1_OP2_WRITE_MASK(alu->dst.write) |
|
||||
S_SQ_ALU_WORD1_OP2_ALU_INST(alu->inst) |
|
||||
S_SQ_ALU_WORD1_BANK_SWIZZLE(alu->bank_swizzle) |
|
||||
S_SQ_ALU_WORD1_OP2_UPDATE_EXECUTE_MASK(alu->predicate) |
|
||||
S_SQ_ALU_WORD1_OP2_UPDATE_PRED(alu->predicate);
|
||||
S_SQ_ALU_WORD1_OP2_UPDATE_EXECUTE_MASK(alu->predicate) |
|
||||
S_SQ_ALU_WORD1_OP2_UPDATE_PRED(alu->predicate);
|
||||
}
|
||||
if (alu->last) {
|
||||
if (alu->nliteral && !alu->literal_added) {
|
||||
@@ -710,7 +735,7 @@ static int r600_bc_cf_build(struct r600_bc *bc, struct r600_bc_cf *cf)
|
||||
S_SQ_CF_ALU_WORD1_KCACHE_ADDR0(cf->kcache0_addr) |
|
||||
S_SQ_CF_ALU_WORD1_KCACHE_ADDR1(cf->kcache1_addr) |
|
||||
S_SQ_CF_ALU_WORD1_BARRIER(1) |
|
||||
S_SQ_CF_ALU_WORD1_USES_WATERFALL(bc->chiprev == 0 ? cf->r6xx_uses_waterfall : 0) |
|
||||
S_SQ_CF_ALU_WORD1_USES_WATERFALL(bc->chiprev == CHIPREV_R600 ? cf->r6xx_uses_waterfall : 0) |
|
||||
S_SQ_CF_ALU_WORD1_COUNT((cf->ndw / 2) - 1);
|
||||
break;
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_TEX:
|
||||
@@ -742,6 +767,8 @@ static int r600_bc_cf_build(struct r600_bc *bc, struct r600_bc_cf *cf)
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_RETURN:
|
||||
bc->bytecode[id++] = S_SQ_CF_WORD0_ADDR(cf->cf_addr >> 1);
|
||||
bc->bytecode[id++] = S_SQ_CF_WORD1_CF_INST(cf->inst) |
|
||||
S_SQ_CF_WORD1_BARRIER(1) |
|
||||
@@ -766,7 +793,10 @@ int r600_bc_build(struct r600_bc *bc)
|
||||
int r;
|
||||
|
||||
if (bc->callstack[0].max > 0)
|
||||
bc->nstack = ((bc->callstack[0].max + 3) >> 2) + 2;
|
||||
bc->nstack = ((bc->callstack[0].max + 3) >> 2) + 2;
|
||||
if (bc->type == TGSI_PROCESSOR_VERTEX && !bc->nstack) {
|
||||
bc->nstack = 1;
|
||||
}
|
||||
|
||||
/* first path compute addr of each CF block */
|
||||
/* addr start after all the CF instructions */
|
||||
@@ -795,6 +825,8 @@ int r600_bc_build(struct r600_bc *bc)
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_RETURN:
|
||||
break;
|
||||
default:
|
||||
R600_ERR("unsupported CF instruction (0x%X)\n", cf->inst);
|
||||
@@ -810,7 +842,7 @@ int r600_bc_build(struct r600_bc *bc)
|
||||
return -ENOMEM;
|
||||
LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
|
||||
addr = cf->addr;
|
||||
if (bc->chiprev == 2)
|
||||
if (bc->chiprev == CHIPREV_EVERGREEN)
|
||||
r = eg_bc_cf_build(bc, cf);
|
||||
else
|
||||
r = r600_bc_cf_build(bc, cf);
|
||||
@@ -821,11 +853,11 @@ int r600_bc_build(struct r600_bc *bc)
|
||||
case (V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE << 3):
|
||||
LIST_FOR_EACH_ENTRY(alu, &cf->alu, list) {
|
||||
switch(bc->chiprev) {
|
||||
case 0:
|
||||
case CHIPREV_R600:
|
||||
r = r600_bc_alu_build(bc, alu, addr);
|
||||
break;
|
||||
case 1:
|
||||
case 2: /* eg alu is same encoding as r700 */
|
||||
case CHIPREV_R700:
|
||||
case CHIPREV_EVERGREEN: /* eg alu is same encoding as r700 */
|
||||
r = r700_bc_alu_build(bc, alu, addr);
|
||||
break;
|
||||
default:
|
||||
@@ -868,6 +900,8 @@ int r600_bc_build(struct r600_bc *bc)
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_JUMP:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_ELSE:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_POP:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS:
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_RETURN:
|
||||
break;
|
||||
default:
|
||||
R600_ERR("unsupported CF instruction (0x%X)\n", cf->inst);
|
||||
|
||||
@@ -145,12 +145,12 @@ struct r600_bc_cf {
|
||||
struct r600_bc_alu *curr_bs_head;
|
||||
};
|
||||
|
||||
#define FC_NONE 0
|
||||
#define FC_IF 1
|
||||
#define FC_LOOP 2
|
||||
#define FC_REP 3
|
||||
#define FC_PUSH_VPM 4
|
||||
#define FC_PUSH_WQM 5
|
||||
#define FC_NONE 0
|
||||
#define FC_IF 1
|
||||
#define FC_LOOP 2
|
||||
#define FC_REP 3
|
||||
#define FC_PUSH_VPM 4
|
||||
#define FC_PUSH_WQM 5
|
||||
|
||||
struct r600_cf_stack_entry {
|
||||
int type;
|
||||
@@ -166,10 +166,11 @@ struct r600_cf_callstack {
|
||||
int current;
|
||||
int max;
|
||||
};
|
||||
|
||||
|
||||
struct r600_bc {
|
||||
enum radeon_family family;
|
||||
int chiprev; /* 0 - r600, 1 - r700, 2 - evergreen */
|
||||
int type;
|
||||
struct list_head cf;
|
||||
struct r600_bc_cf *cf_last;
|
||||
unsigned ndw;
|
||||
|
||||
@@ -27,9 +27,9 @@
|
||||
|
||||
enum r600_blitter_op /* bitmask */
|
||||
{
|
||||
R600_CLEAR = 1,
|
||||
R600_CLEAR_SURFACE = 2,
|
||||
R600_COPY = 4
|
||||
R600_CLEAR = 1,
|
||||
R600_CLEAR_SURFACE = 2,
|
||||
R600_COPY = 4
|
||||
};
|
||||
|
||||
static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op)
|
||||
@@ -189,7 +189,6 @@ static void r600_resource_copy_region(struct pipe_context *ctx,
|
||||
else
|
||||
r600_hw_copy_region(ctx, dst, subdst, dstx, dsty, dstz,
|
||||
src, subsrc, srcx, srcy, srcz, width, height);
|
||||
|
||||
}
|
||||
|
||||
void r600_init_blit_functions(struct r600_pipe_context *rctx)
|
||||
|
||||
@@ -124,7 +124,7 @@ static void *r600_buffer_transfer_map(struct pipe_context *pipe,
|
||||
if ((transfer->box.x >= rbuffer->ranges[i].start) &&
|
||||
(transfer->box.x < rbuffer->ranges[i].end))
|
||||
flush = TRUE;
|
||||
|
||||
|
||||
if (flush) {
|
||||
r600_bo_reference((struct radeon*)pipe->winsys, &rbuffer->r.bo, NULL);
|
||||
rbuffer->num_ranges = 0;
|
||||
@@ -180,7 +180,7 @@ static void r600_buffer_transfer_flush_region(struct pipe_context *pipe,
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
rbuffer->ranges[rbuffer->num_ranges].start = offset;
|
||||
rbuffer->ranges[rbuffer->num_ranges].end = offset+length;
|
||||
rbuffer->num_ranges++;
|
||||
|
||||
@@ -385,8 +385,13 @@
|
||||
#define EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_EXPORT_COMBINED 0x0000005B
|
||||
#define EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_RAT_COMBINED_CACHELESS 0x0000005C
|
||||
|
||||
#define BC_INST(bc, x) ((bc)->chiprev == 2 ? EG_##x : x)
|
||||
|
||||
#define CTX_INST(x) (ctx->bc->chiprev == 2 ? EG_##x : x)
|
||||
#define CHIPREV_R600 0
|
||||
#define CHIPREV_R700 1
|
||||
#define CHIPREV_EVERGREEN 2
|
||||
|
||||
#define BC_INST(bc, x) ((bc)->chiprev == CHIPREV_EVERGREEN ? EG_##x : x)
|
||||
|
||||
#define CTX_INST(x) (ctx->bc->chiprev == CHIPREV_EVERGREEN ? EG_##x : x)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -187,7 +187,7 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
|
||||
FREE(rctx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
rctx->vs_resource = CALLOC(R600_RESOURCE_ARRAY_SIZE, sizeof(struct r600_pipe_state));
|
||||
if (!rctx->vs_resource) {
|
||||
FREE(rctx);
|
||||
@@ -371,6 +371,11 @@ static int r600_get_shader_param(struct pipe_screen* pscreen, unsigned shader, e
|
||||
return 0; /* FIXME */
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -402,7 +407,7 @@ static boolean r600_is_format_supported(struct pipe_screen* screen,
|
||||
PIPE_BIND_DISPLAY_TARGET |
|
||||
PIPE_BIND_SCANOUT |
|
||||
PIPE_BIND_SHARED)) &&
|
||||
r600_is_colorbuffer_format_supported(format)) {
|
||||
r600_is_colorbuffer_format_supported(format)) {
|
||||
retval |= usage &
|
||||
(PIPE_BIND_RENDER_TARGET |
|
||||
PIPE_BIND_DISPLAY_TARGET |
|
||||
|
||||
@@ -93,6 +93,7 @@ struct r600_pipe_shader {
|
||||
struct r600_shader shader;
|
||||
struct r600_pipe_state rstate;
|
||||
struct r600_bo *bo;
|
||||
struct r600_bo *bo_fetch;
|
||||
struct r600_vertex_element vertex_elements;
|
||||
};
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ static void r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shade
|
||||
r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo);
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_028894_SQ_PGM_START_FS,
|
||||
r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo);
|
||||
r600_bo_offset(shader->bo_fetch) >> 8, 0xFFFFFFFF, shader->bo_fetch);
|
||||
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_03E200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF,
|
||||
@@ -217,6 +217,15 @@ static int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *s
|
||||
void *ptr;
|
||||
|
||||
/* copy new shader */
|
||||
if (rshader->processor_type == TGSI_PROCESSOR_VERTEX && shader->bo_fetch == NULL) {
|
||||
shader->bo_fetch = r600_bo(rctx->radeon, rshader->bc_fetch.ndw * 4, 4096, 0, 0);
|
||||
if (shader->bo_fetch == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
ptr = r600_bo_map(rctx->radeon, shader->bo_fetch, 0, NULL);
|
||||
memcpy(ptr, rshader->bc_fetch.bytecode, rshader->bc_fetch.ndw * 4);
|
||||
r600_bo_unmap(rctx->radeon, shader->bo_fetch);
|
||||
}
|
||||
if (shader->bo == NULL) {
|
||||
shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0, 0);
|
||||
if (shader->bo == NULL) {
|
||||
@@ -257,7 +266,7 @@ static int r600_shader_update(struct pipe_context *ctx, struct r600_pipe_shader
|
||||
const struct util_format_description *desc;
|
||||
enum pipe_format resource_format[160];
|
||||
unsigned i, nresources = 0;
|
||||
struct r600_bc *bc = &shader->bc;
|
||||
struct r600_bc *bc = &shader->bc_fetch;
|
||||
struct r600_bc_cf *cf;
|
||||
struct r600_bc_vtx *vtx;
|
||||
|
||||
@@ -272,7 +281,7 @@ static int r600_shader_update(struct pipe_context *ctx, struct r600_pipe_shader
|
||||
for (i = 0; i < rctx->vertex_elements->count; i++) {
|
||||
resource_format[nresources++] = rctx->vertex_elements->hw_format[i];
|
||||
}
|
||||
r600_bo_reference(rctx->radeon, &rshader->bo, NULL);
|
||||
r600_bo_reference(rctx->radeon, &rshader->bo_fetch, NULL);
|
||||
LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
|
||||
switch (cf->inst) {
|
||||
case V_SQ_CF_WORD1_SQ_CF_INST_VTX:
|
||||
@@ -293,7 +302,7 @@ static int r600_shader_update(struct pipe_context *ctx, struct r600_pipe_shader
|
||||
break;
|
||||
}
|
||||
}
|
||||
return r600_bc_build(&shader->bc);
|
||||
return r600_bc_build(&shader->bc_fetch);
|
||||
}
|
||||
|
||||
int r600_pipe_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *shader)
|
||||
@@ -334,6 +343,13 @@ int r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *s
|
||||
R600_ERR("building bytecode failed !\n");
|
||||
return r;
|
||||
}
|
||||
if (shader->shader.processor_type == TGSI_PROCESSOR_VERTEX) {
|
||||
r = r600_bc_build(&shader->shader.bc_fetch);
|
||||
if (r) {
|
||||
R600_ERR("building bytecode failed !\n");
|
||||
return r;
|
||||
}
|
||||
}
|
||||
//fprintf(stderr, "______________________________________________________________\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -364,6 +380,7 @@ struct r600_shader_ctx {
|
||||
unsigned temp_reg;
|
||||
struct r600_shader_tgsi_instruction *inst_info;
|
||||
struct r600_bc *bc;
|
||||
struct r600_bc *bc_fetch;
|
||||
struct r600_shader *shader;
|
||||
u32 value[4];
|
||||
u32 *literals;
|
||||
@@ -444,7 +461,7 @@ static int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
|
||||
if (ctx->shader->input[input].centroid)
|
||||
ij_index++;
|
||||
}
|
||||
|
||||
|
||||
/* work out gpr and base_chan from index */
|
||||
gpr = ij_index / 2;
|
||||
base_chan = (2 * (ij_index % 2)) + 1;
|
||||
@@ -477,9 +494,9 @@ static int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
static int tgsi_declaration(struct r600_shader_ctx *ctx)
|
||||
{
|
||||
struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
|
||||
@@ -511,11 +528,11 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx)
|
||||
vtx.dst_sel_z = 2;
|
||||
vtx.dst_sel_w = 3;
|
||||
vtx.use_const_fields = 1;
|
||||
r = r600_bc_add_vtx(ctx->bc, &vtx);
|
||||
r = r600_bc_add_vtx(ctx->bc_fetch, &vtx);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == 2) {
|
||||
if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == CHIPREV_EVERGREEN) {
|
||||
/* turn input into interpolate on EG */
|
||||
if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) {
|
||||
if (ctx->shader->input[i].interpolate > 0) {
|
||||
@@ -549,7 +566,7 @@ static int r600_get_temp(struct r600_shader_ctx *ctx)
|
||||
return ctx->temp_reg + ctx->max_driver_temp_used++;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* for evergreen we need to scan the shader to find the number of GPRs we need to
|
||||
* reserve for interpolation.
|
||||
*
|
||||
@@ -606,6 +623,7 @@ int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *s
|
||||
int i, r = 0, pos0;
|
||||
|
||||
ctx.bc = &shader->bc;
|
||||
ctx.bc_fetch = &shader->bc_fetch;
|
||||
ctx.shader = shader;
|
||||
r = r600_bc_init(ctx.bc, shader->family);
|
||||
if (r)
|
||||
@@ -615,6 +633,13 @@ int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *s
|
||||
tgsi_parse_init(&ctx.parse, tokens);
|
||||
ctx.type = ctx.parse.FullHeader.Processor.Processor;
|
||||
shader->processor_type = ctx.type;
|
||||
if (shader->processor_type == TGSI_PROCESSOR_VERTEX) {
|
||||
r = r600_bc_init(ctx.bc_fetch, shader->family);
|
||||
if (r)
|
||||
return r;
|
||||
ctx.bc_fetch->type = -1;
|
||||
}
|
||||
ctx.bc->type = shader->processor_type;
|
||||
|
||||
/* register allocations */
|
||||
/* Values [0,127] correspond to GPR[0..127].
|
||||
@@ -640,8 +665,13 @@ int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *s
|
||||
}
|
||||
if (ctx.type == TGSI_PROCESSOR_VERTEX) {
|
||||
ctx.file_offset[TGSI_FILE_INPUT] = 1;
|
||||
if (ctx.bc->chiprev == CHIPREV_EVERGREEN) {
|
||||
r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
|
||||
} else {
|
||||
r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
|
||||
}
|
||||
}
|
||||
if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == 2) {
|
||||
if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == CHIPREV_EVERGREEN) {
|
||||
ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
|
||||
}
|
||||
ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
|
||||
@@ -687,7 +717,7 @@ int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *s
|
||||
/* reserve first tmp for everyone */
|
||||
r600_get_temp(&ctx);
|
||||
opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
|
||||
if (ctx.bc->chiprev == 2)
|
||||
if (ctx.bc->chiprev == CHIPREV_EVERGREEN)
|
||||
ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
|
||||
else
|
||||
ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
|
||||
@@ -809,6 +839,14 @@ int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *s
|
||||
output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
|
||||
}
|
||||
}
|
||||
/* add return to fetch shader */
|
||||
if (ctx.type == TGSI_PROCESSOR_VERTEX) {
|
||||
if (ctx.bc->chiprev == CHIPREV_EVERGREEN) {
|
||||
r600_bc_add_cfinst(ctx.bc_fetch, EG_V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
|
||||
} else {
|
||||
r600_bc_add_cfinst(ctx.bc_fetch, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
|
||||
}
|
||||
}
|
||||
/* add output to bytecode */
|
||||
for (i = 0; i < noutput; i++) {
|
||||
r = r600_bc_add_output(ctx.bc, &output[i]);
|
||||
@@ -1001,7 +1039,7 @@ static int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
|
||||
r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
||||
alu.inst = ctx->inst_info->r600_opcode;
|
||||
if (!swap) {
|
||||
for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
|
||||
@@ -1046,7 +1084,7 @@ static int tgsi_op2_swap(struct r600_shader_ctx *ctx)
|
||||
return tgsi_op2_s(ctx, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* r600 - trunc to -PI..PI range
|
||||
* r700 - normalize by dividing by 2PI
|
||||
* see fdo bug 27901
|
||||
@@ -1058,7 +1096,7 @@ static int tgsi_setup_trig(struct r600_shader_ctx *ctx,
|
||||
int r;
|
||||
uint32_t lit_vals[4];
|
||||
struct r600_bc_alu alu;
|
||||
|
||||
|
||||
memset(lit_vals, 0, 4*4);
|
||||
r = tgsi_split_constant(ctx, r600_src);
|
||||
if (r)
|
||||
@@ -1084,7 +1122,7 @@ static int tgsi_setup_trig(struct r600_shader_ctx *ctx,
|
||||
|
||||
alu.src[0] = r600_src[0];
|
||||
alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
|
||||
|
||||
|
||||
alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
|
||||
alu.src[1].chan = 0;
|
||||
alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
|
||||
@@ -1099,7 +1137,7 @@ static int tgsi_setup_trig(struct r600_shader_ctx *ctx,
|
||||
|
||||
memset(&alu, 0, sizeof(struct r600_bc_alu));
|
||||
alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
|
||||
|
||||
|
||||
alu.dst.chan = 0;
|
||||
alu.dst.sel = ctx->temp_reg;
|
||||
alu.dst.write = 1;
|
||||
@@ -1111,7 +1149,7 @@ static int tgsi_setup_trig(struct r600_shader_ctx *ctx,
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
if (ctx->bc->chiprev == 0) {
|
||||
if (ctx->bc->chiprev == CHIPREV_R600) {
|
||||
lit_vals[0] = fui(3.1415926535897f * 2.0f);
|
||||
lit_vals[1] = fui(-3.1415926535897f);
|
||||
} else {
|
||||
@@ -1129,7 +1167,7 @@ static int tgsi_setup_trig(struct r600_shader_ctx *ctx,
|
||||
|
||||
alu.src[0].sel = ctx->temp_reg;
|
||||
alu.src[0].chan = 0;
|
||||
|
||||
|
||||
alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
|
||||
alu.src[1].chan = 0;
|
||||
alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
|
||||
@@ -1908,10 +1946,10 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
|
||||
r = r600_bc_add_alu(ctx->bc, &alu);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
||||
/* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x
|
||||
* MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x
|
||||
* muladd has no writemask, have to use another temp
|
||||
* muladd has no writemask, have to use another temp
|
||||
*/
|
||||
memset(&alu, 0, sizeof(struct r600_bc_alu));
|
||||
alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
|
||||
@@ -1921,7 +1959,7 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
|
||||
alu.src[0].chan = 0;
|
||||
alu.src[1].sel = ctx->temp_reg;
|
||||
alu.src[1].chan = 2;
|
||||
|
||||
|
||||
alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
|
||||
alu.src[2].chan = 0;
|
||||
|
||||
@@ -1941,7 +1979,7 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
|
||||
alu.src[0].chan = 1;
|
||||
alu.src[1].sel = ctx->temp_reg;
|
||||
alu.src[1].chan = 2;
|
||||
|
||||
|
||||
alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
|
||||
alu.src[2].chan = 0;
|
||||
|
||||
@@ -1980,7 +2018,7 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
|
||||
}
|
||||
src_gpr = ctx->temp_reg;
|
||||
}
|
||||
|
||||
|
||||
opcode = ctx->inst_info->r600_opcode;
|
||||
if (opcode == SQ_TEX_INST_SAMPLE &&
|
||||
(inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D))
|
||||
@@ -1990,8 +2028,6 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
|
||||
tex.inst = opcode;
|
||||
tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
|
||||
tex.resource_id = tex.sampler_id;
|
||||
if (ctx->shader->processor_type == TGSI_PROCESSOR_VERTEX)
|
||||
tex.resource_id += PIPE_MAX_ATTRIBS;
|
||||
tex.src_gpr = src_gpr;
|
||||
tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
|
||||
tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
|
||||
@@ -2026,7 +2062,6 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
|
||||
|
||||
/* add shadow ambient support - gallium doesn't do it yet */
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int tgsi_lrp(struct r600_shader_ctx *ctx)
|
||||
@@ -2156,7 +2191,7 @@ static int tgsi_cmp(struct r600_shader_ctx *ctx)
|
||||
r = r600_bc_add_alu(ctx->bc, &alu);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
}
|
||||
if (use_temp)
|
||||
return tgsi_helper_copy(ctx, inst);
|
||||
return 0;
|
||||
@@ -2342,7 +2377,7 @@ static int tgsi_exp(struct r600_shader_ctx *ctx)
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
/* result.y = tmp - floor(tmp); */
|
||||
if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
|
||||
memset(&alu, 0, sizeof(struct r600_bc_alu));
|
||||
@@ -2621,16 +2656,25 @@ static int tgsi_log(struct r600_shader_ctx *ctx)
|
||||
return tgsi_helper_copy(ctx, inst);
|
||||
}
|
||||
|
||||
/* r6/7 only for now */
|
||||
static int tgsi_eg_arl(struct r600_shader_ctx *ctx)
|
||||
{
|
||||
struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
|
||||
struct r600_bc_alu alu;
|
||||
int r;
|
||||
|
||||
memset(&alu, 0, sizeof(struct r600_bc_alu));
|
||||
|
||||
alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
|
||||
switch (inst->Instruction.Opcode) {
|
||||
case TGSI_OPCODE_ARL:
|
||||
alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
|
||||
break;
|
||||
case TGSI_OPCODE_ARR:
|
||||
alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
|
||||
if (r)
|
||||
return r;
|
||||
@@ -2663,18 +2707,18 @@ static int tgsi_r600_arl(struct r600_shader_ctx *ctx)
|
||||
int r;
|
||||
memset(&alu, 0, sizeof(struct r600_bc_alu));
|
||||
|
||||
switch (inst->Instruction.Opcode) {
|
||||
case TGSI_OPCODE_ARL:
|
||||
alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR;
|
||||
break;
|
||||
case TGSI_OPCODE_ARR:
|
||||
alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA;
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (inst->Instruction.Opcode) {
|
||||
case TGSI_OPCODE_ARL:
|
||||
alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR;
|
||||
break;
|
||||
case TGSI_OPCODE_ARR:
|
||||
alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA;
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
|
||||
if (r)
|
||||
@@ -2703,8 +2747,8 @@ static int tgsi_opdst(struct r600_shader_ctx *ctx)
|
||||
r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
if (i == 0 || i == 3) {
|
||||
|
||||
if (i == 0 || i == 3) {
|
||||
alu.src[0].sel = V_SQ_ALU_SRC_1;
|
||||
} else {
|
||||
r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
|
||||
@@ -2750,7 +2794,7 @@ static int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
|
||||
alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
|
||||
alu.src[1].sel = V_SQ_ALU_SRC_0;
|
||||
alu.src[1].chan = 0;
|
||||
|
||||
|
||||
alu.last = 1;
|
||||
|
||||
r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
|
||||
@@ -2804,7 +2848,7 @@ static inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned r
|
||||
ctx->bc->callstack[ctx->bc->call_sp].current + diff;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
switch (reason) {
|
||||
case FC_PUSH_VPM:
|
||||
ctx->bc->callstack[ctx->bc->call_sp].current++;
|
||||
@@ -2878,7 +2922,7 @@ static int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_v
|
||||
|
||||
static void emit_testflag(struct r600_shader_ctx *ctx)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
|
||||
@@ -3239,7 +3283,7 @@ static struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
|
||||
{TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
|
||||
{TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
|
||||
{TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
|
||||
{TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
|
||||
{TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
|
||||
{TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
|
||||
{TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
|
||||
{TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
|
||||
|
||||
@@ -46,6 +46,7 @@ struct r600_shader {
|
||||
struct r600_shader_io output[32];
|
||||
enum radeon_family family;
|
||||
boolean uses_kill;
|
||||
struct r600_bc bc_fetch;
|
||||
};
|
||||
|
||||
int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
|
||||
|
||||
@@ -109,7 +109,7 @@ static void r600_draw_common(struct r600_drawl *draw)
|
||||
r600_pipe_state_add_reg(rstate, R_038010_RESOURCE0_WORD4, 0x00000000, 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate, R_038014_RESOURCE0_WORD5, 0x00000000, 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate, R_038018_RESOURCE0_WORD6, 0xC0000000, 0xFFFFFFFF, NULL);
|
||||
r600_context_pipe_state_set_vs_resource(&rctx->ctx, rstate, i);
|
||||
r600_context_pipe_state_set_fs_resource(&rctx->ctx, rstate, i);
|
||||
}
|
||||
|
||||
mask = 0;
|
||||
@@ -296,7 +296,7 @@ static void *r600_create_blend_state(struct pipe_context *ctx,
|
||||
unsigned eqRGB = state->rt[i].rgb_func;
|
||||
unsigned srcRGB = state->rt[i].rgb_src_factor;
|
||||
unsigned dstRGB = state->rt[i].rgb_dst_factor;
|
||||
|
||||
|
||||
unsigned eqA = state->rt[i].alpha_func;
|
||||
unsigned srcA = state->rt[i].alpha_src_factor;
|
||||
unsigned dstA = state->rt[i].alpha_dst_factor;
|
||||
@@ -475,7 +475,7 @@ static void *r600_create_rs_state(struct pipe_context *ctx,
|
||||
r600_pipe_state_add_reg(rstate, R_028A0C_PA_SC_LINE_STIPPLE, 0x00000005, 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate, R_028A48_PA_SC_MPASS_PS_CNTL, 0x00000000, 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate, R_028C00_PA_SC_LINE_CNTL, 0x00000400, 0xFFFFFFFF, NULL);
|
||||
|
||||
|
||||
r600_pipe_state_add_reg(rstate, R_028C08_PA_SU_VTX_CNTL,
|
||||
S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules),
|
||||
0xFFFFFFFF, NULL);
|
||||
@@ -622,7 +622,7 @@ static void r600_set_vs_sampler_view(struct pipe_context *ctx, unsigned count,
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
if (resource[i]) {
|
||||
r600_context_pipe_state_set_vs_resource(&rctx->ctx, &resource[i]->state, i + PIPE_MAX_ATTRIBS);
|
||||
r600_context_pipe_state_set_vs_resource(&rctx->ctx, &resource[i]->state, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -692,16 +692,16 @@ static void r600_set_clip_state(struct pipe_context *ctx,
|
||||
rstate->id = R600_PIPE_STATE_CLIP;
|
||||
for (int i = 0; i < state->nr; i++) {
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_028E20_PA_CL_UCP0_X + i * 4,
|
||||
R_028E20_PA_CL_UCP0_X + i * 16,
|
||||
fui(state->ucp[i][0]), 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_028E24_PA_CL_UCP0_Y + i * 4,
|
||||
R_028E24_PA_CL_UCP0_Y + i * 16,
|
||||
fui(state->ucp[i][1]) , 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_028E28_PA_CL_UCP0_Z + i * 4,
|
||||
R_028E28_PA_CL_UCP0_Z + i * 16,
|
||||
fui(state->ucp[i][2]), 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
R_028E2C_PA_CL_UCP0_W + i * 4,
|
||||
R_028E2C_PA_CL_UCP0_W + i * 16,
|
||||
fui(state->ucp[i][3]), 0xFFFFFFFF, NULL);
|
||||
}
|
||||
r600_pipe_state_add_reg(rstate, R_028810_PA_CL_CLIP_CNTL,
|
||||
@@ -863,7 +863,7 @@ static void r600_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta
|
||||
S_0280A0_ARRAY_MODE(rtex->array_mode[level]) |
|
||||
S_0280A0_BLEND_CLAMP(1) |
|
||||
S_0280A0_NUMBER_TYPE(ntype);
|
||||
if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
|
||||
if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
|
||||
color_info |= S_0280A0_SOURCE_FORMAT(1);
|
||||
|
||||
r600_pipe_state_add_reg(rstate,
|
||||
@@ -944,7 +944,7 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx,
|
||||
rstate->id = R600_PIPE_STATE_FRAMEBUFFER;
|
||||
|
||||
util_copy_framebuffer_state(&rctx->framebuffer, state);
|
||||
|
||||
|
||||
rctx->pframebuffer = &rctx->framebuffer;
|
||||
|
||||
/* build states */
|
||||
|
||||
@@ -202,10 +202,10 @@ void *r600_create_vertex_elements(struct pipe_context *ctx,
|
||||
format = &v->hw_format[i];
|
||||
|
||||
switch (*format) {
|
||||
FORMAT_REPLACE(R64_FLOAT, R32_FLOAT);
|
||||
FORMAT_REPLACE(R64G64_FLOAT, R32G32_FLOAT);
|
||||
FORMAT_REPLACE(R64G64B64_FLOAT, R32G32B32_FLOAT);
|
||||
FORMAT_REPLACE(R64G64B64A64_FLOAT, R32G32B32A32_FLOAT);
|
||||
FORMAT_REPLACE(R64_FLOAT, R32_FLOAT);
|
||||
FORMAT_REPLACE(R64G64_FLOAT, R32G32_FLOAT);
|
||||
FORMAT_REPLACE(R64G64B64_FLOAT, R32G32B32_FLOAT);
|
||||
FORMAT_REPLACE(R64G64B64A64_FLOAT, R32G32B32A32_FLOAT);
|
||||
default:;
|
||||
}
|
||||
v->incompatible_layout =
|
||||
@@ -213,8 +213,7 @@ void *r600_create_vertex_elements(struct pipe_context *ctx,
|
||||
v->elements[i].src_format != v->hw_format[i] ||
|
||||
v->elements[i].src_offset % 4 != 0;
|
||||
|
||||
v->hw_format_size[i] =
|
||||
align(util_format_get_blocksize(v->hw_format[i]), 4);
|
||||
v->hw_format_size[i] = align(util_format_get_blocksize(v->hw_format[i]), 4);
|
||||
}
|
||||
|
||||
return v;
|
||||
|
||||
@@ -109,11 +109,11 @@ static unsigned r600_get_pixel_alignment(struct pipe_screen *screen,
|
||||
case V_038000_ARRAY_2D_TILED_THIN1:
|
||||
p_align = MAX2(rscreen->tiling_info->num_banks,
|
||||
(((rscreen->tiling_info->group_bytes / 8 / pixsize)) *
|
||||
rscreen->tiling_info->num_banks));
|
||||
rscreen->tiling_info->num_banks)) * 8;
|
||||
break;
|
||||
case 0:
|
||||
case V_038000_ARRAY_LINEAR_GENERAL:
|
||||
default:
|
||||
p_align = 64;
|
||||
p_align = rscreen->tiling_info->group_bytes / pixsize;
|
||||
break;
|
||||
}
|
||||
return p_align;
|
||||
@@ -139,6 +139,29 @@ static unsigned r600_get_height_alignment(struct pipe_screen *screen,
|
||||
return h_align;
|
||||
}
|
||||
|
||||
static unsigned r600_get_base_alignment(struct pipe_screen *screen,
|
||||
enum pipe_format format,
|
||||
unsigned array_mode)
|
||||
{
|
||||
struct r600_screen* rscreen = (struct r600_screen *)screen;
|
||||
unsigned pixsize = util_format_get_blocksize(format);
|
||||
int p_align = r600_get_pixel_alignment(screen, format, array_mode);
|
||||
int h_align = r600_get_height_alignment(screen, array_mode);
|
||||
int b_align;
|
||||
|
||||
switch (array_mode) {
|
||||
case V_038000_ARRAY_2D_TILED_THIN1:
|
||||
b_align = MAX2(rscreen->tiling_info->num_banks * rscreen->tiling_info->num_channels * 8 * 8 * pixsize,
|
||||
p_align * pixsize * h_align);
|
||||
break;
|
||||
case V_038000_ARRAY_1D_TILED_THIN1:
|
||||
default:
|
||||
b_align = rscreen->tiling_info->group_bytes;
|
||||
break;
|
||||
}
|
||||
return b_align;
|
||||
}
|
||||
|
||||
static unsigned mip_minify(unsigned size, unsigned level)
|
||||
{
|
||||
unsigned val;
|
||||
@@ -152,11 +175,12 @@ static unsigned r600_texture_get_stride(struct pipe_screen *screen,
|
||||
struct r600_resource_texture *rtex,
|
||||
unsigned level)
|
||||
{
|
||||
struct r600_screen* rscreen = (struct r600_screen *)screen;
|
||||
struct pipe_resource *ptex = &rtex->resource.base.b;
|
||||
struct radeon *radeon = (struct radeon *)screen->winsys;
|
||||
enum chip_class chipc = r600_get_family_class(radeon);
|
||||
unsigned width, stride, tile_width;
|
||||
|
||||
|
||||
if (rtex->pitch_override)
|
||||
return rtex->pitch_override;
|
||||
|
||||
@@ -167,11 +191,6 @@ static unsigned r600_texture_get_stride(struct pipe_screen *screen,
|
||||
width = align(width, tile_width);
|
||||
}
|
||||
stride = util_format_get_stride(ptex->format, width);
|
||||
if (chipc == EVERGREEN)
|
||||
stride = align(stride, 512);
|
||||
|
||||
if (ptex->bind & PIPE_BIND_RENDER_TARGET)
|
||||
stride = align(stride, 512);
|
||||
|
||||
return stride;
|
||||
}
|
||||
@@ -257,6 +276,9 @@ static void r600_setup_miptree(struct pipe_screen *screen,
|
||||
}
|
||||
else
|
||||
size = layer_size * u_minify(ptex->depth0, i);
|
||||
/* align base image and start of miptree */
|
||||
if ((i == 0) || (i == 1))
|
||||
offset = align(offset, r600_get_base_alignment(screen, ptex->format, array_mode));
|
||||
rtex->offset[i] = offset;
|
||||
rtex->layer_size[i] = layer_size;
|
||||
rtex->pitch_in_bytes[i] = pitch;
|
||||
@@ -297,7 +319,10 @@ r600_texture_create_object(struct pipe_screen *screen,
|
||||
resource->size = rtex->size;
|
||||
|
||||
if (!resource->bo) {
|
||||
resource->bo = r600_bo(radeon, rtex->size, 4096, base->bind, base->usage);
|
||||
struct pipe_resource *ptex = &rtex->resource.base.b;
|
||||
int base_align = r600_get_base_alignment(screen, ptex->format, array_mode);
|
||||
|
||||
resource->bo = r600_bo(radeon, rtex->size, base_align, base->bind, base->usage);
|
||||
if (!resource->bo) {
|
||||
FREE(rtex);
|
||||
return NULL;
|
||||
|
||||
@@ -231,6 +231,12 @@ static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, en
|
||||
return svgascreen->use_ps30 ? 1 : 0;
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
return svgascreen->use_ps30 ? 1 : 0;
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case PIPE_SHADER_VERTEX:
|
||||
@@ -263,6 +269,13 @@ static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, en
|
||||
return svgascreen->use_vs30 ? 1 : 0;
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
|
||||
return svgascreen->use_vs30 ? 1 : 0;
|
||||
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
|
||||
return 0;
|
||||
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
|
||||
return 1;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
#######################################################################
|
||||
# SConscript for swrast convenience library
|
||||
#
|
||||
# This is a meta-driver which consists of any and all of the software
|
||||
# rasterizers into a single driver. A software rasterizer is defined
|
||||
# as any driver which takes an sw_winsys pointer as the only argument
|
||||
# to create_screen.
|
||||
|
||||
Import('*')
|
||||
|
||||
env = env.Clone()
|
||||
|
||||
# To avoid targets having to check extensively or add drivers on a whim, append
|
||||
# all referenced extra drivers to the exported symbol.
|
||||
extra = []
|
||||
if True:
|
||||
env.Append(CPPDEFINES = 'GALLIUM_SOFTPIPE')
|
||||
env.Prepend(LIBS = [softpipe])
|
||||
extra.append(softpipe)
|
||||
|
||||
if env['llvm']:
|
||||
env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
|
||||
env.Prepend(LIBS = [llvmpipe])
|
||||
extra.append(llvmpipe)
|
||||
|
||||
if 'cell' in env['drivers']:
|
||||
env.Append(CPPDEFINES = 'GALLIUM_CELL')
|
||||
env.Prepend(LIBS = [cell])
|
||||
extra.append(cell)
|
||||
|
||||
sw = env.ConvenienceLibrary(
|
||||
target = 'sw',
|
||||
source = [
|
||||
'sw.c',
|
||||
]
|
||||
) + extra
|
||||
Export('sw')
|
||||
@@ -1,58 +0,0 @@
|
||||
#include "pipe/p_compiler.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "target-helpers/wrap_screen.h"
|
||||
#include "sw_public.h"
|
||||
|
||||
|
||||
/* Helper function to choose and instantiate one of the software rasterizers:
|
||||
* cell, llvmpipe, softpipe.
|
||||
*/
|
||||
|
||||
#ifdef GALLIUM_SOFTPIPE
|
||||
#include "softpipe/sp_public.h"
|
||||
#endif
|
||||
|
||||
#ifdef GALLIUM_LLVMPIPE
|
||||
#include "llvmpipe/lp_public.h"
|
||||
#endif
|
||||
|
||||
#ifdef GALLIUM_CELL
|
||||
#include "cell/ppu/cell_public.h"
|
||||
#endif
|
||||
|
||||
struct pipe_screen *
|
||||
swrast_create_screen(struct sw_winsys *winsys)
|
||||
{
|
||||
const char *default_driver;
|
||||
const char *driver;
|
||||
struct pipe_screen *screen = NULL;
|
||||
|
||||
#if defined(GALLIUM_CELL)
|
||||
default_driver = "cell";
|
||||
#elif defined(GALLIUM_LLVMPIPE)
|
||||
default_driver = "llvmpipe";
|
||||
#elif defined(GALLIUM_SOFTPIPE)
|
||||
default_driver = "softpipe";
|
||||
#else
|
||||
default_driver = "";
|
||||
#endif
|
||||
|
||||
driver = debug_get_option("GALLIUM_DRIVER", default_driver);
|
||||
|
||||
#if defined(GALLIUM_CELL)
|
||||
if (screen == NULL && strcmp(driver, "cell") == 0)
|
||||
screen = cell_create_screen( winsys );
|
||||
#endif
|
||||
|
||||
#if defined(GALLIUM_LLVMPIPE)
|
||||
if (screen == NULL && strcmp(driver, "llvmpipe") == 0)
|
||||
screen = llvmpipe_create_screen( winsys );
|
||||
#endif
|
||||
|
||||
#if defined(GALLIUM_SOFTPIPE)
|
||||
if (screen == NULL)
|
||||
screen = softpipe_create_screen( winsys );
|
||||
#endif
|
||||
|
||||
return screen;
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
#ifndef SW_PUBLIC_H
|
||||
#define SW_PUBLIC_H
|
||||
|
||||
/* A convenience library, primarily to isolate the logic required to
|
||||
* figure out which if any software rasterizers have been built and
|
||||
* select between them.
|
||||
*/
|
||||
struct sw_winsys;
|
||||
|
||||
struct pipe_screen *
|
||||
swrast_create_screen(struct sw_winsys *winsys);
|
||||
|
||||
#endif
|
||||
@@ -483,7 +483,12 @@ enum pipe_shader_cap
|
||||
PIPE_SHADER_CAP_MAX_TEMPS,
|
||||
PIPE_SHADER_CAP_MAX_ADDRS,
|
||||
PIPE_SHADER_CAP_MAX_PREDS,
|
||||
/* boolean caps */
|
||||
PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED,
|
||||
PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR,
|
||||
PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR,
|
||||
PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR,
|
||||
PIPE_SHADER_CAP_INDIRECT_CONST_ADDR,
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -348,6 +348,12 @@ struct st_context_iface
|
||||
void (*copy)(struct st_context_iface *stctxi,
|
||||
struct st_context_iface *stsrci, unsigned mask);
|
||||
|
||||
/**
|
||||
* Used to implement wglShareLists.
|
||||
*/
|
||||
boolean (*share)(struct st_context_iface *stctxi,
|
||||
struct st_context_iface *stsrci);
|
||||
|
||||
/**
|
||||
* Look up and return the info of a resource for EGLImage.
|
||||
*
|
||||
@@ -401,6 +407,11 @@ struct st_manager
|
||||
*/
|
||||
struct st_api
|
||||
{
|
||||
/**
|
||||
* The name of the rendering API. This is informative.
|
||||
*/
|
||||
const char *name;
|
||||
|
||||
/**
|
||||
* The supported rendering API.
|
||||
*/
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
#include "pipe/p_compiler.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "target-helpers/wrap_screen.h"
|
||||
|
||||
struct sw_winsys;
|
||||
|
||||
#ifdef GALLIUM_SOFTPIPE
|
||||
#include "softpipe/sp_public.h"
|
||||
#endif
|
||||
|
||||
#ifdef GALLIUM_LLVMPIPE
|
||||
#include "llvmpipe/lp_public.h"
|
||||
#endif
|
||||
|
||||
#ifdef GALLIUM_CELL
|
||||
#include "cell/ppu/cell_public.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Helper function to choose and instantiate one of the software rasterizers:
|
||||
* cell, llvmpipe, softpipe.
|
||||
*
|
||||
* This function could be shared, but currently causes headaches for
|
||||
* the build systems, particularly scons if we try. Long term, want
|
||||
* to avoid having global #defines for things like GALLIUM_LLVMPIPE,
|
||||
* GALLIUM_CELL, etc. Scons already eliminates those #defines, so
|
||||
* things that are painful for it now are likely to be painful for
|
||||
* other build systems in the future.
|
||||
*/
|
||||
|
||||
static INLINE struct pipe_screen *
|
||||
swrast_screen_create(struct sw_winsys *winsys)
|
||||
{
|
||||
const char *default_driver;
|
||||
const char *driver;
|
||||
struct pipe_screen *screen = NULL;
|
||||
|
||||
#if defined(GALLIUM_CELL)
|
||||
default_driver = "cell";
|
||||
#elif defined(GALLIUM_LLVMPIPE)
|
||||
default_driver = "llvmpipe";
|
||||
#elif defined(GALLIUM_SOFTPIPE)
|
||||
default_driver = "softpipe";
|
||||
#else
|
||||
default_driver = "";
|
||||
#endif
|
||||
|
||||
driver = debug_get_option("GALLIUM_DRIVER", default_driver);
|
||||
|
||||
#if defined(GALLIUM_CELL)
|
||||
if (screen == NULL && strcmp(driver, "cell") == 0)
|
||||
screen = cell_create_screen( winsys );
|
||||
#endif
|
||||
|
||||
#if defined(GALLIUM_LLVMPIPE)
|
||||
if (screen == NULL && strcmp(driver, "llvmpipe") == 0)
|
||||
screen = llvmpipe_create_screen( winsys );
|
||||
#endif
|
||||
|
||||
#if defined(GALLIUM_SOFTPIPE)
|
||||
if (screen == NULL)
|
||||
screen = softpipe_create_screen( winsys );
|
||||
#endif
|
||||
|
||||
return gallium_wrap_screen( screen );
|
||||
}
|
||||
|
||||
@@ -46,9 +46,6 @@
|
||||
#define SERVER_MAJOR_VERSION 1
|
||||
#define SERVER_MINOR_VERSION 4
|
||||
|
||||
/* This is appended onto the glXGetClient/ServerString version strings. */
|
||||
#define MESA_GLX_VERSION "Mesa " MESA_VERSION_STRING
|
||||
|
||||
/* Who implemented this GLX? */
|
||||
#define VENDOR "Brian Paul"
|
||||
|
||||
@@ -1672,7 +1669,7 @@ glXQueryServerString( Display *dpy, int screen, int name )
|
||||
{
|
||||
static char version[1000];
|
||||
sprintf(version, "%d.%d %s",
|
||||
SERVER_MAJOR_VERSION, SERVER_MINOR_VERSION, MESA_GLX_VERSION);
|
||||
SERVER_MAJOR_VERSION, SERVER_MINOR_VERSION, xmesa_get_name());
|
||||
|
||||
(void) dpy;
|
||||
(void) screen;
|
||||
@@ -1697,7 +1694,7 @@ glXGetClientString( Display *dpy, int name )
|
||||
{
|
||||
static char version[1000];
|
||||
sprintf(version, "%d.%d %s", CLIENT_MAJOR_VERSION,
|
||||
CLIENT_MINOR_VERSION, MESA_GLX_VERSION);
|
||||
CLIENT_MINOR_VERSION, xmesa_get_name());
|
||||
|
||||
(void) dpy;
|
||||
|
||||
|
||||
@@ -827,6 +827,16 @@ void XMesaDestroyVisual( XMesaVisual v )
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the informative name.
|
||||
*/
|
||||
const char *
|
||||
xmesa_get_name(void)
|
||||
{
|
||||
return stapi->name;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Do per-display initializations.
|
||||
*/
|
||||
|
||||
@@ -57,7 +57,7 @@ and create a window, you must do the following to use the X/Mesa interface:
|
||||
#define XMESA_H
|
||||
|
||||
|
||||
#include "main/core.h" /* for GLvisual and MESA_VERSION_STRING */
|
||||
#include "main/core.h" /* for gl_config */
|
||||
#include "state_tracker/st_api.h"
|
||||
#include "os/os_thread.h"
|
||||
|
||||
@@ -351,6 +351,9 @@ struct xmesa_buffer {
|
||||
|
||||
|
||||
|
||||
extern const char *
|
||||
xmesa_get_name(void);
|
||||
|
||||
extern void
|
||||
xmesa_init(Display *dpy);
|
||||
|
||||
|
||||
@@ -9,6 +9,9 @@ LIBRARY_INCLUDES = \
|
||||
-I$(TOP)/include \
|
||||
-I$(TOP)/src/mapi
|
||||
|
||||
LIBRARY_DEFINES = \
|
||||
-DVEGA_VERSION_STRING=\"$(MESA_VERSION)\"
|
||||
|
||||
C_SOURCES = \
|
||||
api.c \
|
||||
api_context.c \
|
||||
|
||||
@@ -8,6 +8,9 @@ env = env.Clone()
|
||||
env.Append(CPPPATH = [
|
||||
'#/src/mapi',
|
||||
])
|
||||
env.Append(CPPDEFINES = [
|
||||
'VEGA_VERSION_STRING=',
|
||||
])
|
||||
|
||||
vega_sources = [
|
||||
'api.c',
|
||||
|
||||
@@ -73,7 +73,8 @@ void vegaFinish(void)
|
||||
pipe = ctx->pipe;
|
||||
|
||||
pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
|
||||
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0);
|
||||
pipe->screen->fence_reference(pipe->screen, &fence, NULL);
|
||||
if (fence) {
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0);
|
||||
pipe->screen->fence_reference(pipe->screen, &fence, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -796,6 +796,8 @@ void vegaLookupSingle(VGImage dst, VGImage src,
|
||||
return;
|
||||
}
|
||||
|
||||
vg_validate_state(ctx);
|
||||
|
||||
for (i = 0; i < 256; ++i) {
|
||||
VGuint rgba = lookupTable[i];
|
||||
VGubyte blue, green, red, alpha;
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "pipe/p_screen.h"
|
||||
#include "util/u_inlines.h"
|
||||
#include "util/u_tile.h"
|
||||
#include "util/u_math.h"
|
||||
|
||||
static INLINE VGboolean supported_image_format(VGImageFormat format)
|
||||
{
|
||||
@@ -402,7 +403,6 @@ void vegaReadPixels(void * data, VGint dataStride,
|
||||
|
||||
VGfloat temp[VEGA_MAX_IMAGE_WIDTH][4];
|
||||
VGfloat *df = (VGfloat*)temp;
|
||||
VGint y = (fb->height - sy) - 1, yStep = -1;
|
||||
VGint i;
|
||||
VGubyte *dst = (VGubyte *)data;
|
||||
VGint xoffset = 0, yoffset = 0;
|
||||
@@ -430,18 +430,26 @@ void vegaReadPixels(void * data, VGint dataStride,
|
||||
}
|
||||
if (sy < 0) {
|
||||
yoffset = -sy;
|
||||
yoffset *= dataStride;
|
||||
height += sy;
|
||||
sy = 0;
|
||||
y = (fb->height - sy) - 1;
|
||||
yoffset *= dataStride;
|
||||
}
|
||||
|
||||
if (sx + width > fb->width || sy + height > fb->height) {
|
||||
width = fb->width - sx;
|
||||
height = fb->height - sy;
|
||||
/* nothing to read */
|
||||
if (width <= 0 || height <= 0)
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
VGint y = (fb->height - sy) - 1, yStep = -1;
|
||||
struct pipe_transfer *transfer;
|
||||
|
||||
transfer = pipe_get_transfer(pipe, strb->texture, 0, 0, 0,
|
||||
PIPE_TRANSFER_READ,
|
||||
0, 0, width, height);
|
||||
0, 0, sx + width, fb->height - sy);
|
||||
|
||||
/* Do a row at a time to flip image data vertically */
|
||||
for (i = 0; i < height; i++) {
|
||||
|
||||
@@ -127,6 +127,7 @@ struct vg_context * vg_create_context(struct pipe_context *pipe,
|
||||
|
||||
ctx->mask.sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
|
||||
ctx->mask.sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
|
||||
ctx->mask.sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
|
||||
ctx->mask.sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
|
||||
ctx->mask.sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
|
||||
ctx->mask.sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
|
||||
@@ -134,6 +135,7 @@ struct vg_context * vg_create_context(struct pipe_context *pipe,
|
||||
|
||||
ctx->blend_sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
|
||||
ctx->blend_sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
|
||||
ctx->blend_sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
|
||||
ctx->blend_sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
|
||||
ctx->blend_sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
|
||||
ctx->blend_sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
|
||||
|
||||
@@ -535,6 +535,7 @@ vg_api_destroy(struct st_api *stapi)
|
||||
}
|
||||
|
||||
static const struct st_api vg_api = {
|
||||
"Vega " VEGA_VERSION_STRING,
|
||||
ST_API_OPENVG,
|
||||
ST_PROFILE_DEFAULT_MASK,
|
||||
vg_api_destroy,
|
||||
|
||||
@@ -29,12 +29,10 @@
|
||||
|
||||
#include "pipe/p_compiler.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_state.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "state_tracker/st_api.h"
|
||||
|
||||
/* for _mesa_share_state */
|
||||
#include "state_tracker/st_context.h"
|
||||
#include "main/core.h"
|
||||
|
||||
#include "stw_icd.h"
|
||||
#include "stw_device.h"
|
||||
#include "stw_winsys.h"
|
||||
@@ -102,13 +100,8 @@ DrvShareLists(
|
||||
ctx1 = stw_lookup_context_locked( dhglrc1 );
|
||||
ctx2 = stw_lookup_context_locked( dhglrc2 );
|
||||
|
||||
if (ctx1 && ctx2) {
|
||||
struct st_context *st1, *st2;
|
||||
|
||||
st1 = (struct st_context *) ctx1->st;
|
||||
st2 = (struct st_context *) ctx2->st;
|
||||
ret = _mesa_share_state(st2->ctx, st1->ctx);
|
||||
}
|
||||
if (ctx1 && ctx2 && ctx2->st->share)
|
||||
ret = ctx2->st->share(ctx2->st, ctx1->st);
|
||||
|
||||
pipe_mutex_unlock( stw_dev->ctx_mutex );
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
TOP = ../../../..
|
||||
include $(TOP)/configs/current
|
||||
|
||||
LIBNAME = noop_dri.so
|
||||
|
||||
DRIVER_DEFINES = \
|
||||
-D__NOT_HAVE_DRM_H
|
||||
|
||||
PIPE_DRIVERS = \
|
||||
$(TOP)/src/gallium/state_trackers/dri/sw/libdrisw.a \
|
||||
$(TOP)/src/gallium/winsys/sw/dri/libswdri.a \
|
||||
$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
|
||||
$(TOP)/src/gallium/drivers/trace/libtrace.a \
|
||||
$(TOP)/src/gallium/drivers/rbug/librbug.a \
|
||||
$(TOP)/src/gallium/drivers/noop/libnoop.a
|
||||
|
||||
SWRAST_COMMON_GALLIUM_SOURCES = \
|
||||
$(TOP)/src/mesa/drivers/dri/common/utils.c \
|
||||
$(TOP)/src/mesa/drivers/dri/common/drisw_util.c \
|
||||
$(TOP)/src/mesa/drivers/dri/common/xmlconfig.c
|
||||
|
||||
C_SOURCES = \
|
||||
swrast_drm_api.c \
|
||||
$(SWRAST_COMMON_GALLIUM_SOURCES) \
|
||||
$(DRIVER_SOURCES)
|
||||
|
||||
ASM_SOURCES =
|
||||
|
||||
include ../Makefile.dri
|
||||
|
||||
INCLUDES += \
|
||||
-I$(TOP)/src/gallium/winsys/sw/dri
|
||||
|
||||
symlinks:
|
||||
@@ -0,0 +1,31 @@
|
||||
Import('*')
|
||||
|
||||
env = drienv.Clone()
|
||||
|
||||
env.Append(CPPPATH = [
|
||||
'#/src/gallium/winsys/sw/dri',
|
||||
])
|
||||
|
||||
env.Prepend(LIBS = [
|
||||
st_drisw,
|
||||
ws_dri,
|
||||
noop,
|
||||
mesa,
|
||||
glsl,
|
||||
gallium,
|
||||
COMMON_DRI_SW_OBJECTS
|
||||
])
|
||||
|
||||
env.Prepend(LIBS = [noop])
|
||||
|
||||
swrastg_sources = [
|
||||
'swrast_drm_api.c'
|
||||
]
|
||||
|
||||
module = env.LoadableModule(
|
||||
target ='noop_dri.so',
|
||||
source = swrastg_sources,
|
||||
SHLIBPREFIX = '',
|
||||
)
|
||||
|
||||
env.Alias('dri-noop', module)
|
||||
@@ -0,0 +1,63 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2009, VMware, Inc.
|
||||
* All Rights Reserved.
|
||||
* Copyright 2010 George Sapountzis <gsapountzis@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include "pipe/p_compiler.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "dri_sw_winsys.h"
|
||||
#include "noop/noop_public.h"
|
||||
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "target-helpers/inline_sw_helper.h"
|
||||
|
||||
|
||||
struct pipe_screen *
|
||||
drisw_create_screen(struct drisw_loader_funcs *lf)
|
||||
{
|
||||
struct sw_winsys *winsys = NULL;
|
||||
struct pipe_screen *screen = NULL;
|
||||
|
||||
winsys = dri_create_sw_winsys(lf);
|
||||
if (winsys == NULL)
|
||||
return NULL;
|
||||
|
||||
screen = noop_screen_create(winsys);
|
||||
if (!screen)
|
||||
goto fail;
|
||||
|
||||
screen = debug_screen_wrap(screen);
|
||||
|
||||
return screen;
|
||||
|
||||
fail:
|
||||
if (winsys)
|
||||
winsys->destroy(winsys);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* vim: set sw=3 ts=8 sts=3 expandtab: */
|
||||
@@ -12,9 +12,6 @@ env.Append(CPPPATH = [
|
||||
env.Prepend(LIBS = [
|
||||
gallium,
|
||||
'gdi32',
|
||||
identity,
|
||||
rbug,
|
||||
trace,
|
||||
'user32',
|
||||
'ws2_32',
|
||||
])
|
||||
@@ -24,8 +21,13 @@ sources = [
|
||||
graw_util,
|
||||
]
|
||||
|
||||
env.Append(CPPDEFINES = 'GALLIUM_SOFTPIPE')
|
||||
env.Prepend(LIBS = [softpipe])
|
||||
if True:
|
||||
env.Append(CPPDEFINES = ['GALLIUM_TRACE', 'GALLIUM_RBUG', 'GALLIUM_GALAHAD', 'GALLIUM_SOFTPIPE'])
|
||||
env.Prepend(LIBS = [trace, rbug, galahad, softpipe])
|
||||
|
||||
if env['llvm']:
|
||||
env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
|
||||
env.Prepend(LIBS = [llvmpipe])
|
||||
|
||||
graw = env.SharedLibrary(
|
||||
target = 'graw',
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
#include "gdi/gdi_sw_winsys.h"
|
||||
#include "pipe/p_screen.h"
|
||||
#include "state_tracker/graw.h"
|
||||
#include "target-helpers/wrap_screen.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "target-helpers/inline_sw_helper.h"
|
||||
#include <windows.h>
|
||||
|
||||
@@ -116,7 +116,7 @@ graw_create_window_and_screen(int x,
|
||||
|
||||
*handle = (void *)hDC;
|
||||
|
||||
return gallium_wrap_screen(screen);
|
||||
return debug_screen_wrap(screen);
|
||||
|
||||
fail:
|
||||
if (hWnd)
|
||||
|
||||
@@ -7,9 +7,6 @@ env = env.Clone()
|
||||
|
||||
env.Prepend(LIBS = [
|
||||
ws_xlib,
|
||||
trace,
|
||||
rbug,
|
||||
identity,
|
||||
gallium,
|
||||
])
|
||||
|
||||
@@ -20,14 +17,16 @@ env.Append(CPPPATH = [
|
||||
'#src/gallium/include/state_tracker',
|
||||
])
|
||||
|
||||
env.Append(CPPDEFINES = ['GALLIUM_RBUG', 'GALLIUM_TRACE', 'GALLIUM_GALAHAD'])
|
||||
|
||||
sources = [
|
||||
'graw_xlib.c',
|
||||
graw_util
|
||||
]
|
||||
|
||||
if True:
|
||||
env.Append(CPPDEFINES = 'GALLIUM_SOFTPIPE')
|
||||
env.Prepend(LIBS = [softpipe])
|
||||
env.Append(CPPDEFINES = ['GALLIUM_TRACE', 'GALLIUM_RBUG', 'GALLIUM_GALAHAD', 'GALLIUM_SOFTPIPE'])
|
||||
env.Prepend(LIBS = [trace, rbug, galahad, softpipe])
|
||||
|
||||
if env['llvm']:
|
||||
env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
#include "pipe/p_screen.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "target-helpers/wrap_screen.h"
|
||||
#include "target-helpers/inline_sw_helper.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "state_tracker/xlib_sw_winsys.h"
|
||||
#include "state_tracker/graw.h"
|
||||
|
||||
@@ -36,7 +36,7 @@ graw_create_screen( void )
|
||||
|
||||
/* Inject any wrapping layers we want to here:
|
||||
*/
|
||||
return gallium_wrap_screen( screen );
|
||||
return debug_screen_wrap( screen );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -18,16 +18,15 @@ env.Append(LIBS = [
|
||||
talloc,
|
||||
])
|
||||
|
||||
sources = []
|
||||
sources = ['libgl_gdi.c']
|
||||
drivers = []
|
||||
|
||||
if True:
|
||||
sources = ['gdi_softpipe_winsys.c']
|
||||
drivers = [softpipe]
|
||||
drivers += [softpipe]
|
||||
|
||||
if env['llvm']:
|
||||
sources = ['gdi_llvmpipe_winsys.c']
|
||||
drivers = [llvmpipe]
|
||||
env.Append(CPPDEFINES = 'HAVE_LLVMPIPE')
|
||||
drivers += [llvmpipe]
|
||||
|
||||
if env['gcc']:
|
||||
sources += ['#src/gallium/state_trackers/wgl/opengl32.mingw.def']
|
||||
|
||||
@@ -1,124 +0,0 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2009 VMware, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* LLVMpipe support.
|
||||
*
|
||||
* @author Jose Fonseca <jfonseca@vmware.com>
|
||||
*/
|
||||
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include "stw_winsys.h"
|
||||
#include "gdi/gdi_sw_winsys.h"
|
||||
#include "softpipe/sp_texture.h"
|
||||
#include "softpipe/sp_screen.h"
|
||||
#include "softpipe/sp_public.h"
|
||||
|
||||
|
||||
static struct pipe_screen *
|
||||
gdi_softpipe_screen_create(void)
|
||||
{
|
||||
static struct sw_winsys *winsys;
|
||||
struct pipe_screen *screen;
|
||||
|
||||
winsys = gdi_create_sw_winsys();
|
||||
if(!winsys)
|
||||
goto no_winsys;
|
||||
|
||||
screen = softpipe_create_screen(winsys);
|
||||
if(!screen)
|
||||
goto no_screen;
|
||||
|
||||
return screen;
|
||||
|
||||
no_screen:
|
||||
winsys->destroy(winsys);
|
||||
no_winsys:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void
|
||||
gdi_softpipe_present(struct pipe_screen *screen,
|
||||
struct pipe_surface *surface,
|
||||
HDC hDC)
|
||||
{
|
||||
/* This will fail if any interposing layer (trace, debug, etc) has
|
||||
* been introduced between the state-trackers and softpipe.
|
||||
*
|
||||
* Ideally this would get replaced with a call to
|
||||
* pipe_screen::flush_frontbuffer().
|
||||
*
|
||||
* Failing that, it may be necessary for intervening layers to wrap
|
||||
* other structs such as this stw_winsys as well...
|
||||
*/
|
||||
gdi_sw_display(softpipe_screen(screen)->winsys,
|
||||
softpipe_resource(surface->texture)->dt,
|
||||
hDC);
|
||||
}
|
||||
|
||||
|
||||
static const struct stw_winsys stw_winsys = {
|
||||
&gdi_softpipe_screen_create,
|
||||
&gdi_softpipe_present,
|
||||
NULL, /* get_adapter_luid */
|
||||
NULL, /* shared_surface_open */
|
||||
NULL, /* shared_surface_close */
|
||||
NULL /* compose */
|
||||
};
|
||||
|
||||
|
||||
BOOL WINAPI
|
||||
DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
|
||||
{
|
||||
switch (fdwReason) {
|
||||
case DLL_PROCESS_ATTACH:
|
||||
stw_init(&stw_winsys);
|
||||
stw_init_thread();
|
||||
break;
|
||||
|
||||
case DLL_THREAD_ATTACH:
|
||||
stw_init_thread();
|
||||
break;
|
||||
|
||||
case DLL_THREAD_DETACH:
|
||||
stw_cleanup_thread();
|
||||
break;
|
||||
|
||||
case DLL_PROCESS_DETACH:
|
||||
stw_cleanup_thread();
|
||||
stw_cleanup();
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
+60
-17
@@ -1,6 +1,6 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2009 VMware, Inc.
|
||||
* Copyright 2009-2010 VMware, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
/**
|
||||
* @file
|
||||
* LLVMpipe support.
|
||||
* Softpipe/LLVMpipe support.
|
||||
*
|
||||
* @author Jose Fonseca <jfonseca@vmware.com>
|
||||
*/
|
||||
@@ -36,24 +36,56 @@
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include "util/u_debug.h"
|
||||
#include "stw_winsys.h"
|
||||
#include "gdi/gdi_sw_winsys.h"
|
||||
|
||||
#include "softpipe/sp_texture.h"
|
||||
#include "softpipe/sp_screen.h"
|
||||
#include "softpipe/sp_public.h"
|
||||
|
||||
#ifdef HAVE_LLVMPIPE
|
||||
#include "llvmpipe/lp_texture.h"
|
||||
#include "llvmpipe/lp_screen.h"
|
||||
#include "llvmpipe/lp_public.h"
|
||||
#endif
|
||||
|
||||
|
||||
static boolean use_llvmpipe = FALSE;
|
||||
|
||||
|
||||
static struct pipe_screen *
|
||||
gdi_llvmpipe_screen_create(void)
|
||||
gdi_screen_create(void)
|
||||
{
|
||||
static struct sw_winsys *winsys;
|
||||
struct pipe_screen *screen;
|
||||
const char *default_driver;
|
||||
const char *driver;
|
||||
struct pipe_screen *screen = NULL;
|
||||
struct sw_winsys *winsys;
|
||||
|
||||
winsys = gdi_create_sw_winsys();
|
||||
if(!winsys)
|
||||
goto no_winsys;
|
||||
|
||||
screen = llvmpipe_create_screen(winsys);
|
||||
#ifdef HAVE_LLVMPIPE
|
||||
default_driver = "llvmpipe";
|
||||
#else
|
||||
default_driver = "softpipe";
|
||||
#endif
|
||||
|
||||
driver = debug_get_option("GALLIUM_DRIVER", default_driver);
|
||||
|
||||
#ifdef HAVE_LLVMPIPE
|
||||
if (strcmp(driver, "llvmpipe") == 0) {
|
||||
screen = llvmpipe_create_screen( winsys );
|
||||
}
|
||||
#endif
|
||||
|
||||
if (screen == NULL) {
|
||||
screen = softpipe_create_screen( winsys );
|
||||
} else {
|
||||
use_llvmpipe = TRUE;
|
||||
}
|
||||
|
||||
if(!screen)
|
||||
goto no_screen;
|
||||
|
||||
@@ -66,15 +98,13 @@ no_winsys:
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void
|
||||
gdi_llvmpipe_present(struct pipe_screen *screen,
|
||||
struct pipe_surface *surface,
|
||||
HDC hDC)
|
||||
gdi_present(struct pipe_screen *screen,
|
||||
struct pipe_surface *surface,
|
||||
HDC hDC)
|
||||
{
|
||||
/* This will fail if any interposing layer (trace, debug, etc) has
|
||||
* been introduced between the state-trackers and llvmpipe.
|
||||
* been introduced between the state-trackers and the pipe driver.
|
||||
*
|
||||
* Ideally this would get replaced with a call to
|
||||
* pipe_screen::flush_frontbuffer().
|
||||
@@ -82,15 +112,28 @@ gdi_llvmpipe_present(struct pipe_screen *screen,
|
||||
* Failing that, it may be necessary for intervening layers to wrap
|
||||
* other structs such as this stw_winsys as well...
|
||||
*/
|
||||
gdi_sw_display(llvmpipe_screen(screen)->winsys,
|
||||
llvmpipe_resource(surface->texture)->dt,
|
||||
hDC);
|
||||
|
||||
struct sw_winsys *winsys = NULL;
|
||||
struct sw_displaytarget *dt = NULL;
|
||||
|
||||
#ifdef HAVE_LLVMPIPE
|
||||
if (use_llvmpipe) {
|
||||
winsys = llvmpipe_screen(screen)->winsys;
|
||||
dt = llvmpipe_resource(surface->texture)->dt;
|
||||
gdi_sw_display(winsys, dt, hDC);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
winsys = softpipe_screen(screen)->winsys,
|
||||
dt = softpipe_resource(surface->texture)->dt,
|
||||
gdi_sw_display(winsys, dt, hDC);
|
||||
}
|
||||
|
||||
|
||||
static const struct stw_winsys stw_winsys = {
|
||||
&gdi_llvmpipe_screen_create,
|
||||
&gdi_llvmpipe_present,
|
||||
&gdi_screen_create,
|
||||
&gdi_present,
|
||||
NULL, /* get_adapter_luid */
|
||||
NULL, /* shared_surface_open */
|
||||
NULL, /* shared_surface_close */
|
||||
@@ -26,6 +26,8 @@ INCLUDE_DIRS = \
|
||||
|
||||
DEFINES += \
|
||||
-DGALLIUM_SOFTPIPE \
|
||||
-DGALLIUM_RBUG \
|
||||
-DGALLIUM_TRACE \
|
||||
-DGALLIUM_GALAHAD
|
||||
#-DGALLIUM_CELL will be defined by the config */
|
||||
|
||||
@@ -44,7 +46,7 @@ LIBS = \
|
||||
$(TOP)/src/gallium/winsys/sw/xlib/libws_xlib.a \
|
||||
$(TOP)/src/gallium/drivers/trace/libtrace.a \
|
||||
$(TOP)/src/gallium/drivers/rbug/librbug.a \
|
||||
$(TOP)/src/gallium/drivers/identity/libidentity.a \
|
||||
$(TOP)/src/gallium/drivers/galahad/libgalahad.a \
|
||||
$(TOP)/src/mapi/glapi/libglapi.a \
|
||||
$(TOP)/src/mesa/libmesagallium.a \
|
||||
$(GALLIUM_AUXILIARIES) \
|
||||
|
||||
@@ -19,9 +19,6 @@ env.Prepend(LIBS = env['X11_LIBS'])
|
||||
env.Prepend(LIBS = [
|
||||
st_xlib,
|
||||
ws_xlib,
|
||||
trace,
|
||||
rbug,
|
||||
identity,
|
||||
glapi,
|
||||
mesa,
|
||||
glsl,
|
||||
@@ -34,15 +31,11 @@ sources = [
|
||||
]
|
||||
|
||||
if True:
|
||||
env.Append(CPPDEFINES = 'GALLIUM_SOFTPIPE')
|
||||
env.Prepend(LIBS = [softpipe])
|
||||
|
||||
if True:
|
||||
env.Append(CPPDEFINES = 'GALLIUM_GALAHAD')
|
||||
env.Prepend(LIBS = [galahad])
|
||||
env.Append(CPPDEFINES = ['GALLIUM_TRACE', 'GALLIUM_RBUG', 'GALLIUM_GALAHAD', 'GALLIUM_SOFTPIPE'])
|
||||
env.Prepend(LIBS = [trace, rbug, galahad, softpipe])
|
||||
|
||||
if env['llvm']:
|
||||
env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
|
||||
env.Append(CPPDEFINES = ['GALLIUM_LLVMPIPE'])
|
||||
env.Prepend(LIBS = [llvmpipe])
|
||||
|
||||
if False:
|
||||
|
||||
@@ -32,17 +32,15 @@
|
||||
*/
|
||||
#include "pipe/p_compiler.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "target-helpers/wrap_screen.h"
|
||||
#include "target-helpers/inline_sw_helper.h"
|
||||
#include "state_tracker/xlib_sw_winsys.h"
|
||||
#include "xm_public.h"
|
||||
|
||||
#include "state_tracker/st_api.h"
|
||||
#include "state_tracker/st_gl_api.h"
|
||||
#include "target-helpers/inline_sw_helper.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
|
||||
|
||||
#if defined(GALLIUM_GALAHAD)
|
||||
#include "galahad/glhd_public.h"
|
||||
#endif
|
||||
|
||||
/* Helper function to build a subset of a driver stack consisting of
|
||||
* one of the software rasterizers (cell, llvmpipe, softpipe) and the
|
||||
@@ -67,18 +65,9 @@ swrast_xlib_create_screen( Display *display )
|
||||
if (screen == NULL)
|
||||
goto fail;
|
||||
|
||||
/* XXX will fix soon */
|
||||
#if defined(GALLIUM_GALAHAD)
|
||||
if (screen) {
|
||||
struct pipe_screen *galahad_screen = galahad_screen_create( screen );
|
||||
if (galahad_screen)
|
||||
screen = galahad_screen;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Inject any wrapping layers we want to here:
|
||||
*/
|
||||
return gallium_wrap_screen( screen );
|
||||
return debug_screen_wrap( screen );
|
||||
|
||||
fail:
|
||||
if (winsys)
|
||||
|
||||
@@ -41,7 +41,7 @@ i915_drm_batchbuffer_reset(struct i915_drm_batchbuffer *batch)
|
||||
|
||||
if (batch->bo)
|
||||
drm_intel_bo_unreference(batch->bo);
|
||||
batch->bo = drm_intel_bo_alloc(idws->pools.gem,
|
||||
batch->bo = drm_intel_bo_alloc(idws->gem_manager,
|
||||
"gallium3d_batchbuffer",
|
||||
batch->actual_size,
|
||||
4096);
|
||||
|
||||
@@ -12,7 +12,6 @@ i915_drm_buffer_create(struct i915_winsys *iws,
|
||||
{
|
||||
struct i915_drm_buffer *buf = CALLOC_STRUCT(i915_drm_buffer);
|
||||
struct i915_drm_winsys *idws = i915_drm_winsys(iws);
|
||||
drm_intel_bufmgr *pool;
|
||||
char *name;
|
||||
|
||||
if (!buf)
|
||||
@@ -21,26 +20,19 @@ i915_drm_buffer_create(struct i915_winsys *iws,
|
||||
buf->magic = 0xDEAD1337;
|
||||
buf->flinked = FALSE;
|
||||
buf->flink = 0;
|
||||
buf->map_gtt = FALSE;
|
||||
|
||||
if (type == I915_NEW_TEXTURE) {
|
||||
name = "gallium3d_texture";
|
||||
pool = idws->pools.gem;
|
||||
} else if (type == I915_NEW_VERTEX) {
|
||||
name = "gallium3d_vertex";
|
||||
pool = idws->pools.gem;
|
||||
buf->map_gtt = TRUE;
|
||||
} else if (type == I915_NEW_SCANOUT) {
|
||||
name = "gallium3d_scanout";
|
||||
pool = idws->pools.gem;
|
||||
buf->map_gtt = TRUE;
|
||||
} else {
|
||||
assert(0);
|
||||
name = "gallium3d_unknown";
|
||||
pool = idws->pools.gem;
|
||||
}
|
||||
|
||||
buf->bo = drm_intel_bo_alloc(pool, name, size, alignment);
|
||||
buf->bo = drm_intel_bo_alloc(idws->gem_manager, name, size, alignment);
|
||||
|
||||
if (!buf->bo)
|
||||
goto err;
|
||||
@@ -66,7 +58,7 @@ i915_drm_buffer_from_handle(struct i915_winsys *iws,
|
||||
return NULL;
|
||||
|
||||
buf->magic = 0xDEAD1337;
|
||||
buf->bo = drm_intel_bo_gem_create_from_name(idws->pools.gem, "gallium3d_from_handle", whandle->handle);
|
||||
buf->bo = drm_intel_bo_gem_create_from_name(idws->gem_manager, "gallium3d_from_handle", whandle->handle);
|
||||
buf->flinked = TRUE;
|
||||
buf->flink = whandle->handle;
|
||||
|
||||
@@ -74,8 +66,6 @@ i915_drm_buffer_from_handle(struct i915_winsys *iws,
|
||||
goto err;
|
||||
|
||||
drm_intel_bo_get_tiling(buf->bo, &tile, &swizzle);
|
||||
if (tile != I915_TILE_NONE)
|
||||
buf->map_gtt = TRUE;
|
||||
|
||||
*stride = whandle->stride;
|
||||
|
||||
@@ -126,7 +116,6 @@ i915_drm_buffer_set_fence_reg(struct i915_winsys *iws,
|
||||
|
||||
if (tile != I915_TILE_NONE) {
|
||||
assert(buf->map_count == 0);
|
||||
buf->map_gtt = TRUE;
|
||||
}
|
||||
|
||||
return drm_intel_bo_set_tiling(buf->bo, &tile, stride);
|
||||
@@ -146,10 +135,7 @@ i915_drm_buffer_map(struct i915_winsys *iws,
|
||||
if (buf->map_count)
|
||||
goto out;
|
||||
|
||||
if (buf->map_gtt)
|
||||
ret = drm_intel_gem_bo_map_gtt(bo);
|
||||
else
|
||||
ret = drm_intel_bo_map(bo, write);
|
||||
ret = drm_intel_gem_bo_map_gtt(bo);
|
||||
|
||||
buf->ptr = bo->virtual;
|
||||
|
||||
@@ -171,10 +157,7 @@ i915_drm_buffer_unmap(struct i915_winsys *iws,
|
||||
if (--buf->map_count)
|
||||
return;
|
||||
|
||||
if (buf->map_gtt)
|
||||
drm_intel_gem_bo_unmap_gtt(intel_bo(buffer));
|
||||
else
|
||||
drm_intel_bo_unmap(intel_bo(buffer));
|
||||
drm_intel_gem_bo_unmap_gtt(intel_bo(buffer));
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
@@ -40,7 +40,7 @@ i915_drm_winsys_destroy(struct i915_winsys *iws)
|
||||
{
|
||||
struct i915_drm_winsys *idws = i915_drm_winsys(iws);
|
||||
|
||||
drm_intel_bufmgr_destroy(idws->pools.gem);
|
||||
drm_intel_bufmgr_destroy(idws->gem_manager);
|
||||
|
||||
FREE(idws);
|
||||
}
|
||||
@@ -67,8 +67,8 @@ i915_drm_winsys_create(int drmFD)
|
||||
|
||||
idws->base.destroy = i915_drm_winsys_destroy;
|
||||
|
||||
idws->pools.gem = drm_intel_bufmgr_gem_init(idws->fd, idws->max_batch_size);
|
||||
drm_intel_bufmgr_gem_enable_reuse(idws->pools.gem);
|
||||
idws->gem_manager = drm_intel_bufmgr_gem_init(idws->fd, idws->max_batch_size);
|
||||
drm_intel_bufmgr_gem_enable_reuse(idws->gem_manager);
|
||||
|
||||
idws->dump_cmd = debug_get_bool_option("I915_DUMP_CMD", FALSE);
|
||||
idws->send_cmd = !debug_get_bool_option("I915_NO_HW", FALSE);
|
||||
|
||||
@@ -24,9 +24,7 @@ struct i915_drm_winsys
|
||||
|
||||
size_t max_batch_size;
|
||||
|
||||
struct {
|
||||
drm_intel_bufmgr *gem;
|
||||
} pools;
|
||||
drm_intel_bufmgr *gem_manager;
|
||||
};
|
||||
|
||||
static INLINE struct i915_drm_winsys *
|
||||
@@ -54,7 +52,6 @@ struct i915_drm_buffer {
|
||||
|
||||
void *ptr;
|
||||
unsigned map_count;
|
||||
boolean map_gtt;
|
||||
|
||||
boolean flinked;
|
||||
unsigned flink;
|
||||
|
||||
@@ -577,6 +577,12 @@ int evergreen_context_init(struct r600_context *ctx, struct radeon *radeon)
|
||||
if (r)
|
||||
goto out_err;
|
||||
}
|
||||
/* FS RESOURCE */
|
||||
for (int j = 0, offset = 0x7C00; j < 16; j++, offset += 0x20) {
|
||||
r = evergreen_state_resource_init(ctx, offset);
|
||||
if (r)
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
/* PS loop const */
|
||||
evergreen_loop_const_init(ctx, 0);
|
||||
@@ -686,6 +692,13 @@ void evergreen_context_pipe_state_set_vs_resource(struct r600_context *ctx, stru
|
||||
evergreen_context_pipe_state_set_resource(ctx, state, offset);
|
||||
}
|
||||
|
||||
void evergreen_context_pipe_state_set_fs_resource(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid)
|
||||
{
|
||||
unsigned offset = R_030000_SQ_TEX_RESOURCE_WORD0_0 + 0x7C00 + 0x20 * rid;
|
||||
|
||||
evergreen_context_pipe_state_set_resource(ctx, state, offset);
|
||||
}
|
||||
|
||||
static inline void evergreen_context_pipe_state_set_sampler(struct r600_context *ctx, struct r600_pipe_state *state, unsigned offset)
|
||||
{
|
||||
struct r600_range *range;
|
||||
@@ -917,3 +930,10 @@ void evergreen_vs_resource_set(struct r600_context *ctx, struct r600_pipe_state
|
||||
|
||||
evergreen_resource_set(ctx, state, offset);
|
||||
}
|
||||
|
||||
void evergreen_fs_resource_set(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid)
|
||||
{
|
||||
unsigned offset = R_030000_RESOURCE0_WORD0 + 0x7C00 + 0x20 * rid;
|
||||
|
||||
evergreen_resource_set(ctx, state, offset);
|
||||
}
|
||||
|
||||
@@ -195,12 +195,16 @@ struct radeon *radeon_new(int fd, unsigned device)
|
||||
case CHIP_RS780:
|
||||
case CHIP_RS880:
|
||||
radeon->chip_class = R600;
|
||||
/* set default group bytes, overridden by tiling info ioctl */
|
||||
radeon->tiling_info.group_bytes = 256;
|
||||
break;
|
||||
case CHIP_RV770:
|
||||
case CHIP_RV730:
|
||||
case CHIP_RV710:
|
||||
case CHIP_RV740:
|
||||
radeon->chip_class = R700;
|
||||
/* set default group bytes, overridden by tiling info ioctl */
|
||||
radeon->tiling_info.group_bytes = 256;
|
||||
break;
|
||||
case CHIP_CEDAR:
|
||||
case CHIP_REDWOOD:
|
||||
@@ -208,6 +212,8 @@ struct radeon *radeon_new(int fd, unsigned device)
|
||||
case CHIP_CYPRESS:
|
||||
case CHIP_HEMLOCK:
|
||||
radeon->chip_class = EVERGREEN;
|
||||
/* set default group bytes, overridden by tiling info ioctl */
|
||||
radeon->tiling_info.group_bytes = 512;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "%s unknown or unsupported chipset 0x%04X\n",
|
||||
|
||||
@@ -593,6 +593,17 @@ static int r600_loop_const_init(struct r600_context *ctx, u32 offset)
|
||||
return r600_context_add_block(ctx, r600_loop_consts, nreg);
|
||||
}
|
||||
|
||||
static void r600_context_clear_fenced_bo(struct r600_context *ctx)
|
||||
{
|
||||
struct radeon_bo *bo, *tmp;
|
||||
|
||||
LIST_FOR_EACH_ENTRY_SAFE(bo, tmp, &ctx->fenced_bo, fencedlist) {
|
||||
LIST_DELINIT(&bo->fencedlist);
|
||||
bo->fence = 0;
|
||||
bo->ctx = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* initialize */
|
||||
void r600_context_fini(struct r600_context *ctx)
|
||||
{
|
||||
@@ -616,6 +627,8 @@ void r600_context_fini(struct r600_context *ctx)
|
||||
free(ctx->reloc);
|
||||
free(ctx->bo);
|
||||
free(ctx->pm4);
|
||||
|
||||
r600_context_clear_fenced_bo(ctx);
|
||||
if (ctx->fence_bo) {
|
||||
r600_bo_reference(ctx->radeon, &ctx->fence_bo, NULL);
|
||||
}
|
||||
@@ -693,6 +706,12 @@ int r600_context_init(struct r600_context *ctx, struct radeon *radeon)
|
||||
if (r)
|
||||
goto out_err;
|
||||
}
|
||||
/* FS RESOURCE */
|
||||
for (int j = 0, offset = 0x2300; j < 16; j++, offset += 0x1C) {
|
||||
r = r600_state_resource_init(ctx, offset);
|
||||
if (r)
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
/* PS loop const */
|
||||
r600_loop_const_init(ctx, 0);
|
||||
@@ -880,6 +899,13 @@ void r600_context_pipe_state_set_vs_resource(struct r600_context *ctx, struct r6
|
||||
r600_context_pipe_state_set_resource(ctx, state, offset);
|
||||
}
|
||||
|
||||
void r600_context_pipe_state_set_fs_resource(struct r600_context *ctx, struct r600_pipe_state *state, unsigned rid)
|
||||
{
|
||||
unsigned offset = R_038000_SQ_TEX_RESOURCE_WORD0_0 + 0x2300 + 0x1C * rid;
|
||||
|
||||
r600_context_pipe_state_set_resource(ctx, state, offset);
|
||||
}
|
||||
|
||||
static inline void r600_context_pipe_state_set_sampler(struct r600_context *ctx, struct r600_pipe_state *state, unsigned offset)
|
||||
{
|
||||
struct r600_range *range;
|
||||
@@ -1049,7 +1075,7 @@ void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw)
|
||||
ctx->pm4[ctx->pm4_cdwords++] = draw->vgt_draw_initiator;
|
||||
}
|
||||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_EVENT_WRITE, 0);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE_CACHE_FLUSH_AND_INV_EVENT;
|
||||
ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE(EVENT_TYPE_CACHE_FLUSH_AND_INV_EVENT) | EVENT_INDEX(0);
|
||||
|
||||
/* flush color buffer */
|
||||
for (int i = 0; i < 8; i++) {
|
||||
@@ -1086,7 +1112,7 @@ void r600_context_flush(struct r600_context *ctx)
|
||||
|
||||
/* emit fence */
|
||||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_EVENT_WRITE_EOP, 4);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE_CACHE_FLUSH_AND_INV_TS_EVENT | (5 << 8);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE(EVENT_TYPE_CACHE_FLUSH_AND_INV_TS_EVENT) | EVENT_INDEX(5);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = 0;
|
||||
ctx->pm4[ctx->pm4_cdwords++] = (1 << 29) | (0 << 24);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = ctx->fence;
|
||||
@@ -1266,7 +1292,7 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query)
|
||||
|
||||
/* emit begin query */
|
||||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_EVENT_WRITE, 2);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE_ZPASS_DONE;
|
||||
ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE(EVENT_TYPE_ZPASS_DONE) | EVENT_INDEX(1);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = query->num_results + r600_bo_offset(query->buffer);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = 0;
|
||||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0);
|
||||
@@ -1282,7 +1308,7 @@ void r600_query_end(struct r600_context *ctx, struct r600_query *query)
|
||||
{
|
||||
/* emit begin query */
|
||||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_EVENT_WRITE, 2);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE_ZPASS_DONE;
|
||||
ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE(EVENT_TYPE_ZPASS_DONE) | EVENT_INDEX(1);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = query->num_results + 8 + r600_bo_offset(query->buffer);
|
||||
ctx->pm4[ctx->pm4_cdwords++] = 0;
|
||||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0);
|
||||
|
||||
@@ -94,6 +94,15 @@
|
||||
#define EVENT_TYPE_CACHE_FLUSH_AND_INV_TS_EVENT 0x14
|
||||
#define EVENT_TYPE_ZPASS_DONE 0x15
|
||||
#define EVENT_TYPE_CACHE_FLUSH_AND_INV_EVENT 0x16
|
||||
#define EVENT_TYPE(x) ((x) << 0)
|
||||
#define EVENT_INDEX(x) ((x) << 8)
|
||||
/* 0 - any non-TS event
|
||||
* 1 - ZPASS_DONE
|
||||
* 2 - SAMPLE_PIPELINESTAT
|
||||
* 3 - SAMPLE_STREAMOUTSTAT*
|
||||
* 4 - *S_PARTIAL_FLUSH
|
||||
* 5 - TS events
|
||||
*/
|
||||
|
||||
#define PKT_TYPE_S(x) (((x) & 0x3) << 30)
|
||||
#define PKT_TYPE_G(x) (((x) >> 30) & 0x3)
|
||||
|
||||
+21
-23
@@ -30,55 +30,53 @@ CXX_SOURCES = \
|
||||
glsl_types.cpp \
|
||||
glsl_symbol_table.cpp \
|
||||
hir_field_selection.cpp \
|
||||
ir_algebraic.cpp \
|
||||
ir_basic_block.cpp \
|
||||
ir_clone.cpp \
|
||||
ir_constant_expression.cpp \
|
||||
ir_constant_folding.cpp \
|
||||
ir_constant_propagation.cpp \
|
||||
ir_constant_variable.cpp \
|
||||
ir_copy_propagation.cpp \
|
||||
ir.cpp \
|
||||
ir_dead_code.cpp \
|
||||
ir_dead_code_local.cpp \
|
||||
ir_dead_functions.cpp \
|
||||
ir_div_to_mul_rcp.cpp \
|
||||
ir_explog_to_explog2.cpp \
|
||||
ir_expression_flattening.cpp \
|
||||
ir_function_can_inline.cpp \
|
||||
ir_function.cpp \
|
||||
ir_function_inlining.cpp \
|
||||
ir_hierarchical_visitor.cpp \
|
||||
ir_hv_accept.cpp \
|
||||
ir_if_simplification.cpp \
|
||||
ir_if_to_cond_assign.cpp \
|
||||
ir_import_prototypes.cpp \
|
||||
ir_lower_jumps.cpp \
|
||||
ir_mat_op_to_vec.cpp \
|
||||
ir_mod_to_fract.cpp \
|
||||
ir_noop_swizzle.cpp \
|
||||
ir_print_visitor.cpp \
|
||||
ir_reader.cpp \
|
||||
ir_rvalue_visitor.cpp \
|
||||
ir_set_program_inouts.cpp \
|
||||
ir_structure_splitting.cpp \
|
||||
ir_sub_to_add_neg.cpp \
|
||||
ir_swizzle_swizzle.cpp \
|
||||
ir_tree_grafting.cpp \
|
||||
ir_validate.cpp \
|
||||
ir_variable.cpp \
|
||||
ir_variable_refcount.cpp \
|
||||
ir_vec_index_to_cond_assign.cpp \
|
||||
ir_vec_index_to_swizzle.cpp \
|
||||
linker.cpp \
|
||||
link_functions.cpp \
|
||||
loop_analysis.cpp \
|
||||
loop_controls.cpp \
|
||||
loop_unroll.cpp \
|
||||
lower_if_to_cond_assign.cpp \
|
||||
lower_instructions.cpp \
|
||||
lower_jumps.cpp \
|
||||
lower_mat_op_to_vec.cpp \
|
||||
lower_noise.cpp \
|
||||
lower_texture_projection.cpp \
|
||||
lower_variable_index_to_cond_assign.cpp \
|
||||
lower_vec_index_to_cond_assign.cpp \
|
||||
lower_vec_index_to_swizzle.cpp \
|
||||
lower_vector.cpp \
|
||||
opt_algebraic.cpp \
|
||||
opt_constant_folding.cpp \
|
||||
opt_constant_propagation.cpp \
|
||||
opt_constant_variable.cpp \
|
||||
opt_copy_propagation.cpp \
|
||||
opt_dead_code.cpp \
|
||||
opt_dead_code_local.cpp \
|
||||
opt_dead_functions.cpp \
|
||||
opt_function_inlining.cpp \
|
||||
opt_if_simplification.cpp \
|
||||
opt_noop_swizzle.cpp \
|
||||
opt_redundant_jumps.cpp \
|
||||
opt_structure_splitting.cpp \
|
||||
opt_swizzle_swizzle.cpp \
|
||||
opt_tree_grafting.cpp \
|
||||
s_expression.cpp
|
||||
|
||||
LIBS = \
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
# Copyright © 2010 Intel Corporation
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the "Software"),
|
||||
# to deal in the Software without restriction, including without limitation
|
||||
# on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
# license, and/or sell copies of the Software, and to permit persons to whom
|
||||
# the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice (including the next
|
||||
# paragraph) shall be included in all copies or substantial portions of the
|
||||
# Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
# AUTHORS, COPYRIGHT HOLDERS, AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign
|
||||
AM_CPPFLAGS = -I mesa
|
||||
|
||||
SUBDIRS = glcpp
|
||||
|
||||
bin_PROGRAMS = glsl
|
||||
|
||||
glsl_LDADD = ./glcpp/libglcpp.la
|
||||
glsl_LDFLAGS = @LDFLAGS@ $(talloc_LIBS)
|
||||
glsl_SOURCES = \
|
||||
main.cpp \
|
||||
builtin_types.h \
|
||||
glsl_types.cpp \
|
||||
glsl_parser.ypp glsl_lexer.lpp glsl_parser_extras.cpp \
|
||||
ast_expr.cpp ast_to_hir.cpp ast_function.cpp ast_type.cpp \
|
||||
ir.cpp hir_field_selection.cpp builtin_function.cpp \
|
||||
ir_print_visitor.cpp ir_variable.cpp ir_function.cpp \
|
||||
ir_basic_block.cpp \
|
||||
ir_basic_block.h \
|
||||
ir_clone.cpp \
|
||||
ir_constant_expression.cpp \
|
||||
ir_constant_folding.cpp \
|
||||
ir_constant_variable.cpp \
|
||||
ir_copy_propagation.cpp \
|
||||
ir_copy_propagation.h \
|
||||
ir_dead_code.cpp \
|
||||
ir_dead_code.h \
|
||||
ir_dead_code_local.cpp \
|
||||
ir_expression_flattening.cpp \
|
||||
ir_function_can_inline.cpp \
|
||||
ir_function_inlining.cpp \
|
||||
ir_if_simplification.cpp \
|
||||
ir_optimization.h \
|
||||
ir_reader.cpp s_expression.cpp \
|
||||
ir_hv_accept.cpp \
|
||||
ir_hierarchical_visitor.h \
|
||||
ir_hierarchical_visitor.cpp \
|
||||
ir_swizzle_swizzle.cpp \
|
||||
ir_to_mesa.cpp \
|
||||
ir_to_mesa.h \
|
||||
ir_validate.cpp \
|
||||
ir_vec_index_to_swizzle.cpp \
|
||||
linker.cpp \
|
||||
loop_analysis.cpp \
|
||||
loop_controls.cpp \
|
||||
loop_unroll.cpp \
|
||||
lower_noise.cpp \
|
||||
lower_variable_index_to_cond_assign.cpp \
|
||||
opt_redundant_jumps.cpp
|
||||
|
||||
BUILT_SOURCES = glsl_parser.h glsl_parser.cpp glsl_lexer.cpp
|
||||
CLEANFILES = $(BUILT_SOURCES)
|
||||
|
||||
builtin_function.cpp: builtins/*/*
|
||||
./builtins/tools/generate_builtins.pl > builtin_function.cpp
|
||||
glsl_parser.h: glsl_parser.cpp
|
||||
|
||||
.lpp.cpp:
|
||||
$(LEXCOMPILE) --outfile="$@" $<
|
||||
+21
-23
@@ -27,54 +27,52 @@ sources = [
|
||||
'glsl_types.cpp',
|
||||
'glsl_symbol_table.cpp',
|
||||
'hir_field_selection.cpp',
|
||||
'ir_algebraic.cpp',
|
||||
'ir_basic_block.cpp',
|
||||
'ir_clone.cpp',
|
||||
'ir_constant_expression.cpp',
|
||||
'ir_constant_folding.cpp',
|
||||
'ir_constant_propagation.cpp',
|
||||
'ir_constant_variable.cpp',
|
||||
'ir_copy_propagation.cpp',
|
||||
'ir.cpp',
|
||||
'ir_dead_code.cpp',
|
||||
'ir_dead_code_local.cpp',
|
||||
'ir_dead_functions.cpp',
|
||||
'ir_div_to_mul_rcp.cpp',
|
||||
'ir_explog_to_explog2.cpp',
|
||||
'ir_expression_flattening.cpp',
|
||||
'ir_function_can_inline.cpp',
|
||||
'ir_function.cpp',
|
||||
'ir_function_inlining.cpp',
|
||||
'ir_hierarchical_visitor.cpp',
|
||||
'ir_hv_accept.cpp',
|
||||
'ir_if_simplification.cpp',
|
||||
'ir_if_to_cond_assign.cpp',
|
||||
'ir_import_prototypes.cpp',
|
||||
'ir_lower_jumps.cpp',
|
||||
'ir_mat_op_to_vec.cpp',
|
||||
'ir_mod_to_fract.cpp',
|
||||
'ir_noop_swizzle.cpp',
|
||||
'ir_print_visitor.cpp',
|
||||
'ir_reader.cpp',
|
||||
'ir_rvalue_visitor.cpp',
|
||||
'ir_set_program_inouts.cpp',
|
||||
'ir_structure_splitting.cpp',
|
||||
'ir_sub_to_add_neg.cpp',
|
||||
'ir_swizzle_swizzle.cpp',
|
||||
'ir_tree_grafting.cpp',
|
||||
'ir_validate.cpp',
|
||||
'ir_variable.cpp',
|
||||
'ir_variable_refcount.cpp',
|
||||
'ir_vec_index_to_cond_assign.cpp',
|
||||
'ir_vec_index_to_swizzle.cpp',
|
||||
'linker.cpp',
|
||||
'link_functions.cpp',
|
||||
'loop_analysis.cpp',
|
||||
'loop_controls.cpp',
|
||||
'loop_unroll.cpp',
|
||||
'lower_if_to_cond_assign.cpp',
|
||||
'lower_instructions.cpp',
|
||||
'lower_jumps.cpp',
|
||||
'lower_mat_op_to_vec.cpp',
|
||||
'lower_noise.cpp',
|
||||
'lower_variable_index_to_cond_assign.cpp',
|
||||
'lower_vec_index_to_cond_assign.cpp',
|
||||
'lower_vec_index_to_swizzle.cpp',
|
||||
'lower_vector.cpp',
|
||||
'opt_algebraic.cpp',
|
||||
'opt_constant_folding.cpp',
|
||||
'opt_constant_propagation.cpp',
|
||||
'opt_constant_variable.cpp',
|
||||
'opt_copy_propagation.cpp',
|
||||
'opt_dead_code.cpp',
|
||||
'opt_dead_code_local.cpp',
|
||||
'opt_dead_functions.cpp',
|
||||
'opt_function_inlining.cpp',
|
||||
'opt_if_simplification.cpp',
|
||||
'opt_noop_swizzle.cpp',
|
||||
'opt_redundant_jumps.cpp',
|
||||
'opt_structure_splitting.cpp',
|
||||
'opt_swizzle_swizzle.cpp',
|
||||
'opt_tree_grafting.cpp',
|
||||
's_expression.cpp',
|
||||
]
|
||||
|
||||
|
||||
+14
-15
@@ -577,18 +577,17 @@ emit_inline_vector_constructor(const glsl_type *type,
|
||||
|
||||
const ir_constant *const c = param->as_constant();
|
||||
if (c == NULL) {
|
||||
/* Generate a swizzle in case rhs_components != rhs->type->vector_elements. */
|
||||
unsigned swiz[4] = { 0, 0, 0, 0 };
|
||||
for (unsigned i = 0; i < rhs_components; i++)
|
||||
swiz[i] = i;
|
||||
|
||||
/* Mask of fields to be written in the assignment.
|
||||
*/
|
||||
const unsigned write_mask = ((1U << rhs_components) - 1)
|
||||
<< base_component;
|
||||
|
||||
ir_dereference *lhs = new(ctx) ir_dereference_variable(var);
|
||||
ir_rvalue *rhs = new(ctx) ir_swizzle(param, swiz, rhs_components);
|
||||
|
||||
/* Generate a swizzle so that LHS and RHS sizes match.
|
||||
*/
|
||||
ir_rvalue *rhs =
|
||||
new(ctx) ir_swizzle(param, 0, 1, 2, 3, rhs_components);
|
||||
|
||||
ir_instruction *inst =
|
||||
new(ctx) ir_assignment(lhs, rhs, NULL, write_mask);
|
||||
@@ -628,21 +627,21 @@ assign_to_matrix_column(ir_variable *var, unsigned column, unsigned row_base,
|
||||
assert(column_ref->type->components() >= (row_base + count));
|
||||
assert(src->type->components() >= (src_base + count));
|
||||
|
||||
/* Generate a swizzle that puts the first element of the source at the
|
||||
* location of the first element of the destination.
|
||||
/* Generate a swizzle that extracts the number of components from the source
|
||||
* that are to be assigned to the column of the matrix.
|
||||
*/
|
||||
unsigned swiz[4] = { src_base, src_base, src_base, src_base };
|
||||
for (unsigned i = 0; i < count; i++)
|
||||
swiz[i + row_base] = i;
|
||||
|
||||
ir_rvalue *const rhs =
|
||||
new(mem_ctx) ir_swizzle(src, swiz, count);
|
||||
if (count < src->type->vector_elements) {
|
||||
src = new(mem_ctx) ir_swizzle(src,
|
||||
src_base + 0, src_base + 1,
|
||||
src_base + 2, src_base + 3,
|
||||
count);
|
||||
}
|
||||
|
||||
/* Mask of fields to be written in the assignment.
|
||||
*/
|
||||
const unsigned write_mask = ((1U << count) - 1) << row_base;
|
||||
|
||||
return new(mem_ctx) ir_assignment(column_ref, rhs, NULL, write_mask);
|
||||
return new(mem_ctx) ir_assignment(column_ref, src, NULL, write_mask);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -2636,8 +2636,7 @@ ast_jump_statement::hir(exec_list *instructions,
|
||||
state->current_function->function_name());
|
||||
}
|
||||
|
||||
ir_expression *const ret = (ir_expression *)
|
||||
opt_return_value->hir(instructions, state);
|
||||
ir_rvalue *const ret = opt_return_value->hir(instructions, state);
|
||||
assert(ret != NULL);
|
||||
|
||||
/* Implicit conversions are not allowed for return values. */
|
||||
|
||||
+194
-3002
File diff suppressed because one or more lines are too long
@@ -0,0 +1,21 @@
|
||||
((function acosh
|
||||
(signature float
|
||||
(parameters
|
||||
(declare (in) float x))
|
||||
((return (expression float log (expression float + (var_ref x) (expression float sqrt (expression float - (expression float * (var_ref x) (var_ref x)) (constant float (1)))))))))
|
||||
|
||||
(signature vec2
|
||||
(parameters
|
||||
(declare (in) vec2 x))
|
||||
((return (expression vec2 log (expression vec2 + (var_ref x) (expression vec2 sqrt (expression vec2 - (expression vec2 * (var_ref x) (var_ref x)) (constant vec2 (1)))))))))
|
||||
|
||||
(signature vec3
|
||||
(parameters
|
||||
(declare (in) vec3 x))
|
||||
((return (expression vec3 log (expression vec3 + (var_ref x) (expression vec3 sqrt (expression vec3 - (expression vec3 * (var_ref x) (var_ref x)) (constant vec3 (1)))))))))
|
||||
|
||||
(signature vec4
|
||||
(parameters
|
||||
(declare (in) vec4 x))
|
||||
((return (expression vec4 log (expression vec4 + (var_ref x) (expression vec4 sqrt (expression vec4 - (expression vec4 * (var_ref x) (var_ref x)) (constant vec4 (1)))))))))
|
||||
))
|
||||
@@ -0,0 +1,21 @@
|
||||
((function asinh
|
||||
(signature float
|
||||
(parameters
|
||||
(declare (in) float x))
|
||||
((return (expression float log (expression float + (var_ref x) (expression float sqrt (expression float + (expression float * (var_ref x) (var_ref x)) (constant float (1)))))))))
|
||||
|
||||
(signature vec2
|
||||
(parameters
|
||||
(declare (in) vec2 x))
|
||||
((return (expression vec2 log (expression vec2 + (var_ref x) (expression vec2 sqrt (expression vec2 + (expression vec2 * (var_ref x) (var_ref x)) (constant vec2 (1)))))))))
|
||||
|
||||
(signature vec3
|
||||
(parameters
|
||||
(declare (in) vec3 x))
|
||||
((return (expression vec3 log (expression vec3 + (var_ref x) (expression vec3 sqrt (expression vec3 + (expression vec3 * (var_ref x) (var_ref x)) (constant vec3 (1)))))))))
|
||||
|
||||
(signature vec4
|
||||
(parameters
|
||||
(declare (in) vec4 x))
|
||||
((return (expression vec4 log (expression vec4 + (var_ref x) (expression vec4 sqrt (expression vec4 + (expression vec4 * (var_ref x) (var_ref x)) (constant vec4 (1)))))))))
|
||||
))
|
||||
@@ -0,0 +1,37 @@
|
||||
((function atanh
|
||||
(signature float
|
||||
(parameters
|
||||
(declare (in) float x))
|
||||
((return (expression float * (constant float (0.5))
|
||||
(expression float log
|
||||
(expression float /
|
||||
(expression float + (constant float (1)) (var_ref x))
|
||||
(expression float - (constant float (1)) (var_ref x))))))))
|
||||
|
||||
(signature vec2
|
||||
(parameters
|
||||
(declare (in) vec2 x))
|
||||
((return (expression vec2 * (constant vec2 (0.5))
|
||||
(expression vec2 log
|
||||
(expression vec2 /
|
||||
(expression vec2 + (constant vec2 (1)) (var_ref x))
|
||||
(expression vec2 - (constant vec2 (1)) (var_ref x))))))))
|
||||
|
||||
(signature vec3
|
||||
(parameters
|
||||
(declare (in) vec3 x))
|
||||
((return (expression vec3 * (constant vec3 (0.5))
|
||||
(expression vec3 log
|
||||
(expression vec3 /
|
||||
(expression vec3 + (constant vec3 (1)) (var_ref x))
|
||||
(expression vec3 - (constant vec3 (1)) (var_ref x))))))))
|
||||
|
||||
(signature vec4
|
||||
(parameters
|
||||
(declare (in) vec4 x))
|
||||
((return (expression vec4 * (constant vec4 (0.5))
|
||||
(expression vec4 log
|
||||
(expression vec4 /
|
||||
(expression vec4 + (constant vec4 (1)) (var_ref x))
|
||||
(expression vec4 - (constant vec4 (1)) (var_ref x))))))))
|
||||
))
|
||||
@@ -1,7 +1,9 @@
|
||||
((function cross
|
||||
(signature vec3
|
||||
(parameters
|
||||
(declare (in) vec3 arg0)
|
||||
(declare (in) vec3 arg1))
|
||||
((return (expression vec3 cross (var_ref arg0) (var_ref arg1)))))
|
||||
(declare (in) vec3 a)
|
||||
(declare (in) vec3 b))
|
||||
((return (expression vec3 -
|
||||
(expression vec3 * (swiz yzx (var_ref a)) (swiz zxy (var_ref b)))
|
||||
(expression vec3 * (swiz zxy (var_ref a)) (swiz yzx (var_ref b)))))))
|
||||
))
|
||||
|
||||
@@ -62,7 +62,6 @@ vec2 tanh(vec2 x);
|
||||
vec3 tanh(vec3 x);
|
||||
vec4 tanh(vec4 x);
|
||||
|
||||
#if 0
|
||||
float asinh(float x);
|
||||
vec2 asinh(vec2 x);
|
||||
vec3 asinh(vec3 x);
|
||||
@@ -77,7 +76,6 @@ float atanh(float x);
|
||||
vec2 atanh(vec2 x);
|
||||
vec3 atanh(vec3 x);
|
||||
vec4 atanh(vec4 x);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 8.2 - Exponential Functions
|
||||
|
||||
@@ -62,7 +62,6 @@ vec2 tanh(vec2 x);
|
||||
vec3 tanh(vec3 x);
|
||||
vec4 tanh(vec4 x);
|
||||
|
||||
#if 0
|
||||
float asinh(float x);
|
||||
vec2 asinh(vec2 x);
|
||||
vec3 asinh(vec3 x);
|
||||
@@ -77,7 +76,6 @@ float atanh(float x);
|
||||
vec2 atanh(vec2 x);
|
||||
vec3 atanh(vec3 x);
|
||||
vec4 atanh(vec4 x);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 8.2 - Exponential Functions
|
||||
|
||||
@@ -29,12 +29,12 @@ def stringify(s):
|
||||
# rather than actual string literals.
|
||||
if len(s) >= 65535:
|
||||
#t = "/* Warning: length " + repr(len(s)) + " too large */\n"
|
||||
t = ""
|
||||
t = ""
|
||||
for c in re.sub('\s\s+', ' ', s):
|
||||
if c == '\n':
|
||||
t += '\n'
|
||||
t += '\n'
|
||||
else:
|
||||
t += "'" + c + "',"
|
||||
t += "'" + c + "',"
|
||||
return '{' + t[:-1] + '}'
|
||||
|
||||
t = s.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n"\n "')
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user