diff --git a/bindings/bf/bgfx.bf b/bindings/bf/bgfx.bf
index 7e22aa25f..fe1a2afd2 100644
--- a/bindings/bf/bgfx.bf
+++ b/bindings/bf/bgfx.bf
@@ -4247,25 +4247,25 @@ public static class bgfx
///
///
/// View id.
- /// Position x from the left corner of the window.
- /// Position y from the top corner of the window.
+ /// Position x from the left corner of the window. Can be negative to place view origin outside of the window.
+ /// Position y from the top corner of the window. Can be negative to place view origin outside of the window.
/// Width of view port region.
/// Height of view port region.
///
[LinkName("bgfx_set_view_rect")]
- public static extern void set_view_rect(ViewId _id, uint16 _x, uint16 _y, uint16 _width, uint16 _height);
+ public static extern void set_view_rect(ViewId _id, int16 _x, int16 _y, uint16 _width, uint16 _height);
///
/// Set view rectangle. Draw primitive outside view will be clipped.
///
///
/// View id.
- /// Position x from the left corner of the window.
- /// Position y from the top corner of the window.
+ /// Position x from the left corner of the window. Can be negative to place view origin outside of the window.
+ /// Position y from the top corner of the window. Can be negative to place view origin outside of the window.
/// Width and height will be set in respect to back-buffer size. See: `BackbufferRatio::Enum`.
///
[LinkName("bgfx_set_view_rect_ratio")]
- public static extern void set_view_rect_ratio(ViewId _id, uint16 _x, uint16 _y, BackbufferRatio _ratio);
+ public static extern void set_view_rect_ratio(ViewId _id, int16 _x, int16 _y, BackbufferRatio _ratio);
///
/// Set view scissor. Draw primitive outside view will be clipped. When
diff --git a/bindings/c3/bgfx.c3 b/bindings/c3/bgfx.c3
index 00bd61818..6ddd5ebc4 100644
--- a/bindings/c3/bgfx.c3
+++ b/bindings/c3/bgfx.c3
@@ -3042,18 +3042,18 @@ extern fn void set_view_name(ushort _id, ZString _name, int _len) @cname("bgfx_s
// Set view rectangle. Draw primitive outside view will be clipped.
// _id : `View id.`
-// _x : `Position x from the left corner of the window.`
-// _y : `Position y from the top corner of the window.`
+// _x : `Position x from the left corner of the window. Can be negative to place view origin outside of the window.`
+// _y : `Position y from the top corner of the window. Can be negative to place view origin outside of the window.`
// _width : `Width of view port region.`
// _height : `Height of view port region.`
-extern fn void set_view_rect(ushort _id, ushort _x, ushort _y, ushort _width, ushort _height) @cname("bgfx_set_view_rect");
+extern fn void set_view_rect(ushort _id, short _x, short _y, ushort _width, ushort _height) @cname("bgfx_set_view_rect");
// Set view rectangle. Draw primitive outside view will be clipped.
// _id : `View id.`
-// _x : `Position x from the left corner of the window.`
-// _y : `Position y from the top corner of the window.`
+// _x : `Position x from the left corner of the window. Can be negative to place view origin outside of the window.`
+// _y : `Position y from the top corner of the window. Can be negative to place view origin outside of the window.`
// _ratio : `Width and height will be set in respect to back-buffer size. See: `BackbufferRatio::Enum`.`
-extern fn void set_view_rect_ratio(ushort _id, ushort _x, ushort _y, BackbufferRatio _ratio) @cname("bgfx_set_view_rect_ratio");
+extern fn void set_view_rect_ratio(ushort _id, short _x, short _y, BackbufferRatio _ratio) @cname("bgfx_set_view_rect_ratio");
// Set view scissor. Draw primitive outside view will be clipped. When
// _x, _y, _width and _height are set to 0, scissor will be disabled.
diff --git a/bindings/cs/bgfx.cs b/bindings/cs/bgfx.cs
index 1428011aa..89df51b21 100644
--- a/bindings/cs/bgfx.cs
+++ b/bindings/cs/bgfx.cs
@@ -4197,25 +4197,25 @@ public static partial class bgfx
///
///
/// View id.
- /// Position x from the left corner of the window.
- /// Position y from the top corner of the window.
+ /// Position x from the left corner of the window. Can be negative to place view origin outside of the window.
+ /// Position y from the top corner of the window. Can be negative to place view origin outside of the window.
/// Width of view port region.
/// Height of view port region.
///
[DllImport(DllName, EntryPoint="bgfx_set_view_rect", CallingConvention = CallingConvention.Cdecl)]
- public static extern unsafe void set_view_rect(ushort _id, ushort _x, ushort _y, ushort _width, ushort _height);
+ public static extern unsafe void set_view_rect(ushort _id, short _x, short _y, ushort _width, ushort _height);
///
/// Set view rectangle. Draw primitive outside view will be clipped.
///
///
/// View id.
- /// Position x from the left corner of the window.
- /// Position y from the top corner of the window.
+ /// Position x from the left corner of the window. Can be negative to place view origin outside of the window.
+ /// Position y from the top corner of the window. Can be negative to place view origin outside of the window.
/// Width and height will be set in respect to back-buffer size. See: `BackbufferRatio::Enum`.
///
[DllImport(DllName, EntryPoint="bgfx_set_view_rect_ratio", CallingConvention = CallingConvention.Cdecl)]
- public static extern unsafe void set_view_rect_ratio(ushort _id, ushort _x, ushort _y, BackbufferRatio _ratio);
+ public static extern unsafe void set_view_rect_ratio(ushort _id, short _x, short _y, BackbufferRatio _ratio);
///
/// Set view scissor. Draw primitive outside view will be clipped. When
diff --git a/bindings/d/package.d b/bindings/d/package.d
index 9af53d296..03b2d22ba 100644
--- a/bindings/d/package.d
+++ b/bindings/d/package.d
@@ -9,7 +9,7 @@ import bindbc.common.types: c_int64, c_uint64, va_list;
import bindbc.bgfx.config;
static import bgfx.impl;
-enum uint apiVersion = 151;
+enum uint apiVersion = 152;
alias ViewID = ushort;
@@ -3347,23 +3347,27 @@ mixin(joinFnBinds((){
* Set view rectangle. Draw primitive outside view will be clipped.
Params:
id = View id.
- x = Position x from the left corner of the window.
- y = Position y from the top corner of the window.
+ x = Position x from the left corner of the window. Can be
+ negative to place view origin outside of the window.
+ y = Position y from the top corner of the window. Can be
+ negative to place view origin outside of the window.
width = Width of view port region.
height = Height of view port region.
*/
- {q{void}, q{setViewRect}, q{ViewID id, ushort x, ushort y, ushort width, ushort height}, ext: `C++, "bgfx"`},
+ {q{void}, q{setViewRect}, q{ViewID id, short x, short y, ushort width, ushort height}, ext: `C++, "bgfx"`},
/**
* Set view rectangle. Draw primitive outside view will be clipped.
Params:
id = View id.
- x = Position x from the left corner of the window.
- y = Position y from the top corner of the window.
+ x = Position x from the left corner of the window. Can be
+ negative to place view origin outside of the window.
+ y = Position y from the top corner of the window. Can be
+ negative to place view origin outside of the window.
ratio = Width and height will be set in respect to back-buffer size.
See: `BackbufferRatio::Enum`.
*/
- {q{void}, q{setViewRect}, q{ViewID id, ushort x, ushort y, bgfx.impl.BackbufferRatio.Enum ratio}, ext: `C++, "bgfx"`},
+ {q{void}, q{setViewRect}, q{ViewID id, short x, short y, bgfx.impl.BackbufferRatio.Enum ratio}, ext: `C++, "bgfx"`},
/**
* Set view scissor. Draw primitive outside view will be clipped. When
diff --git a/bindings/zig/bgfx.zig b/bindings/zig/bgfx.zig
index bfdd06536..a1738dfab 100644
--- a/bindings/zig/bgfx.zig
+++ b/bindings/zig/bgfx.zig
@@ -3351,24 +3351,24 @@ extern fn bgfx_set_view_name(_id: ViewId, _name: [*c]const u8, _len: i32) void;
/// Set view rectangle. Draw primitive outside view will be clipped.
/// View id.
-/// Position x from the left corner of the window.
-/// Position y from the top corner of the window.
+/// Position x from the left corner of the window. Can be negative to place view origin outside of the window.
+/// Position y from the top corner of the window. Can be negative to place view origin outside of the window.
/// Width of view port region.
/// Height of view port region.
-pub inline fn setViewRect(_id: ViewId, _x: u16, _y: u16, _width: u16, _height: u16) void {
+pub inline fn setViewRect(_id: ViewId, _x: i16, _y: i16, _width: u16, _height: u16) void {
return bgfx_set_view_rect(_id, _x, _y, _width, _height);
}
-extern fn bgfx_set_view_rect(_id: ViewId, _x: u16, _y: u16, _width: u16, _height: u16) void;
+extern fn bgfx_set_view_rect(_id: ViewId, _x: i16, _y: i16, _width: u16, _height: u16) void;
/// Set view rectangle. Draw primitive outside view will be clipped.
/// View id.
-/// Position x from the left corner of the window.
-/// Position y from the top corner of the window.
+/// Position x from the left corner of the window. Can be negative to place view origin outside of the window.
+/// Position y from the top corner of the window. Can be negative to place view origin outside of the window.
/// Width and height will be set in respect to back-buffer size. See: `BackbufferRatio::Enum`.
-pub inline fn setViewRectRatio(_id: ViewId, _x: u16, _y: u16, _ratio: BackbufferRatio) void {
+pub inline fn setViewRectRatio(_id: ViewId, _x: i16, _y: i16, _ratio: BackbufferRatio) void {
return bgfx_set_view_rect_ratio(_id, _x, _y, _ratio);
}
-extern fn bgfx_set_view_rect_ratio(_id: ViewId, _x: u16, _y: u16, _ratio: BackbufferRatio) void;
+extern fn bgfx_set_view_rect_ratio(_id: ViewId, _x: i16, _y: i16, _ratio: BackbufferRatio) void;
/// Set view scissor. Draw primitive outside view will be clipped. When
/// _x, _y, _width and _height are set to 0, scissor will be disabled.
diff --git a/docs/bgfx.rst b/docs/bgfx.rst
index 9e82f7226..c450d8551 100644
--- a/docs/bgfx.rst
+++ b/docs/bgfx.rst
@@ -252,8 +252,8 @@ A View's state is preserved between frames.
:members:
.. doxygenfunction:: bgfx::setViewName
-.. doxygenfunction:: bgfx::setViewRect(ViewId _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
-.. doxygenfunction:: bgfx::setViewRect(ViewId _id, uint16_t _x, uint16_t _y, BackbufferRatio::Enum _ratio)
+.. doxygenfunction:: bgfx::setViewRect(ViewId _id, int16_t _x, int16_t _y, uint16_t _width, uint16_t _height)
+.. doxygenfunction:: bgfx::setViewRect(ViewId _id, int16_t _x, int16_t _y, BackbufferRatio::Enum _ratio)
.. doxygenfunction:: bgfx::setViewScissor
.. doxygenfunction:: bgfx::setViewClear(ViewId _id, uint16_t _flags, uint32_t _rgba = 0x000000ff, float _depth = 1.0f, uint8_t _stencil = 0)
.. doxygenfunction:: bgfx::setViewClear(ViewId _id, uint16_t _flags, float _depth, uint8_t _stencil, uint8_t _c0 = UINT8_MAX, uint8_t _c1 = UINT8_MAX, uint8_t _c2 = UINT8_MAX, uint8_t _c3 = UINT8_MAX, uint8_t _c4 = UINT8_MAX, uint8_t _c5 = UINT8_MAX, uint8_t _c6 = UINT8_MAX, uint8_t _c7 = UINT8_MAX)
diff --git a/include/bgfx/bgfx.h b/include/bgfx/bgfx.h
index 9b437384a..e2aee243b 100644
--- a/include/bgfx/bgfx.h
+++ b/include/bgfx/bgfx.h
@@ -3743,8 +3743,10 @@ namespace bgfx
/// Set view rectangle. Draw primitive outside view will be clipped.
///
/// @param[in] _id View id.
- /// @param[in] _x Position x from the left corner of the window.
- /// @param[in] _y Position y from the top corner of the window.
+ /// @param[in] _x Position x from the left corner of the window. Can be
+ /// negative to place view origin outside of the window.
+ /// @param[in] _y Position y from the top corner of the window. Can be
+ /// negative to place view origin outside of the window.
/// @param[in] _width Width of view port region.
/// @param[in] _height Height of view port region.
///
@@ -3752,8 +3754,8 @@ namespace bgfx
///
void setViewRect(
ViewId _id
- , uint16_t _x
- , uint16_t _y
+ , int16_t _x
+ , int16_t _y
, uint16_t _width
, uint16_t _height
);
@@ -3761,8 +3763,10 @@ namespace bgfx
/// Set view rectangle. Draw primitive outside view will be clipped.
///
/// @param[in] _id View id.
- /// @param[in] _x Position x from the left corner of the window.
- /// @param[in] _y Position y from the top corner of the window.
+ /// @param[in] _x Position x from the left corner of the window. Can be
+ /// negative to place view origin outside of the window.
+ /// @param[in] _y Position y from the top corner of the window. Can be
+ /// negative to place view origin outside of the window.
/// @param[in] _ratio Width and height will be set in respect to back-buffer size.
/// See: `BackbufferRatio::Enum`.
///
@@ -3770,8 +3774,8 @@ namespace bgfx
///
void setViewRect(
ViewId _id
- , uint16_t _x
- , uint16_t _y
+ , int16_t _x
+ , int16_t _y
, BackbufferRatio::Enum _ratio
);
diff --git a/include/bgfx/c99/bgfx.h b/include/bgfx/c99/bgfx.h
index 56dc6598e..eab8d8eca 100644
--- a/include/bgfx/c99/bgfx.h
+++ b/include/bgfx/c99/bgfx.h
@@ -2570,25 +2570,29 @@ BGFX_C_API void bgfx_set_view_name(bgfx_view_id_t _id, const char* _name, int32_
* Set view rectangle. Draw primitive outside view will be clipped.
*
* @param[in] _id View id.
- * @param[in] _x Position x from the left corner of the window.
- * @param[in] _y Position y from the top corner of the window.
+ * @param[in] _x Position x from the left corner of the window. Can be
+ * negative to place view origin outside of the window.
+ * @param[in] _y Position y from the top corner of the window. Can be
+ * negative to place view origin outside of the window.
* @param[in] _width Width of view port region.
* @param[in] _height Height of view port region.
*
*/
-BGFX_C_API void bgfx_set_view_rect(bgfx_view_id_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height);
+BGFX_C_API void bgfx_set_view_rect(bgfx_view_id_t _id, int16_t _x, int16_t _y, uint16_t _width, uint16_t _height);
/**
* Set view rectangle. Draw primitive outside view will be clipped.
*
* @param[in] _id View id.
- * @param[in] _x Position x from the left corner of the window.
- * @param[in] _y Position y from the top corner of the window.
+ * @param[in] _x Position x from the left corner of the window. Can be
+ * negative to place view origin outside of the window.
+ * @param[in] _y Position y from the top corner of the window. Can be
+ * negative to place view origin outside of the window.
* @param[in] _ratio Width and height will be set in respect to back-buffer size.
* See: `BackbufferRatio::Enum`.
*
*/
-BGFX_C_API void bgfx_set_view_rect_ratio(bgfx_view_id_t _id, uint16_t _x, uint16_t _y, bgfx_backbuffer_ratio_t _ratio);
+BGFX_C_API void bgfx_set_view_rect_ratio(bgfx_view_id_t _id, int16_t _x, int16_t _y, bgfx_backbuffer_ratio_t _ratio);
/**
* Set view scissor. Draw primitive outside view will be clipped. When
@@ -4314,8 +4318,8 @@ struct bgfx_interface_vtbl
void (*set_palette_color_rgba32f)(uint8_t _index, float _r, float _g, float _b, float _a);
void (*set_palette_color_rgba8)(uint8_t _index, uint32_t _rgba);
void (*set_view_name)(bgfx_view_id_t _id, const char* _name, int32_t _len);
- void (*set_view_rect)(bgfx_view_id_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height);
- void (*set_view_rect_ratio)(bgfx_view_id_t _id, uint16_t _x, uint16_t _y, bgfx_backbuffer_ratio_t _ratio);
+ void (*set_view_rect)(bgfx_view_id_t _id, int16_t _x, int16_t _y, uint16_t _width, uint16_t _height);
+ void (*set_view_rect_ratio)(bgfx_view_id_t _id, int16_t _x, int16_t _y, bgfx_backbuffer_ratio_t _ratio);
void (*set_view_scissor)(bgfx_view_id_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height);
void (*set_view_clear)(bgfx_view_id_t _id, uint16_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil);
void (*set_view_clear_mrt)(bgfx_view_id_t _id, uint16_t _flags, float _depth, uint8_t _stencil, uint8_t _c0, uint8_t _c1, uint8_t _c2, uint8_t _c3, uint8_t _c4, uint8_t _c5, uint8_t _c6, uint8_t _c7);
diff --git a/include/bgfx/defines.h b/include/bgfx/defines.h
index 995e9bbed..b6b2b2a0f 100644
--- a/include/bgfx/defines.h
+++ b/include/bgfx/defines.h
@@ -15,7 +15,7 @@
#ifndef BGFX_DEFINES_H_HEADER_GUARD
#define BGFX_DEFINES_H_HEADER_GUARD
-#define BGFX_API_VERSION UINT32_C(151)
+#define BGFX_API_VERSION UINT32_C(152)
/**
* Color RGB/alpha/depth write. When it's not specified write will be disabled.
diff --git a/scripts/bgfx.idl b/scripts/bgfx.idl
index 63da2c904..5c2bcb728 100644
--- a/scripts/bgfx.idl
+++ b/scripts/bgfx.idl
@@ -1,12 +1,13 @@
-- vim: syntax=lua
-- bgfx interface
-version(151)
+version(152)
typedef "bool"
typedef "char"
typedef "float"
typedef "int8_t"
+typedef "int16_t"
typedef "int32_t"
typedef "int64_t"
typedef "uint8_t"
@@ -2303,8 +2304,10 @@ func.setViewName { section = "Views" }
func.setViewRect { section = "Views" }
"void"
.id "ViewId" --- View id.
- .x "uint16_t" --- Position x from the left corner of the window.
- .y "uint16_t" --- Position y from the top corner of the window.
+ .x "int16_t" --- Position x from the left corner of the window. Can be
+ --- negative to place view origin outside of the window.
+ .y "int16_t" --- Position y from the top corner of the window. Can be
+ --- negative to place view origin outside of the window.
.width "uint16_t" --- Width of view port region.
.height "uint16_t" --- Height of view port region.
@@ -2312,8 +2315,10 @@ func.setViewRect { section = "Views" }
func.setViewRect { cname = "set_view_rect_ratio", section = "Views" }
"void"
.id "ViewId" --- View id.
- .x "uint16_t" --- Position x from the left corner of the window.
- .y "uint16_t" --- Position y from the top corner of the window.
+ .x "int16_t" --- Position x from the left corner of the window. Can be
+ --- negative to place view origin outside of the window.
+ .y "int16_t" --- Position y from the top corner of the window. Can be
+ --- negative to place view origin outside of the window.
.ratio "BackbufferRatio::Enum" --- Width and height will be set in respect to back-buffer size.
--- See: `BackbufferRatio::Enum`.
diff --git a/scripts/bindings-bf.lua b/scripts/bindings-bf.lua
index 625f564d4..54e9fa319 100644
--- a/scripts/bindings-bf.lua
+++ b/scripts/bindings-bf.lua
@@ -58,6 +58,8 @@ local function convert_type_0(arg)
return arg.ctype:gsub("int32_t", "int32")
elseif hasPrefix(arg.ctype, "uint16_t") then
return arg.ctype:gsub("uint16_t", "uint16")
+ elseif hasPrefix(arg.ctype, "int16_t") then
+ return arg.ctype:gsub("int16_t", "int16")
elseif hasPrefix(arg.ctype, "uint8_t") then
return arg.ctype:gsub("uint8_t", "uint8")
elseif hasPrefix(arg.ctype, "uintptr_t") then
diff --git a/scripts/bindings-c3.lua b/scripts/bindings-c3.lua
index c04236e88..790a5e031 100644
--- a/scripts/bindings-c3.lua
+++ b/scripts/bindings-c3.lua
@@ -38,6 +38,8 @@ local function convert_type_0(arg)
return arg.ctype:gsub("int32_t", "int")
elseif hasPrefix(arg.ctype, "uint16_t") then
return arg.ctype:gsub("uint16_t", "ushort")
+ elseif hasPrefix(arg.ctype, "int16_t") then
+ return arg.ctype:gsub("int16_t", "short")
elseif hasPrefix(arg.ctype, "bgfx_view_id_t") then
return arg.ctype:gsub("bgfx_view_id_t", "ushort")
elseif hasPrefix(arg.ctype, "uint8_t") then
diff --git a/scripts/bindings-cs.lua b/scripts/bindings-cs.lua
index 3bc77b33e..4bee421cf 100644
--- a/scripts/bindings-cs.lua
+++ b/scripts/bindings-cs.lua
@@ -76,6 +76,8 @@ local function convert_type_0(arg)
return arg.ctype:gsub("int32_t", "int")
elseif hasPrefix(arg.ctype, "uint16_t") then
return arg.ctype:gsub("uint16_t", "ushort")
+ elseif hasPrefix(arg.ctype, "int16_t") then
+ return arg.ctype:gsub("int16_t", "short")
elseif hasPrefix(arg.ctype, "bgfx_view_id_t") then
return arg.ctype:gsub("bgfx_view_id_t", "ushort")
elseif hasPrefix(arg.ctype, "uint8_t") then
diff --git a/scripts/bindings-zig.lua b/scripts/bindings-zig.lua
index f717db1d9..a4acd80e2 100644
--- a/scripts/bindings-zig.lua
+++ b/scripts/bindings-zig.lua
@@ -65,6 +65,8 @@ local function convert_type_0(arg)
return arg.ctype:gsub("int32_t", "i32")
elseif hasPrefix(arg.ctype, "uint16_t") then
return arg.ctype:gsub("uint16_t", "u16")
+ elseif hasPrefix(arg.ctype, "int16_t") then
+ return arg.ctype:gsub("int16_t", "i16")
elseif hasPrefix(arg.ctype, "uint8_t") then
return arg.ctype:gsub("uint8_t", "u8")
elseif hasPrefix(arg.ctype, "uintptr_t") then
diff --git a/src/bgfx.cpp b/src/bgfx.cpp
index 8d4bd4d96..91e541a1f 100644
--- a/src/bgfx.cpp
+++ b/src/bgfx.cpp
@@ -1716,7 +1716,8 @@ namespace bgfx
}
}
- view.m_rect.intersect(rect);
+ view.m_clippedRect = view.m_rect;
+ view.m_clippedRect.intersect(rect);
if (!view.m_scissor.isZero() )
{
@@ -6072,13 +6073,13 @@ namespace bgfx
s_ctx->setViewName(_id, bx::StringView(_name, _len) );
}
- void setViewRect(ViewId _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
+ void setViewRect(ViewId _id, int16_t _x, int16_t _y, uint16_t _width, uint16_t _height)
{
BX_ASSERT(checkView(_id), "Invalid view id: %d", _id);
s_ctx->setViewRect(_id, _x, _y, _width, _height);
}
- void setViewRect(ViewId _id, uint16_t _x, uint16_t _y, BackbufferRatio::Enum _ratio)
+ void setViewRect(ViewId _id, int16_t _x, int16_t _y, BackbufferRatio::Enum _ratio)
{
BX_ASSERT(checkView(_id), "Invalid view id: %d", _id);
diff --git a/src/bgfx.idl.inl b/src/bgfx.idl.inl
index 46765222d..b71aea4f1 100644
--- a/src/bgfx.idl.inl
+++ b/src/bgfx.idl.inl
@@ -667,12 +667,12 @@ BGFX_C_API void bgfx_set_view_name(bgfx_view_id_t _id, const char* _name, int32_
bgfx::setViewName((bgfx::ViewId)_id, _name, _len);
}
-BGFX_C_API void bgfx_set_view_rect(bgfx_view_id_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
+BGFX_C_API void bgfx_set_view_rect(bgfx_view_id_t _id, int16_t _x, int16_t _y, uint16_t _width, uint16_t _height)
{
bgfx::setViewRect((bgfx::ViewId)_id, _x, _y, _width, _height);
}
-BGFX_C_API void bgfx_set_view_rect_ratio(bgfx_view_id_t _id, uint16_t _x, uint16_t _y, bgfx_backbuffer_ratio_t _ratio)
+BGFX_C_API void bgfx_set_view_rect_ratio(bgfx_view_id_t _id, int16_t _x, int16_t _y, bgfx_backbuffer_ratio_t _ratio)
{
bgfx::setViewRect((bgfx::ViewId)_id, _x, _y, (bgfx::BackbufferRatio::Enum)_ratio);
}
diff --git a/src/bgfx_p.h b/src/bgfx_p.h
index d0cf4eb82..f9790cb50 100644
--- a/src/bgfx_p.h
+++ b/src/bgfx_p.h
@@ -515,7 +515,7 @@ namespace bgfx
{
}
- Rect(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
+ Rect(int16_t _x, int16_t _y, uint16_t _width, uint16_t _height)
: m_x(_x)
, m_y(_y)
, m_width(_width)
@@ -557,7 +557,7 @@ namespace bgfx
;
}
- void set(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
+ void set(int16_t _x, int16_t _y, uint16_t _width, uint16_t _height)
{
m_x = _x;
m_y = _y;
@@ -567,14 +567,14 @@ namespace bgfx
void setIntersect(const Rect& _a, const Rect& _b)
{
- const uint16_t sx = bx::max(_a.m_x, _b.m_x);
- const uint16_t sy = bx::max(_a.m_y, _b.m_y);
- const uint16_t ex = bx::min(_a.m_x + _a.m_width, _b.m_x + _b.m_width );
- const uint16_t ey = bx::min(_a.m_y + _a.m_height, _b.m_y + _b.m_height);
- m_x = sx;
- m_y = sy;
- m_width = (uint16_t)bx::satSub(ex, sx);
- m_height = (uint16_t)bx::satSub(ey, sy);
+ const int32_t sx = bx::max(_a.m_x, _b.m_x);
+ const int32_t sy = bx::max(_a.m_y, _b.m_y);
+ const int32_t ex = bx::min(_a.m_x + _a.m_width, _b.m_x + _b.m_width );
+ const int32_t ey = bx::min(_a.m_y + _a.m_height, _b.m_y + _b.m_height);
+ m_x = int16_t(sx);
+ m_y = int16_t(sy);
+ m_width = uint16_t(bx::max(ex - sx, 0) );
+ m_height = uint16_t(bx::max(ey - sy, 0) );
}
void intersect(const Rect& _a)
@@ -582,8 +582,8 @@ namespace bgfx
setIntersect(*this, _a);
}
- uint16_t m_x;
- uint16_t m_y;
+ int16_t m_x;
+ int16_t m_y;
uint16_t m_width;
uint16_t m_height;
};
@@ -1725,8 +1725,8 @@ namespace bgfx
Rect& rect = m_cache[first];
- rect.m_x = _x;
- rect.m_y = _y;
+ rect.m_x = bx::narrowCast(_x);
+ rect.m_y = bx::narrowCast(_y);
rect.m_width = _width;
rect.m_height = _height;
@@ -2443,12 +2443,16 @@ namespace bgfx
setTransform(NULL, NULL);
}
- void setRect(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
+ void setRect(int16_t _x, int16_t _y, uint16_t _width, uint16_t _height)
{
- m_rect.m_x = uint16_t(bx::max(int16_t(_x), 0) );
- m_rect.m_y = uint16_t(bx::max(int16_t(_y), 0) );
+ m_rect.m_x = _x;
+ m_rect.m_y = _y;
m_rect.m_width = bx::max(_width, 1);
m_rect.m_height = bx::max(_height, 1);
+
+ // Frame::sort clips this against the render target. Default to
+ // unclipped, so it's never stale when sort didn't run.
+ m_clippedRect = m_rect;
}
void setScissor(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
@@ -2512,6 +2516,7 @@ namespace bgfx
Clear m_clear;
Rect m_rect;
+ Rect m_clippedRect;
Rect m_scissor;
Matrix4 m_view;
Matrix4 m_proj;
@@ -5886,8 +5891,8 @@ namespace bgfx
cmdbuf.write(_side);
cmdbuf.write(_mip);
Rect rect;
- rect.m_x = _x;
- rect.m_y = _y;
+ rect.m_x = bx::narrowCast(_x);
+ rect.m_y = bx::narrowCast(_y);
rect.m_width = _width;
rect.m_height = _height;
cmdbuf.write(rect);
@@ -6278,7 +6283,7 @@ namespace bgfx
cmdbuf.write(_name);
}
- BGFX_API_FUNC(void setViewRect(ViewId _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height) )
+ BGFX_API_FUNC(void setViewRect(ViewId _id, int16_t _x, int16_t _y, uint16_t _width, uint16_t _height) )
{
m_view[_id].setRect(_x, _y, _width, _height);
}
diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp
index f04ddd83b..89a582973 100644
--- a/src/renderer_d3d11.cpp
+++ b/src/renderer_d3d11.cpp
@@ -6156,10 +6156,11 @@ namespace bgfx { namespace d3d11
}
viewState.m_rect = _render->m_view[view].m_rect;
+ const Rect& clippedRect = _render->m_view[view].m_clippedRect;
const Rect& scissorRect = _render->m_view[view].m_scissor;
viewHasScissor = !scissorRect.isZero();
- viewScissorRect = viewHasScissor ? scissorRect : viewState.m_rect;
+ viewScissorRect = viewHasScissor ? scissorRect : clippedRect;
D3D11_VIEWPORT vp;
vp.TopLeftX = viewState.m_rect.m_x;
@@ -6173,7 +6174,7 @@ namespace bgfx { namespace d3d11
if (BGFX_CLEAR_NONE != (clr.m_flags & BGFX_CLEAR_MASK) )
{
- clearQuad(_clearQuad, viewState.m_rect, clr, _render->m_colorPalette);
+ clearQuad(_clearQuad, clippedRect, clr, _render->m_colorPalette);
prim = s_primInfo[Topology::Count]; // Force primitive type update after clear quad.
}
diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp
index e678db314..d3cda348b 100644
--- a/src/renderer_d3d12.cpp
+++ b/src/renderer_d3d12.cpp
@@ -7983,9 +7983,10 @@ namespace bgfx { namespace d3d12
viewState.m_rect = renderView.m_rect;
const Rect& rect = renderView.m_rect;
+ const Rect& clippedRect = renderView.m_clippedRect;
const Rect& scissorRect = renderView.m_scissor;
viewHasScissor = !scissorRect.isZero();
- viewScissorRect = viewHasScissor ? scissorRect : rect;
+ viewScissorRect = viewHasScissor ? scissorRect : clippedRect;
D3D12_VIEWPORT vp;
vp.TopLeftX = rect.m_x;
@@ -8008,8 +8009,8 @@ namespace bgfx { namespace d3d12
if (BGFX_CLEAR_NONE != clr.m_flags)
{
- Rect clearRect = rect;
- clearRect.setIntersect(rect, viewScissorRect);
+ Rect clearRect;
+ clearRect.setIntersect(clippedRect, viewScissorRect);
clearQuad(clearRect, clr, _render->m_colorPalette);
}
diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp
index 81099d10a..e125cf78c 100644
--- a/src/renderer_gl.cpp
+++ b/src/renderer_gl.cpp
@@ -7922,10 +7922,11 @@ namespace bgfx { namespace gl
profiler.begin(view);
viewState.m_rect = _render->m_view[view].m_rect;
+ const Rect& clippedRect = _render->m_view[view].m_clippedRect;
const Rect& scissorRect = _render->m_view[view].m_scissor;
viewHasScissor = !scissorRect.isZero();
- viewScissorRect = viewHasScissor ? scissorRect : viewState.m_rect;
+ viewScissorRect = viewHasScissor ? scissorRect : clippedRect;
GL_CHECK(glViewport(viewState.m_rect.m_x
, resolutionHeight-viewState.m_rect.m_height-viewState.m_rect.m_y
@@ -7938,7 +7939,7 @@ namespace bgfx { namespace gl
if (BGFX_CLEAR_NONE != (clear.m_flags & BGFX_CLEAR_MASK) )
{
- clearQuad(_clearQuad, viewState.m_rect, clear, resolutionHeight, _render->m_colorPalette);
+ clearQuad(_clearQuad, clippedRect, clear, resolutionHeight, _render->m_colorPalette);
}
GL_CHECK(glDisable(GL_STENCIL_TEST) );
diff --git a/src/renderer_mtl.cpp b/src/renderer_mtl.cpp
index 08c2570c3..bb128c60a 100644
--- a/src/renderer_mtl.cpp
+++ b/src/renderer_mtl.cpp
@@ -5334,9 +5334,10 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
if (!isCompute)
{
+ const Rect& clippedRect = _render->m_view[view].m_clippedRect;
const Rect& scissorRect = _render->m_view[view].m_scissor;
viewHasScissor = !scissorRect.isZero();
- viewScissorRect = viewHasScissor ? scissorRect : viewState.m_rect;
+ viewScissorRect = viewHasScissor ? scissorRect : clippedRect;
Clear& clr = _render->m_view[view].m_clear;
const Rect viewRect = viewState.m_rect;
@@ -5525,10 +5526,10 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
rce->setViewport(vp);
MTL::ScissorRect sciRect = {
- viewState.m_rect.m_x,
- viewState.m_rect.m_y,
- viewState.m_rect.m_width,
- viewState.m_rect.m_height
+ NS::UInteger(clippedRect.m_x),
+ NS::UInteger(clippedRect.m_y),
+ NS::UInteger(clippedRect.m_width),
+ NS::UInteger(clippedRect.m_height)
};
rce->setScissorRect(sciRect);
}
@@ -5536,7 +5537,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
if (BGFX_CLEAR_NONE != (clr.m_flags & BGFX_CLEAR_MASK)
&& !clearWithRenderPass)
{
- clearQuad(_clearQuad, viewState.m_rect, clr, _render->m_colorPalette);
+ clearQuad(_clearQuad, clippedRect, clr, _render->m_colorPalette);
}
}
}
@@ -5764,30 +5765,21 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
MTL::ScissorRect rc;
if (UINT16_MAX == scissor)
{
- if (viewHasScissor)
- {
- rc.x = viewScissorRect.m_x;
- rc.y = viewScissorRect.m_y;
- rc.width = viewScissorRect.m_width;
- rc.height = viewScissorRect.m_height;
- }
- else
- { // can't disable: set to view rect
- rc.x = viewState.m_rect.m_x;
- rc.y = viewState.m_rect.m_y;
- rc.width = viewState.m_rect.m_width;
- rc.height = viewState.m_rect.m_height;
- }
+ // Can't disable scissor, so it's set to view scissor rect.
+ rc.x = NS::UInteger(viewScissorRect.m_x);
+ rc.y = NS::UInteger(viewScissorRect.m_y);
+ rc.width = NS::UInteger(viewScissorRect.m_width);
+ rc.height = NS::UInteger(viewScissorRect.m_height);
}
else
{
Rect scissorRect;
scissorRect.setIntersect(viewScissorRect, _render->m_frameCache.m_rectCache.m_cache[scissor]);
- rc.x = scissorRect.m_x;
- rc.y = scissorRect.m_y;
- rc.width = scissorRect.m_width;
- rc.height = scissorRect.m_height;
+ rc.x = NS::UInteger(scissorRect.m_x);
+ rc.y = NS::UInteger(scissorRect.m_y);
+ rc.width = NS::UInteger(scissorRect.m_width);
+ rc.height = NS::UInteger(scissorRect.m_height);
}
rce->setScissorRect(rc);
diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp
index 4ec680262..80450d5e2 100644
--- a/src/renderer_vk.cpp
+++ b/src/renderer_vk.cpp
@@ -4619,11 +4619,13 @@ VK_IMPORT_DEVICE
void clearQuad(const Rect& _rect, const Clear& _clear, const float _palette[][4])
{
+ const Rect clearRect = _rect;
+
VkClearRect rect[1];
- rect[0].rect.offset.x = _rect.m_x;
- rect[0].rect.offset.y = _rect.m_y;
- rect[0].rect.extent.width = _rect.m_width;
- rect[0].rect.extent.height = _rect.m_height;
+ rect[0].rect.offset.x = clearRect.m_x;
+ rect[0].rect.offset.y = clearRect.m_y;
+ rect[0].rect.extent.width = clearRect.m_width;
+ rect[0].rect.extent.height = clearRect.m_height;
rect[0].baseArrayLayer = 0;
rect[0].layerCount = 1;
@@ -9719,32 +9721,19 @@ VK_DESTROY
VkRenderPass renderPass = fb.getRenderPass(_render->m_view[view].m_clear.m_flags);
viewState.m_rect = _render->m_view[view].m_rect;
- Rect rect = _render->m_view[view].m_rect;
+ const Rect& rect = _render->m_view[view].m_rect;
+ const Rect& renderArea = _render->m_view[view].m_clippedRect;
Rect scissorRect = _render->m_view[view].m_scissor;
viewHasScissor = !scissorRect.isZero();
- viewScissorRect = viewHasScissor ? scissorRect : rect;
+ viewScissorRect = viewHasScissor ? scissorRect : renderArea;
restoreScissor = false;
- // Clamp the rect to what's valid according to Vulkan.
- rect.m_width = bx::min(rect.m_width, bx::narrowCast(fb.m_width) - rect.m_x);
- rect.m_height = bx::min(rect.m_height, bx::narrowCast(fb.m_height) - rect.m_y);
- if (_render->m_view[view].m_rect.m_width != rect.m_width
- || _render->m_view[view].m_rect.m_height != rect.m_height)
- {
- BX_TRACE("Clamp render pass from %dx%d to %dx%d"
- , _render->m_view[view].m_rect.m_width
- , _render->m_view[view].m_rect.m_height
- , rect.m_width
- , rect.m_height
- );
- }
-
rpbi.framebuffer = fb.m_currentFramebuffer;
rpbi.renderPass = renderPass;
- rpbi.renderArea.offset.x = rect.m_x;
- rpbi.renderArea.offset.y = rect.m_y;
- rpbi.renderArea.extent.width = rect.m_width;
- rpbi.renderArea.extent.height = rect.m_height;
+ rpbi.renderArea.offset.x = renderArea.m_x;
+ rpbi.renderArea.offset.y = renderArea.m_y;
+ rpbi.renderArea.extent.width = renderArea.m_width;
+ rpbi.renderArea.extent.height = renderArea.m_height;
VkViewport vp;
vp.x = float(rect.m_x);
@@ -9861,8 +9850,8 @@ VK_DESTROY
const Clear& clr = _render->m_view[view].m_clear;
if (BGFX_CLEAR_NONE != clr.m_flags)
{
- Rect clearRect = rect;
- clearRect.setIntersect(rect, viewScissorRect);
+ Rect clearRect;
+ clearRect.setIntersect(renderArea, viewScissorRect);
clearQuad(clearRect, clr, _render->m_colorPalette);
}
diff --git a/src/renderer_webgpu.cpp b/src/renderer_webgpu.cpp
index f9f9f96c0..1d0ca67fe 100644
--- a/src/renderer_webgpu.cpp
+++ b/src/renderer_webgpu.cpp
@@ -4317,8 +4317,8 @@ WGPU_IMPORT
.mipLevel = _mip,
.origin =
{
- .x = _rect.m_x,
- .y = _rect.m_y,
+ .x = uint32_t(_rect.m_x),
+ .y = uint32_t(_rect.m_y),
.z = originZ,
},
.aspect = WGPUTextureAspect_All,
@@ -5949,21 +5949,21 @@ m_resolution.formatColor = TextureFormat::BGRA8;
;
viewState.m_rect = _render->m_view[view].m_rect;
- Rect viewRect = _render->m_view[view].m_rect;
+ const Rect& viewRect = _render->m_view[view].m_rect;
+ const Rect& clippedRect = _render->m_view[view].m_clippedRect;
Rect scissorRect = _render->m_view[view].m_scissor;
const Rect fbRect(0, 0, bx::narrowCast(fb.m_width), bx::narrowCast(fb.m_height) );
- viewRect.intersect(fbRect);
scissorRect.intersect(fbRect);
viewHasScissor = !scissorRect.isZero();
- viewScissorRect = viewHasScissor ? scissorRect : viewRect;
+ viewScissorRect = viewHasScissor ? scissorRect : clippedRect;
restoreScissor = false;
const Clear& clr = _render->m_view[view].m_clear;
const bool needClear = BGFX_CLEAR_NONE != ( (BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH|BGFX_CLEAR_STENCIL) & clr.m_flags);
- const bool clearWhole = viewRect.isEqual(fbRect);
+ const bool clearWhole = clippedRect.isEqual(fbRect);
WGPURenderPassColorAttachment colorAttachment[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
@@ -6083,13 +6083,13 @@ m_resolution.formatColor = TextureFormat::BGRA8;
if (!clearWhole && needClear)
{
- clearQuad(renderPassEncoder, fbh, msaaCount, _clearQuad, viewRect, clr, _render->m_colorPalette);
+ clearQuad(renderPassEncoder, fbh, msaaCount, _clearQuad, clippedRect, clr, _render->m_colorPalette);
}
wgpuRenderPassEncoderSetScissorRect(
renderPassEncoder
- , viewScissorRect.m_x
- , viewScissorRect.m_y
+ , uint32_t(viewScissorRect.m_x)
+ , uint32_t(viewScissorRect.m_y)
, viewScissorRect.m_width
, viewScissorRect.m_height
);
@@ -6440,8 +6440,8 @@ m_resolution.formatColor = TextureFormat::BGRA8;
wgpuRenderPassEncoderSetScissorRect(
renderPassEncoder
- , viewScissorRect.m_x
- , viewScissorRect.m_y
+ , uint32_t(viewScissorRect.m_x)
+ , uint32_t(viewScissorRect.m_y)
, viewScissorRect.m_width
, viewScissorRect.m_height
);
@@ -6459,8 +6459,8 @@ m_resolution.formatColor = TextureFormat::BGRA8;
wgpuRenderPassEncoderSetScissorRect(
renderPassEncoder
- , scissorRect.m_x
- , scissorRect.m_y
+ , uint32_t(scissorRect.m_x)
+ , uint32_t(scissorRect.m_y)
, scissorRect.m_width
, scissorRect.m_height
);